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.”. 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
setprop
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:ro.kernel.qemu=1
start adbd
on property:ro.kernel.qemu=1
start adbd
on
property:persist.service.adb.enable=1
start adbd
start adbd
on
property:persist.service.adb.enable=0
stop adbd
stop adbd
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.
沒有留言:
張貼留言