[Android 基础] -- Android 添加系统属性

        在 Android 系统中有一个 Property Service 服务,这个服务对外提供了两个接口:

  • SystemProperties.get(String key, String def) 读取系统属性
  • SystemProperties.set(String key, String val) 设置系统属性

        有两个命令行对这两个接口进行了封装,我们可以直接在 adb shell 中输入:

  • getprop key 读取系统属性
  • setprop key val 设置系统属性

        系统属性可以简单的理解为系统层级的全局变量,以 key-value 的形式保存,key-value 都是字符串。

        这些属性可能是有些资源的使用状态,进程的执行状态,系统的特有属性等。

        本文不会去分析系统属性服务的构架眼里之类的东西,这些东西后面有时间再整理。这里先从编译系统的角度介绍应该怎么添加一个系统属性。比如增加一个系统版本号信息。

特殊前缀属性

  • ro:只读属性,不能修改。
  • persist:修改属性后,重启依然有效。数据会保存到 /data/property 目录。其他前缀的属性被设置后,只是保存在内存中而已,并没有保存到磁盘,所有重启后就恢复默认值了。
  • ctrl:用来启动和停止服务。每一项服务必须在 init.rc 中定义。init 一旦收到设置 ctrl.start 属性的请求,属性服务将使用该属性值作为服务名找到该服务,启动该服务。这项服务的启动结果将会放入 init.svc.<服务名> 属性中。

系统属性默认值配置文件

        系统启动的时候会从几个配置文件中加载属性的默认值,大概有以下几个文件,在不同 Android 版本系统上可能不一样:

  • /default.prop 或者是 /prop.default
  • /vendor/default.prop
  • /system/build.prop
  • /vendor/build.prop
  • /data/local.prop
  • /data/property/*

        系统会按先后顺序依次加载以上文件,后加载的属性将覆盖原先的值。

        default.prop 的值是通过 build/tools 目录下的 buildinfo.sh 和 vendor_buildinfo.sh 生成的。

        要修改的话,就要修改编译系统了,这种方法不好维护,不推荐。一般来说我们可以把属性加到 /system/build.prop 或者 /vendor/build.prop。

添加系统属性到 /system/build.prop

        只要在 $(TARGET_DEVICE_DIR) 目录创建一个 system.prop 文件,在里面添加属性即可。编译系统会把 $(TARGET_DEVICE_DIR)/system.prop 添加到 /system/build.prop 文件中去。在 device/pure 目录下添加文件 system.prop:

ro.pure.version=1.0

        然后冲洗编译系统,编译完之后查看 out/target/product/pure/system/build.prop 文件,发现并没有我们添加的属性。

        原来在 Android 9.0 之后,google 不推荐把厂家定制的 property 加到 /system 分区了。

        只是在 device/pure 目录下添加 system.prop 文件时没有作用的。

        具体原因见 build/make/core/Makefile 391 行左右代码:

ifdef TARGET_SYSTEM_PROP
    system_prop_file := $(TARGET_SYSTEM_PROP)
    $(info TARGET_SYSTEM_PROP = $(TARGET_SYSTEM_PROP))
else
    system_prop_file := $(wildcard $(TARGET_DEVCIE_DIR)/system.prop)
endif

        我们在这里加了个 log,然后编译系统,发现 TARGET_SYSTEM_PROP 已经定义过了:

         因此,如果我们一定要把属性加到 /system/build.prop 的话,还需要在 device/qiushao/pure/BoardConfig.mk 添加以下配置才可以:

TARGET_SYSTEM_PROP += device/qiushao/pure/system.prop

        添加之后,重新编译,再查看 out/target/product/pure/system/build.prop 文件,发现我们添加的属性已经在里面了:

 添加系统属性到 /vendor/build.prop

        虽然通过上面的方法可以将属性添加到 /system/build.prop,但在 Android9.0 之后,更推荐把厂家私有属性添加到 /vendor/build.prop 中。

        通过 PRODUCT_PROPERTY_OVERRIDES 变量添加即可。编译系统会把 PRODUCT_PROPERTY_OVERRIDES 变量的值添加到 /vendor/build.prop 文件中去。

        具体代码位置在 编译系统的 build/make/Makefile 文件 476 行左右:

         在 device/qiushao/pure/pure.mk 中添加以下配置:

         然后重新编译系统,查看 out/target/pruduct/pure/vendor/build.prop 发现属性已经添加进去了。

虚拟机验证

        启动虚拟机后,再另外启动一个终端使用 adb shell:

         我们先用 getprop 命令读取了我们添加的属性,都可以正常读取。

        然后我们尝试用 setprop 命令改写属性的值,发现 ro 前缀的属性改写失败了,其他属性可以改写成功。

        然后我们重启系统再重新读取:

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值