一、属性简介
在android 系统中,为统一管理系统的属性,设计了一个统一的属性系统。每个属性都有一个名称和值,他们都是字符串格式。
属性被大量使用在Android系统中,用来记录系统设置或进程之间的信息交换。属性是在整个系统中全局可见的。还有一种与属性一样起到全局可见的另一种共享内存机制:数据库。

androidtitle属性 android 属性_初始化


二、属性初始化

在linux kernel 启动时,Android将分配一个共享内存区来存储的属性。这些是由“init”守护进程完成的(可以参考system/core/init/init.c中main函数系统初始化过程)。

init”守护进程会启动一个属性服务,每一个客户端想要设置属性时,必须连接属性服务,再向其发送信息。属性服务将会在共享内存区中修改和创建属性。客户端想获得属性信息,可以从共享内存直接读取。

属性初始化过程:

1、property_init()打开ashmem(android共享内存)设备,申请一段size大小的kernel空间内存,不去释放,以便供所有用户空间进程共享

【system/core/init/init.c–》int main(int argc, char **argv){ }–>property_init();】

【system/core/init/property_service.c–》void property_init(void) -->init_property_area();】

2、init属性初始化,加载/default.prop
【system/core/init/property_service.c】

int property_set(const char *name, const char *value)
 int property_get(const char *key, char *value, const char *default_value);

3、init启动属性服务,先后加载/system/build.prop、/system/default.prop、/data/local.prop、/data/property,后加载的属性将覆盖原先的值。

三、属性类型
1、ro. 开头的属性,它表示只读属性,系统启动后它一旦被设置初始值就不能被修改,中间如果被修改,重启后依然失效。
2、persist.开头的属性,它表示持久属性,该属性可修改的,若修改,重启还保存修改后的值,以文件的形式保存在/data/property路径下,所以除非恢复出厂,设置后会一直保存。
3、net. 开头的属性,顾名思义,就是与网络相关的属性,net.属性中有一个特殊的属性:net.change,它记录了每一次最新设置和更新的net.属性,也就是每次设置和更新net.属性时则会自动的更新net.change属性,net.change属性的value就是这个被设置或者更新的net属性的name。例如我们更新了属性net.bt.name的值,那么属性服务就会自动更新net.change,将其值设置为net.bt.name
4、init.开头的属性,是一种特殊的属性,由init.c 定义,init 会监控定义在init.rc 中的服务
5、ctl.start和ctl.stop两个属性比较特殊,是用来启动和停止init.rc中定义的服务,在属性中提供两个特殊的key, ctl.start 和 ctl.stop 来启动和关闭服务,例如,通过setprop ctl.stop adbd关闭adb服务
6、persist.sys. 或者sys.开头的属性,只能有系统用户(包括root) 进行修改,其他用户无法进行修改。

四、属性安全性

在Android平台中,在访问属性值时,添加了访问权限控制,增强了访问的安全性。系统中所有运行中的进程都可以访问属性值,但仅有init进程才能修改属性值。其他进程修改属性值时,必须向init进程提出请求,最终由init进程负责修改属性值。在此过程中,init进程会先检查各属性的访问权限,而后再修改属性值。

1、system/core/init/property_service.c为init进程提供属性初始化/读/写/列等支持

androidtitle属性 android 属性_初始化_02

2、如果要设置定制属性,就要在property_perms添加属性以及UID权限。

3、system/core/init/property_service.c中的check_perms()函数会检验属性权限

【static int check_perms(const char *name, unsigned int uid, unsigned int gid, char *sctx)】五、属性的读写

1、在bionic/libc/include/sys/system_properties.h有定义属性key和value的最大长度,读写属性时需要注意其长度

androidtitle属性 android 属性_属性值_03

2、在盒子串口下通过命令getprop/setprop也可以读写属性,代码system/core/toolbox/getprop.c、setprop.c
【getprop 列出所有配置属性值】
【getprop [key] 取得对应的key的属性值】
【setprop [key] [value] 设置指定key的属性值。】
3、C或C++中可以system/core/libcutils/properties.c中的property_get和property_set读写属性。
4、如果在Java 层,则可以使用SystemProperties.get/set 该方法实际将调用SystemProperties.java 进行访问,而SystemProperties.java 通过jni 调用libcutils进行访问。
在Android中调用

import android.os.SystemProperties;
	 SystemProperties.set("key", "value");  //设置属性
	 String deviceModel = SystemProperties.get("key", null); //获取属性