IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 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:

1
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 行左右代码

1
2
3
4
5
6
ifdef TARGET_SYSTEM_PROP
system_prop_file := $(TARGET_SYSTEM_PROP)
$(info TARGET_SYSTEM_PROP = $(TARGET_SYSTEM_PROP))
else
system_prop_file := $(wildcard $(TARGET_DEVICE_DIR)/system.prop)
endif

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

1
2
3
4
============================================
build/make/core/Makefile was modified, regenerating...
[ 99% 450/451] finishing build rules ...
TARGET_SYSTEM_PROP = build/make/target/board/gsi_system.prop

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

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

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

1
2
3
qiushao@qiushao-pc:~/source/android-10$ cat out/target/product/pure/system/build.prop  | grep ro.pure
ro.pure.version=1.0
qiushao@qiushao-pc:~/source/android-10$

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

虽然通过上面的方法可以将属性添加到 /system/build.prop,但在 Android9.0 之后,更推荐把厂家私有属性添加到 /vendor/build.prop 中。
通过 PRODUCT_PROPERTY_OVERRIDES 变量添加即可。编译系统会把 PRODUCT_PROPERTY_OVERRIDES 变量的值添加到 /vendor/build.prop 文件中去。
具体代码位置在编译系统的 build/make/core/Makefile 文件 476 行左右:

1
2
3
4
5
6
7
8
9
10
11
12
13
# -----------------------------------------------------------------
# vendor build.prop
#
# For verifying that the vendor build is what we think it is
INSTALLED_VENDOR_BUILD_PROP_TARGET := $(TARGET_OUT_VENDOR)/build.prop
ALL_DEFAULT_INSTALLED_MODULES += $(INSTALLED_VENDOR_BUILD_PROP_TARGET)

ifdef property_overrides_split_enabled
FINAL_VENDOR_BUILD_PROPERTIES += \
    $(call collapse-pairs, $(PRODUCT_PROPERTY_OVERRIDES))
FINAL_VENDOR_BUILD_PROPERTIES := $(call uniq-pairs-by-first-component, \
    $(FINAL_VENDOR_BUILD_PROPERTIES),=)
endif  # property_overrides_split_enabled

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

1
2
3
4
PRODUCT_PROPERTY_OVERRIDES += \
    ro.vendor.pure.name=qiushao \
    persist.vendor.pure.name=qiushao \
    vendor.pure.name=qiushao

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

1
2
3
4
5
qiushao@qiushao-pc:~/source/android-10$ cat out/target/product/pure/vendor/build.prop | grep pure.name
ro.vendor.pure.name=qiushao
persist.vendor.pure.name=qiushao
vendor.pure.name=qiushao
qiushao@qiushao-pc:~/source/android-10$

虚拟机验证

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
pure:/ # getprop ro.pure.version 
1.0
pure:/ # getprop ro.vendor.pure.name
qiushao
pure:/ # getprop persist.vendor.pure.name 
qiushao
pure:/ # getprop vendor.pure.name 
qiushao
pure:/ # setprop ro.pure.version 2.0 
setprop: failed to set property 'ro.pure.version' to '2.0'
pure:/ # setprop persist.vendor.pure.name shaoqiu
pure:/ # setprop vendor.pure.name shaoqiu
pure:/ # getprop persist.vendor.pure.name
shaoqiu
pure:/ # getprop vendor.pure.name
shaoqiu
pure:/ # reboot

我们先用 getprop 命令读取了我们添加的属性,都可以正常读取。
然后我们尝试用 setprop 命令改写属性的值, 发现 ro 前缀的属性改写失败了,其他属性可以改写成功。
然后我们重启一下系统再重新读取:

1
2
3
4
5
pure:/ # getprop persist.vendor.pure.name
shaoqiu
pure:/ # getprop vendor.pure.name
qiushao
pure:/ #
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-07-29 11:46:00  更:2021-07-29 11:47:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/2 11:23:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码