Android系统 设置系统属性值调试技巧

Android系统的属性值总体分为两大类型:prop与settings。

一,prop

prop分为好几种,一种是系统自带的一些,一种是我们自己定义的。

1.系统自带

一般这些prop最终都会在系统的build.prop文件中:

/default.prop
/system/build.prop
/system/default.prop(该文件不一定存在)
/data/local.prop
/data/property目录里的若干脚本

以 ro 开头的属性都是只读属性,由于ro属性是不可改的,比如/default.prop是不能直接编辑的,即使修改了重启也会还原;那么如何修改ro属性呢?常规方式是修改源码重烧固件。优雅的方式就无需烧固件了,可使用 mpro ,通过进程注入的方式来修改。

以 persist 开头的属性,一般都是从 /data/property 目录中加载的。

2.自己定义

prop 的初始化都在 device 下的 mk 文件中,使用 PRODUCT_PROPERTY_OVERRIDES 进行配置

例如(rk3568):
device/rockchip/rk356x/device.mk文件下

PRODUCT_PROPERTY_OVERRIDES += \
    ro.sf.hwrotation=0 \
    ro.sf.lcd_density=160

3.设置prop的三种方式

  • shell:(直接使用bin文件)

    getprop key //获取状态值
    setprop key value //设置状态值

  • Java:(使用api)

    SystemProperties.get(key,defaultValue);
    SystemProperties.set(key,value);

  • C/C++:(使用api)

    getProperty(key, defaultValue)
    setProperty(key, value)

4.权限

只有权限通过以后才能set,而get没有权限检查。

扫描二维码关注公众号,回复: 15980196 查看本文章
if (uid == AID_SYSTEM || uid == AID_ROOT)
    return check_control_mac_perms(name, sctx);

当开启 SELinux 后,将会对每个 key 进行权限检查。

system/sepolicy:grep -rn ro.serialno
private/property_contexts:66:ro.serialno    u:object_r:serialno_prop:s0

system/sepolicy:grep -rn serialno_prop
private/adbd.te:68:get_prop(adbd, serialno_prop
public/shell.te:85:get_prop(shell, serialno_prop)
private/system_server.te:534:get_prop(system_server, serialno_prop)
...

二,settings

1.settings的使用方式

在这里插入图片描述

当我们操作SystemUI以及Settings的某个开关后,如何查询是哪个key被修改了呢?

settings list system > 1 && settings list secure >> 1 && settings list global >> 1
settings list system > 2 && settings list secure >> 2 && settings list global >> 2
diff 1 2
在这里插入图片描述

3.在源码中搜索该key

frameworks/base$ grep -rn "airplane_mode_on"

在这里插入图片描述
此处三个文件,展示了首次开机时,是如何初始化一个 key。

4.如果没有预设默认值,那么可以通过以下方式查询key所属的namespace

在这里插入图片描述

5.如果需要每次开机都对key进行重置,显然以上方式是不行的,看下如下代码:

  • 方式一:
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
public void start(){
    
    
         ...
 +        Settings.System.putInt(mContext.getContentResolver(),
 +                                Settings.System.AIRPLANE_MODE_ON, 1);
}
  • 方式二:
diff --git a/device/rockchip/rk356x/init.rk356x.rc b/device/rockchip/rk356x/init.rk356x.rc
index 3ac764c0b3..bca54d8d35 100644
--- a/device/rockchip/rk356x/init.rk356x.rc
+++ b/device/rockchip/rk356x/init.rk356x.rc
@@ -6,6 +6,7 @@ on property:sys.boot_completed=1
     chmod 0664 /sys/class/devfreq/ff400000.gpu/governor
     chmod 0664 /sys/class/devfreq/ff400000.gpu/min_freq
     chmod 0664 /sys/class/devfreq/ff400000.gpu/max_freq
 +    settings put system airplane_mode_on 1

可以使用shell脚本处理复杂的命令

+service testsh /vendor/bin/test.sh
+oneshot
+
+on property:sys.boot_completed=1
+start testsh

猜你喜欢

转载自blog.csdn.net/weixin_45639314/article/details/131552147
今日推荐