每一个属性都是一个名值对,名和值都是文本。Android系统中,属性被大量使用,用来记录系统设置或者在进程间交换信息。属性在整个系统中是可见的,每一个进程都可以get/set属性。

系统初始化时,在init这个daemon中,Android会分配一些内存来存储这些属性,Init源码在/system/init中。Init这个daemon会开启一个运行在init进程中的property service,每一个想设置属性的client都需要连接到这个property service上去,然后向它发送消息,property service会在共享内存中更新/创建属性。查询属性的client都会从共享内存中直接读取属性,这就提高了读取效率。

Client程序会调用libcutils中关于get/set的API,而libcutils的源码位于/libs/cutils。API如下:

java代码:
  1. int property_get(const char *key, char *value, const char *default_value);
  2. int property_set(const char *key, const char *value);
复制代码
libcutils会通过调用libc中的__system_property_xxx函数在共享内存中获取属性。Libc的源码在/system/bionic中。
Property Service也是通过调用libc中的__system_Property_init函数来初始化存储属性的共享内存的。 PropertyService初始过程中会从以下文件中加载默认属性:

java代码:
  1. /default.prop
  2. /system/build.prop
  3. /system/default.prop
  4. /data/local.prop
复制代码
上面就是属性被加载的顺序。属性重复时,后加载的值会覆盖先加载的值。最后被加载的是存储在/data/property中的persistent property。

特殊属性
如果一个属性名字以“ro.”开头,那么这个属性会被当作只读属性。一旦被设置,属性值永远不会被改变。
如果属性名以“persistent.”开头,那么set这个属性时,属性的值会被写到/data/property中去。
如果属性名以“net.”开头,set属性时,属性名会被添加到“nent.change”文件中。Netresolve模块用这个属性来跟踪net.*属性是否被改变了。

属性“ctrl.start”和“ctrl.end” 用来开启或者停止一个服务。每一个服务必须被定义在/init.rc中。在系统启动时,init这个daemon会解析init.rc来开启Property Service。一旦有设置“ctrl.start”的请求,PropertyService就会使用属性值作为名字找到并启动服务,服务的启动结果被放到属性“init.svc.<service name>”中。Client程序通过检查这个值来获取结果。

Android的toolbox
Android的toolbox提供了两个小工具:setprop和getprop,分别用来set/get属性。使用方法如下:

getprop <property name>
setprop <property name> <property value>

Java程序可以使用System.getProperty()/System.setProperty来get/set属性。
默认情况下,设置属性只能通过“init”daemon来向共享内存中写,不会执行任何脚本或者程序。但你可以在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”daemon就会启动adbd服务。


转载于:http://www.eoeandroid.com/thread-101488-1-1.html 点击打开链接


更多相关文章

  1. 如何进行资源的热修复
  2. Ionic3学习笔记(九)关于 Android(安卓)端软键盘弹出后界面被压缩的
  3. Android官方开发文档Training系列课程中文版:高效显示位图之管理
  4. android Burron
  5. 转载:Android获取其他包的Context和在任意位置获取应用程序Contex
  6. 自定义简单的ProgressBar
  7. Android内存分配的注意事项
  8. Android(安卓)线程模型和 AsyncTask
  9. Android共享全局数据

随机推荐

  1. android 对象传输及parcel机制
  2. 玩转Android之Activity详细剖析
  3. Phonegap Device 获取设备信息
  4. mac终端配置Android(安卓)ADB命令
  5. Ubuntu11.10下编译android源码4.0.3
  6. 为什么应用商店里搜索不到你的App?
  7. android中的事件类型分为按键事件和屏幕
  8. update升级包版本信息的读取
  9. 如何成为Android高手
  10. 【Android笔记】执行命令行语句