目录
什么是属性系统
属性系统是Android的一个重要特性。它作为一个服务运行,管理系统配置和状态,所有的系统配置和状态都是属性,每个属性都是以键值对(key/value),其类型都是字符串。
属性的操作
方法 | key | value | 功能 |
getprop | 属性名 | 获取属性值 | |
setprop | 属性名 | 属性值 | 设置属性值 |
属性的分类
“ro.”开头,那么这个属性值被视为只读,一旦设置,属性值不能改变。
“persist.”开头,当设置这个属性值时,其值将同时写入/data/property。
“net.”开头,当设置这个属性时,”net.change”属性将会自动设置。
“ctrl.start”和”ctrl.stop”用来启动和停止服务,其服务应该在init.rc文件中定义,系统启动时init守护进程将解析init.rc文件,启动属性服务。一旦收到设置”ctrl.start”属性的请求,属性服务将以该属性值作为属性服务名称,启动该服务。并将启动结果放在”init.svc.服务名”属性中,轮询init.svc.服务名,可以判断服务是否开启。
属性系统架构设计
Property 机制总结
- 系统启动就会从若干属性脚本文件中加载属性内容。
- 系统中所有属性(key/value)会存放在同一块共享内存中。
- 系统中各个进程将会这块内存映射到自己的内存中,该内存是只读的。
- 系统中只有property service可以设置修改属性。
- 不同进程通过socket方式,向属性服务发出修改请求,而不能直接修改。
- 共享内存中的键值内容一字典树的形式组织。
Init进程加载调用
初始化属性空间
1.以可读写的方式创建或打开文件/dev/__properties,用mmap()映射成共享内存。
fd = open(property_filename, O_RDONLY | O_NOFOLLOW | O_CLOEXEC);
2.以只读的方式打开/dev/__properties,并记录打开文件的handle。
int fd = open(PROP_FILENAME, O_RDONLY | O_NOFOLLOW);
初始化属性服务
主要加载若干属性文件,然后创建并监听socket接口。
加载属性文件
依次加载下列文件
- "/system/build.prop"
- "/system/default.prop"
- "/data/local.prop" 如果支持覆盖,则有该步骤
- "/data/property" userdata分区目录,可以保存persist.开头的属性。
属性服务处理
在init进程变成守护进程,非租塞方式查询socket端口,如果socket端口有数据,接收端口数据并处理。
设置属性时需要判断设置属性值是否合法。
1.长度
- #define PROP_NAME_MAX 32
- #define PROP_VALUE_MAX 92
2.属性格式
- 大小写A-Z,数字0-9以及_,-
- 不能有”.”开始和结尾,或者属性中包括连续两个”.”
Ctl.处理
1.首先判断设置属性的进程是否拥有对该属性的设置权限。
- AID_SYSTEM和AID_ROOT 拥有设置权限,特殊处理。
- 其它权限需要匹配系统配置的属性权限设置名单control_perms[]。
2.分别处理设置服务进程的情况,start,stop,restart。
msg_start(arg);
msg_stop(arg);
msg_restart(arg);
3.对服务设置完毕后需要设置属性init.svc.属性名为running,stopping,stopped
Ro.处理
1.Ro.开头的处理首先需要判断是否拥有对该属性的设置权限
- AID_ROOT权限特殊处理
- 其它权限需要匹配系统配置的属性权限设置名单property_perms[]
2.如果在当前属性空间中已经有该属性,则直接返回,Ro.开头的属性只能设置一次。
3.如果在当前属性空间中已经有该属性则更新,没有则增加
Net.处理
1.Net.开头的处理首先需要判断是否拥有对该属性的设置权限
- AID_ROOT权限特殊处理
- 其它权限需要匹配系统配置的属性权限设置名单property_perms[]
2.如果在当前属性空间中已经有该属性则更新,没有则增加
3.增加或者修改属性值后,需要设置"net.change属性。
Persist.处理
1.首先判断设置属性的进程是否拥有对该属性的设置权限。
- AID_ROOT权限特殊处理
- 其它权限需要匹配系统配置的属性权限设置名单property_perms[]
2.增加或者修改属性值后,需要设置"net.change属性。
3.需要在/data/property文件下增加属性。
触发属性action
属性设置后,需要轮询init.rc配置的属性,那些被触发,如果满足条件需要将对应的Action加入到执行队列中。
JAVA层封装
属性系统对上层主要提供get和set两个接口,jni层对get接口进行了扩展处理。
实际也是对接口的简单封装而已。