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. a
on property:ro.kernel.qemu=1
start adbd
start
adbd
stop adbd
本文深入解析了Android系统中属性系统的内部工作原理,包括属性的读写机制、特殊属性的处理方式以及如何通过不同API和工具进行操作。同时介绍了属性服务的作用及其实现细节。
910

被折叠的 条评论
为什么被折叠?



