Android属性系统分析

目录

什么是属性系统

属性的操作

属性的分类

属性系统架构设计

Property 机制总结

Init进程加载调用

JAVA层封装


什么是属性系统

属性系统是Android的一个重要特性。它作为一个服务运行,管理系统配置和状态,所有的系统配置和状态都是属性,每个属性都是以键值对(key/value),其类型都是字符串。

属性的操作

方法keyvalue功能
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 机制总结

  1. 系统启动就会从若干属性脚本文件中加载属性内容。
  2. 系统中所有属性(key/value)会存放在同一块共享内存中。
  3. 系统中各个进程将会这块内存映射到自己的内存中,该内存是只读的。
  4. 系统中只有property service可以设置修改属性。
  5. 不同进程通过socket方式,向属性服务发出修改请求,而不能直接修改。
  6. 共享内存中的键值内容一字典树的形式组织。

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接口进行了扩展处理。

实际也是对接口的简单封装而已。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值