android 属性系统
当系统初始化的时候,Android系统会分配一块共享内存用于存储属 性信息。这些操作是在"init"这个守护进程里完成的,其对应的源 代码目录在:mydroid/system/init。"init"守护进程同时也启动了属性服务。属性 服务运行在init进程中(注:是线程?)。客户端需 要设置属性时,需要连接到属性服务上,同时发送消息给属性服务。这样属性服务就可以更新保存在共享内存中的属性信息。当客户端需要读取属性信息时,可以直 接访问共享内存,这样做可以提高性能。
客户端程序可以通过调用libcutils库里的API函数实现对属性的设置和读取的操作。
libcutils库对应的源代码存放在: mydroid/libcutils/下。
这些API函数包括:
int property_get(const char *key, char *value, const char *default_value);
int property_set(const char *key, const char *value);
libcutils库是通过调用libc库中的__system_property_xxx这一系列函数实现从共享内存中获取 属性的。对应的libc的源代码保存在: device/system/bionic。
属性服务也会调用libc库中的函数__system_property_init来实现对共享内存的初始化。当启动 属性服务时会通过下面文件来加载默认的属性信息。
/default.prop
/system/build.prop
/system/default.prop
/data/local.prop
属性信息按照上面的顺序被加载。后加载的属性会覆盖前面的属性值(注:当属性名称相同的时候)。当上面加载完成后,最后加载的是驻留属性,保存在/data/property文件中。
特别的属性
如果属性是有”ro.”字符串开头,那么这条属性被看成 一个只读属性,一旦设置就不能被修改了。(注:初始化设置的时候是可写的)
如果属性是有“persist.”字符串开头,那么就认为是驻留属 性,当修改的时候同时也会被保存在/data/property文件中。
如果属性是有“net.”字符串开头,当设置这种属性的时 候,“net.change”这条属性也会被自动设置,其内容 设为最后更新过的属性名。
属性“ctrl.start” 和 “ctrl.stop” 用于启动和停止服务。这些服务必须在文件/init.rc中被定义。在系统启动的时候,init守护进程会解析init.rc文件,然后启动属性服务。一旦收到 了“ctrl.start”这个属性的设置请求,属性服务会 根据该属性的值作为服务名,在列表中找到服务对象并启动。服务启动的结果会反映在“init.svc.<service name>”这个属性之中。客户端程序可以轮 询该属性值来判断服务的启动结果。
Android 工具箱
Android 工具箱提供了2个应用程序:setprop 和 getprop用于读取和设置属性项目。使用方法是:
getprop <property name>
setprop <property name> <property value>
Java
Java程序可以通过使用函数System.getProperty() 和 System.setProperty()获取和设置属性条目。
动作
默认情况下设置属性只会触发init进程对共享内存进行操作,并不会执 行任何脚本和程序。但是你可以修改文件init.rc,这样在属性值发生变化的时候来触 发你定义的动作。例如在默认的init.rc文件中你可以找到下面这部分:
# adbd on at boot in emulator
on property:ro.kernel.qemu=1
start adbd
on property:persist.service.adb.enable=1
start adbd
on property:persist.service.adb.enable=0
stop adbd
所以当属性条目persist.service.adb.enable被设置成1的时候,init守护进程知道他需要启动adbd服务。