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没有权限检查。
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