Android 11.0 动态修改SystemProperties中ro开头系统属性的值

文章讲述了在Android11.0版本中,针对系统属性特别是ro开头的只读属性进行修改的需求。由于系统从10.0开始增强了安全性,不允许修改ro属性。文中详细分析了`SystemProperties.java`和`property_service.cpp`中的关键代码,指出`PropertySet`函数中对ro属性的检查和处理。为了允许修改,提出了注释掉相关检查代码的解决方案。

需求: 在11.0的产品开发中,对于定制功能的需求很多,有些机型要求可以修改系统属性值,对于系统本身在10.0以后为了系统安全性,不允许修改ro开头的SystemProperties的值,所以如果要求修改ro的相关系统属性,就得看在设置SystemProperties的相关值的要求,修改这部分要求就可以了

  1. 动态修改SystemProperties中ro开头系统属性的值的核心代码

  frameworks/base/core/java/android/os/SystemProperties.java
  /system/core/init/property_service.cpp

2.动态修改SystemProperties中ro开头系统属性的值的功能分析和实现功能

2.1 关于系统属性SystemProperty分析

系统属性,肯定对整个系统全局共享。通常程序的执行以进程为单位各自相互独立,如何实现全局共享呢?属性系统是android的一个重要特性。它作为一个服务运行,管理系统配置和状态。所有这些配置和状态都是属性。SystemProperties.java每个属性是一个键值对(key/value pair),其类型都是字符串

接下来看下SystemProperties.java相关方法

 
    private static native String native_get(String key);
    private static native String native_get(String key, String def);
    private static native int native_get_int(String key, int def);
    @UnsupportedAppUsage
    private static native long native_get_long(String key, long def);
    private static native boolean native_get_boolean(String key, boolean def);
    private static native void native_set(String key, String def);
 
    /**
     * Get the String value for the given {@code key}.
     *
     * @param key the key to lookup
     * @param def the default value in case the property is not set or empty
     * @return if the {@code key} isn't found, return {@code def} if it isn't null, or an empty
     * string otherwise
     * @hide
     */
    @NonNull
    @SystemApi
    @TestApi
    public static String get(@NonNull String key, @Nullable String def) {
        if (TRACK_KEY_ACCESS) onKeyAccess(key);
  
Android 11.0 (API级别30) 允许开发者更深入地自定义系统界面,包括status bar(状态栏)和navigation drawer(导航抽屉)。对于自定义下拉框布局,通常是在创建system UI overlay时操作,例如设置快捷开关或者应用主题切换。 要在Android 11中自定义status bar 下拉菜单(比如音量控制),你需要: 1. **权限管理**:首先,需要在`AndroidManifest.xml`中添加`<uses-permission>`标签,请求`SYSTEM_ALERT_WINDOW`权限,允许应用显示在其他应用之上。 ```xml <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> ``` 2. **创建视图**:在你的Activity或Fragment中,创建一个View对象,可以是一个`LinearLayout`、`PopupMenu`或者自定义的`PopupWindow`实例,并设置所需的布局。 ```java View statusBarView = LayoutInflater.from(context).inflate(R.layout.status_bar_dropdown, null); statusBarView.setOnTouchListener(new View.OnTouchListener() { // 处理触摸事件 }); ``` 3. **添加到system UI**:使用`WindowManager.LayoutParams`将你的视图添加到系统窗口栈上。记得设置`flags`属性以指定是否覆盖其他系统UI元素。 ```java WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams( WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, PixelFormat.TRANSLUCENT ); layoutParams.gravity = Gravity.TOP | Gravity.END; // 根据需求调整位置 WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); windowManager.addView(statusBarView, layoutParams); ``` 4. **处理交互**:在`OnTouchListener`中处理用户对下拉框的触碰和滑动事件,以及关闭弹出框的操作。 5. **注意兼容性和适配**:确保你的自定义布局在各种设备和配置下都能正常工作,并且遵守Material Design规范。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值