Android 系统属性的增加和操作

本文详细介绍了如何在Android系统源码中添加自定义的系统属性`persist.dev.sensor_power`,并通过编译刷机进行验证。此外,还展示了通过Java和C/C++代码读写该属性的方法,并提供了相应的代码示例。最后,提到了系统属性在Android源码中的广泛使用。

1、在参与编译生成 .prop文件的系统源码中添加定义 系统属性。
例如,default.prop文件参与编译:
/vendor/qcom/proprietary/qrdplus/Extension/config/default.prop

--- a/vendor/qcom/proprietary/qrdplus/Extension/config/default.prop
+++ b/vendor/qcom/proprietary/qrdplus/Extension/config/default.prop
@@ -23,6 +23,8 @@ persist.dbg.vt_avail_ovr=1
 persist.radio.videopause.mode=1
 persist.data.iwlan.enable=true
 persist.dbg.wfc_avail_ovr=1
+persist.dev.sensor_power=0

添加,系统属性:persist.dev.sensor_power

2、进行源码编译,刷机验证:

redkeyset@redkeyset-polytide:~/work/androidOs/android-msm8909$ adb shell
msm8909:/ $ getprop persist.dev.sensor_power                                                                                                                                                               
0
msm8909:/ $ setprop persist.dev.sensor_power 1                                                                                                                                                             
msm8909:/ $ getprop persist.dev.sensor_power                                                                                                                                                               
1

通过adb命令,验证新添加系统属性,可读可写。

3、通过Java代码操作:
在系統源碼中:

import android.os.SystemProperties;
SystemProperties.get(key, def_value);
SystemProperties.set(key, value);

在應用層:

public final class ReflectUtil {
    public static String getProperty(String key, String defaultValue) {
        String value = defaultValue;
        try {
            Class<?> c = Class.forName("android.os.SystemProperties");
            Method get = c.getMethod("get", String.class, String.class);
            value = (String)(get.invoke(c, key, defaultValue));
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            return value;
        }
    }

    public static void setProperty(String key, String value) {
        try {
            Class<?> c = Class.forName("android.os.SystemProperties");
            Method set = c.getMethod("set", String.class, String.class);
            set.invoke(c, key, value);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

4、通过C或C++代码操作:

#include <cutils/properties.h>
property_get("persist.dev.sensor_power", 0);
property_set("persist.dev.sensor_power", 1);

在Android.mk里添加libcutils库
LOCAL_STATIC_LIBRARIES :=libcutils
或者LOCAL_SHARED_LIBRARIES :=libcutils

通過搜索系統源碼,可知系統中多處用到對系統屬性的操作。

### 如何在 Android 11 中添加或修改系统属性 #### 使用 Java 代码操作 为了在应用程序中获取或设置系统属性,可以利用 `SystemProperties` 类。此方法适用于读取写入特定键值对形式的系统配置项。 ```java import android.os.SystemProperties; // 获取指定 key 的系统属性,默认返回 def_value 如果未找到该 key 对应的值 String value = SystemProperties.get("key", "def_value"); // 设置新的 system 属性 SystemProperties.set("key", "value"); ``` 需要注意的是,上述方式仅限于具有适当权限的应用程序调用[^1]。由于安全性稳定性考虑,普通应用无法随意更改重要的系统参数;通常这些接口由设备制造商或者经过授权的服务使用。 #### 修改 build.prop 文件 另一种常见的做法是在启动过程中通过编辑 `/system/build.prop` 文件来定义额外的静态属性。不过这种方法一般只用于开发调试环境或是ROM定制者,在正式发布的版本里不推荐这样做因为这可能会引起兼容性问题以及违反Google的安全政策。 要永久保存自定义属性,则需确保编译阶段就把它们加入到最终镜像当中去。具体来说就是在 AOSP (Android Open Source Project) 源码树下的合适位置创建相应的 `.prop` 配置文件并调整 Makefile 来包含新条目。 对于希望动态改变某些行为而不影响其他组件的情况下,还可以采用 Environment 变量的形式传递给子进程继承使用,但这同样依赖于具体的业务场景设计。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值