Android(安卓)的属性分析
Every property has a name and value. Both name and value are text strings. Property is heavily used in Android to record system setting or exchange information between processes. The property is globally visible in the whole system. Every process can get/set a property. On system initialization, Android will allocates a block of shared memory for storing the properties. This is done in “init” daemon whose source code is at: device/system/init. The “init” daemon will start a Property Service. The Property Service is running in the process of “init” daemon. Every client that wants to SET property needs to connect to the Property Service and send message to Property Service. Property Service will update/create the property in shared memory. Any client that wants to GET property can read the property from the shared memory directly. This promotes the read performance. The client application can invoke the API function exposed from libcutils to GET/SET a property. The source code of libcutils locates at: device/libs/cutils. The API function is: int property_get(const char *key, char *value, const char *default_value); int property_set(const char *key, const char *value); The libcutils is in turn calling the __system_property_xxx function in libc to get a property from the shared memory. The source code of libc is at: device/system/bionic. The Property Service is also in turn calling the __system_property_init function in libc to initiate the shared memory for properties. When starting the Property Service will load the default properties from below files: /default.prop /system/build.prop /system/default.prop /data/local.prop The properties are loaded in the above order. Later loaded properties will override the previous values. After those properties are loaded, the last loaded is the persistent properties which is persisted in /data/property. Special Properties If a property’s name begins with “ro.”, then this property is treated as a read-only property. Once set, the value of the property can’t be changed. If a property’s name begins with “persist.”, then when setting this property, the value will be written to /data/property, too. If a property’s name begins with “net.”, when when setting this property, the “net.change” property will be set automatically to contain the name of the last updated property. (It’s tricky. The netresolve module uses this property to track if there is any change on the net.* properties.) The property “ctrl.start” and “ctrl.stop” is used to start and stop a service. Every service must be defined in /init.rc. On system startup, the init daemon will parse the init.rc and start the Property Service. Once received a request to set the property of “ctrl.start”, the Property Service will use the property value as the service name to find the service and then start the service. The service starting result is then put to the property “init.svc.<service name>”. The client application can poll the value of that property to determine the result. Android toolbox The Android toolbox provides two applets: setprop and getprop to get and set properties. The usage is: getprop <property name> setprop <property name> <property value> Java The java application can use the System.getProperty() and System.setProperty() function to Get and Set the property. Action By default the set property will only cause "init" daemon to write to shared memory, it won't execute any script or binary. But you can add your actions to correspond to property change in init.rc. For example, in the default init.rc, you can find. # adbd on at boot in emulator on property:persist.service.adb.enable=1 on property:persist.service.adb.enable=0 So if you set persist.service.adb.enable to 1, the "init" daemon knows it has actions to do, then it will start adbd service. 每个属性都有一个名称和值,他们都是字符串格式。属性被大量使用在Android系统中,用来记录系统设置或进程之间的信息交换。属性是在整个系统中全局可见的。每个进程可以get/set属性。 特别属性 Android toolbox程序 Java Action # adbd on at boot in emulator 这样,如果你设置persist.service.adb.enable为1 ,"init"守护程序就知道需要采取行动:开启adbd服务。 文章中提到的共享内存就是Android特有的共享方式:ashmen Ashmem是一个匿名共享内存(Anonymous SHared MEMory)系统,该系统增加了接口因此进程间可以共享具名内存块。举一个例子,系统可以利用Ashmem存储图标,当绘制用户界面的时候多个进程也可以访问。Ashmem优于传统Linux共享内存表现在当共享内存块不再被用的时候,它为Kernel提供一种回收这些共享内存块的手段。如果一个程序尝试访问Kernel释放的一个共享内存块,它将会收到一个错误提示,然后重新分配内存并重载数据。 ----- 转自:http://hi.baidu.com/lucky900apple/blog/item/1870751b2c5240c6a786698d.html |
更多相关文章
- Android(安卓)support v7 TabLayout 自定义属性
- MotionLayout入门
- 史上最全!押题率90%的 Android(安卓)中高级工程师面试复习大纲及
- Android(安卓)大图压缩处理,避免OOM
- 进程(一) 1.1 Android中异步处理大杀器——AsyncTask
- Android(安卓)out of memory 彻底解决Android因加载多个大图引起
- Android进程永生技术终极揭秘:进程被杀底层原理、APP应对技巧
- Android中高效的显示图片之三——缓存图片
- Android应用优化之内存概念