我们在开发过程中有时需要使用系统属性,例如获取系统软件版本,获取设备名名称等,有时也需要设置自定义属性。本文将基于Android 10(Q)介绍Android系统属性(以下简称prop)使用,下文围绕以下几点展开介绍:
- prop的作用,如何调试和使用?
- prop实现原理,代码流程,prop存储在哪里,何时init?
- 如何添加自定义prop?
- 使用注意事项。
系统属性简单来说是用来存储系统中某些数据,具有全局性、存取灵活方便的特点,因此广泛用于android系统的各个层级。
一、终端prop命令
在终端设备中,可以通过以下命令进行prop调试。
1.1、查看prop
讯享网1.2、设置prop
讯享网
1.3、监听prop
显示属性值发生变化的值
1.4 常用prop
1.5、init.rc 监听prop
system/core/rootdir/init.rc
讯享网
二、get和set prop代码流程
2.1、get和set prop代码流程图
涉及的代码路径汇总如下:
代码流程整体时序图如下:
(:流程图android_os_SystemProperties.cpp->properties.cpp 笔误,应为)

系统属性架构设计如下:

2.2、代码流程介绍
2.2.1、set prop流程
bioniclibcbionicsystem_property_set.cpp
java基础程序代码流程图
2.2.2、属***(property_service)
流程到了这里会发现,最终需要通过Socket与property_service来通信进行设置属性值,那么问题来了:
- property_service是谁创建的?
- property_service是怎么启动的?
- property_service是如何setprop的?
熟悉Android开机流程的同学会马上联想到init进程,property_service正是init进程来初始化和启动的。
systemcoreinitinit.cpp
2.2.3、属性初始化
systemcoreinitproperty_service.cpp
bioniclibcbionicsystem_property_api.cpp
bioniclibcsystem_propertiescontexts_serialized.cpp
2.2.4、加载开机默认属性配置
2.2.5、启动属***
2.2.6、更新和添加属性
bioniclibcbionicsystem_property_api.cpp
bioniclibcsystem_propertiessystem_properties.cpp
bioniclibcsystem_propertiesprop_area.cpp
从上述code可分析出设置属性流程中根据所设置的属性值是否存在分别走update()和add()流程,而add 最后调用查找属性方法,如果不存在则新建共享内存节点,将prop_info存入。自此,set prop流程结束。
2.2.7、get prop流程
bioniclibcsystem_propertiessystem_properties.cpp
bioniclibcsystem_propertiesprop_area.cpp
find_property后续流程同2.2.6小节。

三、代码中使用属性
在上一章节中详细介绍了获取和设置属性的代码流程,但仍有部分问题仍待解决:
- 2.2.4小节中build.prop、default.prop在哪里生成的,如何打包进系统
- 如何添加自定义hello.prop
- 如何添加系统级默认属性
- prop有哪些类型,不同前缀有什么区别
上述疑问先保留一点神秘感,稍后介绍,先介绍在java、C++代码中如何使用属性
3.1、java代码中使用prop
由于SystemProperties.java的API为系统API,普通应用无法直接使用,可以通过反射来get和set prop。
获取属性值可以根据值的类型使用合适返回值类型的方法如getInt()、getBoolean()、getLong(),SystemProperties.get()获取的值为String。
3.2、C++代码中使用prop
在C++代码中使用prop需要:
- include <cutils/properties.h>
- Android.mk或Android.bp或Makefile中需要链接libcutils库
frameworksavmedialibstagefrightAndroid.bp
3.3、特殊属性
从2.2.5小节中可以看到有些属性比较特殊,特总结如下:
3.3.1、 ro只读属性
ro即read only这类属性通常是系统默认属性,在系统编译或初始化时设置的。
3.3.2、persist持久属性
设置persist开头的属性,断电后仍能保存,值写入data/property/persistent_properties。
3.3.3、ctl 控制属性
3.3.4、sys.powerctl属性
sys.powerctl属性可控制设备重启关机
3.3.5、普通属性
设置其他格式开头的属性,断电后不能保存
3.4、添加系统默认属性
四、prop打包
我们已经知道如何添加系统默认属性,但项目中有许多*.prop配置文件,
- 这些文件是如何最终打包至out/tartget/product/…/build.prop的呢?
- 为了便于客制化属性管控,如何添加自己的prop配置文件呢?
本章将围绕上面两个问题进行介绍
4.1、prop打包流程
build.prop是在代码编译时,build/core/Makefile完成打包的
build/make/tools/buildinfo.sh中配置了系统编译常见信息,具体如下
经过Makefile,将系统中各种prop配置文件合并生成在out指定路径下。
也是在Makefile中将各路径下build.prop随系统分区一同打包进img,out argetproductxxxsystembuild.prop打包进system.img
out argetproductxxxvendorbuild.prop打包进vendor.img
五、添加定制hello.prop
涉及的代码路径汇总如下:
为了方便统一管理定制化属性,有时会将定制化属性都写在定制的.prop文件中,下面以添加hello.prop为例说明添加过程。
5.1、device下添加hello.prop
device/qcom/qssi/hello.prop
5.2 配置预置路径
5.3、SELinux权限配置
详细SELinux介绍和配置可参考Android SELinux权限概念和配置说明
5.4、配置hello.prop权限
此步骤可省略,若未配置读写权限,默认system/prop为644
这里配置与system/build.prop相同的600权限
system/core/rootdir/init.rc
5.5、load hello.prop
5.6、验证hello.prop
Android全编译后正常情况可找到生成的
out/target/product/qssi/system/hello.prop

检查其内容应与device/qcom/qssi/hello.prop内容保持一致。
将打包好的img烧录到设备中进行确认
关注公众号:Android老皮
解锁 《Android十大板块文档》 ,让学习更贴近未来实战。已形成PDF版
内容如下:
1.Android车载应用开发系统学习指南(附项目实战)
2.Android Framework学习指南,助力成为系统级开发高手
3.2023最新Android中高级面试题汇总+解析,告别零offer
4.企业级Android音视频开发学习路线+项目实战(附源码)
5.Android Jetpack从入门到精通,构建高质量UI界面
6.Flutter技术解析与实战,跨平台首要之选
7.Kotlin从入门到实战,全方面提升架构基础
8.高级Android插件化与组件化(含实战教程和源码)
9.Android 性能优化实战+360°全方面性能调优
10.Android零基础入门到精通,高手进阶之路
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/8715.html