在Android 系统中,为统一管理系统的属性,设计了一个统一的属性系统。每个属性都有一个名称和值,他们都是字符串格式。属性被大量使用在Android系统中,用来记录系统设置或进程之间的信息交换。属性是在整个系统中全局可见的。每个进程可以get/set属性。在编译的过程中会将各种系统参数汇总到build.proc 以及default.proc 这两个文件中,主要属性集中在build.proc中。系统在开机后将读取配置信息并构建共享缓冲区,加快查询速度。另外一个方面,SettingsProvider会在系统第一次初始化时(刷机第一次启动)后,将从Defaults.xml中读取数据然后写入数据库Settings.db 目录。并构建一个缓冲系统供其他应用查询。
Android中保存了很多系统属性值,比如手机的操作系统版本号ro.build.version.release,SDK版本号ro.build.vrsion.sdk,芯片型号ro.chipname;用于配置USB连接类型的persist.sys.usb.config;Android虚拟机ART相关的配置dalvik.vm.image-dex2oat-Xms。
系统属性由init进程的一个服务property_service负责管理,在手机启动时,该服务负责将所有手机里的属性文件中的属性加载到共享内存中,从而可以为不同的进程访问。
从功能上来看,Android的属性系统类似于Windows的注册表,都是用于保存系统的参数与配置
2、Properties Type
系统属性根据不同的应用类型,分为不可变型,持久型,网络型,启动和停止服务等。属性名称以“ro.”开头,那么这个属性被视为只读属性。一旦设置,属性值不能改变。
属性名称以“persist.”开头,当设置这个属性时,其值也将写入/data/property。
属性名称以“net.”开头,当设置这个属性时,“net.change”属性将会自动设置,以加入到最后修改的属性名。(这是很巧妙的。 netresolve模块的使用这个属性来追踪在net.*属性上的任何变化。)
属性“ ctrl.start ”和“ ctrl.stop ”是用来启动和停止服务。每一项服务必须在/init.rc中定义.系统启动时,与init守护进程将解析init.rc和启动属性服务。一旦收到设置“ ctrl.start ”属性的请求,属性服务将使用该属性值作为服务名找到该服务,启动该服务。这项服务的启动结果将会放入“ init.svc.<服务名>“属性中 。客户端应用程序可以轮询那个属性值,以确定结果
其他类型的属性除了位于属性文件中的属性值之外,手机一旦关机这些属性值都会丢失,不能持久存在
3、Android toolbox
Android toolbox程序提供了两个工具: setprop和getprop获取和设置属性。其使用方法:getprop <属性名>
setprop <属性名> <属性值>
Java在Java应用程序可以使用System.getProperty()和System.setProperty()函数获取和设置属性。
C++
property_get,property_set,property_list
默认情况下,设置属性只会使"init"守护程序写入共享内存,它不会执行任何脚本或二进制程序。但是,您可以将您的想要的实现的操作与init.rc中某个属性的变化相关联.例如,在默认的init.rc中有:
1on property:sys.usb.config=none && property:sys.usb.configfs=1 2 write /config/usb_gadget/g1/UDC "none" 3 stop adbd 4 setprop sys.usb.ffs.ready 0 5 write /config/usb_gadget/g1/bDeviceClass 0 6 write /config/usb_gadget/g1/bDeviceSubClass 0 7 write /config/usb_gadget/g1/bDeviceProtocol 0 8 rm /config/usb_gadget/g1/configs/b.1/f1 9 rm /config/usb_gadget/g1/configs/b.1/f2 10 rm /config/usb_gadget/g1/configs/b.1/f3 11 rmdir /config/usb_gadget/g1/functions/rndis.gs4 12 setprop sys.usb.state ${sys.usb.config} 13 14on property:sys.usb.config=adb && property:sys.usb.configfs=1 15 start adbd
4、Properties Source
原则上,属性的设置可以出现在make android的任何环节。
目前Properties 的设置以Android8.0.0-r4谷歌原生代码版本为例:
/build/target/board/generic_arm64/system.prop
/build/tools/buildinfo.sh
编译好后,被设置的系统属性主要存放在:
这样,如果你设置persist.service.adb.enable为1 ,"init"守护程序就知道需要采取行动:开启adbd服务。
/default.prop 手机厂商自己定制使用
/system/build.prop 系统属性主要存放处
/system/default.prop default properties, 有存放与security 相关的属性
/data/local.prop 目前还没有看到有内置的情况
/data/property下有4个prop文 件:persist.sys.timezone, persist.sys.language, persist.sys.country, persist.sys.localevar, 里面保存着属性名称以“persist.”开头的属性值。用户的persist 开头的属性都会保存副本在这个目录下
5.Property Service的启动与初始化
init进程启动,分为两个阶段,阶段一主要是添加脚本执行环境,以及初始化必要的文件系统目录。接着通过execv来执行一个参数为--second-stage的新的init进程Image以取代之前的init进程Image。
阶段一请参考http://blog.csdn.net/nwpushuai/article/details/79346665
执行第二阶段的初始化时,开始初始化属性系统,主要分为以下几个步骤:
初始化属性共享内存;
加载系统默认属性值;
启动属性服务,监听属性修改请求命令;
从磁盘中加载所有属性值到内存;
代码路径:/system/core/init/init.cpp (http://androidxref.com/8.0.0_r4/xref/system/core/init/init.cpp)
http://blog.csdn.net/nwpushuai/article/details/79440754
6.控制属性
在system properties 中提供两个特殊的key, ctl.start 和 ctl.stop 来启动和关闭服务。
其API 描述是:
SystemProperties.set(“ctl.start”,serviceName);
SystemProperties.set(“ctl.stop”,serviceName);
serviceName 可在init.rc 中查询
7.About Phone Properties.
About Phone中的一些关键属性通过buildinfo.sh 来焊接(make - build), 经过测试,可修改alps\build\tools\buildinfo.sh 来修改显示的情况,整理一下如下:
修改echo "ro.build.display.id=$BUILD_DISPLAY_ID", 把 $BUILD_DISPLAY_ID 修改成其他的名称可改变 Build Nubmer. 注意此时要去除$.
修改echo "ro.product.model=$PRODUCT_MODEL", 把 $PRODUCT_MODEL 修改成其他的名称可改变 Model Nubmer. 注意此时要去除$
修改echo "ro.build.version.release=2.1" , 中的2.1 可改变显示的Firmware version, 这个不建议修改。
Baseband Version 直接写在 modem.img 中,开机后modem 自动推送到Android端,需要专门的tool 才能修改。
Kernel Version 为linux 编译过程中产生, 按照标准的linux格式生成(compile.h), 最后版本信息写在文件/proc/version 下,所有的版本信息即在该文件的第一行,然后使用了一个正则表达式过滤了版本信息中一些字符。
参考:
https://www.cnblogs.com/l2rf/p/6610348.html
http://blog.csdn.net/jason_wzn/article/details/71603429