Android的属性系统2011-04-10 17:42每个属性都有一个名称和值,他们都是字符串格式。
属性被大量使用在Android系统中,用来记录系统设置或进程之间的信息交换。
属性是在整个系统中全局可见的。
每个进程可以get/set属性。
在系统初始化时,Android将分配一个共享内存区来存储的属性。
这些是由“init”守护进程完成的,其源代码位于:device/system/init。
“init”守护进程将启动一个属性服务。
属性服务在“init”守护进程中运行。
每一个客户端想要设置属性时,必须连接属性服务,再向其发送信息。
属性服务将会在共享内存区中修改和创建属性。
任何客户端想获得属性信息,可以从共享内存直接读取。
这提高了读取性能。
客户端应用程序可以调用libcutils中的API函数以GET/SET属性信息。
libcutils的源代码位于:device/libs/cutils。
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”属性将会自动设置,以加入到最后修改的属性名。
(这是很巧妙的。
netresolve模块的使用这个属性来追踪在net.*属性上的任何变化。
)属性“ ctrl.start ”和“ ctrl.stop ”是用来启动和停止服务。
每一项服务必须在/init.rc中定义.系统启动时,与init守护进程将解析init.rc和启动属性服务。
一旦收到设置“ ctrl.start ”属性的请求,属性服务将使用该属性值作为服务名找到该服务,启动该服务。
这项服务的启动结果将会放入“ init.svc.<服务名>“属性中。
客户端应用程序可以轮询那个属性值,以确定结果。
Android toolbox程序Android toolbox程序提供了两个工具:setprop和getprop获取和设置属性。
其使用方法:getprop <属性名>setprop <属性名><<属性值>Java在Java应用程序可以使用System.getProperty()和System.setProperty()函数获取和设置属性。
Action默认情况下,设置属性只会使"init"守护程序写入共享内存,它不会执行任何脚本或二进制程序。
但是,您可以将您的想要的实现的操作与init.rc中某个属性的变化相关联.例如,在默认的init.rc中有:# adbd on at boot in emulatoron property:ro.kernel.qemu=1start adbdon property:persist.service.adb.enable=1start adbdon property:persist.service.adb.enable=0stop adbd这样,如果你设置persist.service.adb.enable为1 ,"init"守护程序就知道需要采取行动:开启adbd服务。
1. android现在好像只有/ default.prop,/system/build.prop两个文件,别的两个文件找不到2. /data/property下有4个prop文件:persist.sys.timezone,nguage,persist.sys.country,persist.sys.localevar,里面保存着属性名称以“persist.”开头的属性值。
3. libcutils的源码位于system\core\libcutils\下面,获取和设置属性的代码在properties.c里面,读取属性通过读共享内存得到,设置属性通过发送请求到property_service进行设置。
4. 相关的函数有property_set,property_get,property_list。
5. 属性系统的初始化通过__system_properties_init函数完成,__system_properties_init函数代码如下:view plaincopy to clipboardprint?int __system_properties_init(void) { prop_area *pa; int s, fd; unsigned sz; char *env; if(__syste m_property_area__ != ((void*) &dummy_props)) { return 0; } env = getenv("ANDROID_PROPERT Y_WORKSPACE"); if (!env) { return -1; } fd = atoi(env); env = strchr(env, ','); if (!env) { return -1; } sz = atoi(env + 1); pa = mmap(0, sz, PROT_READ, MAP_SHARED, fd, 0); if(pa == MAP_FAIL ED) { return -1; } if((pa->magic != PROP_AREA_MAGIC) || (pa->version != PROP_AREA_VERSION )) { munmap(pa, sz); return -1; } __system_property_area__ = pa; return 0; }可以看到首先从环境变量里面获取ANDROID_PROPERTY_WORKSPACE,ANDROID_PROPERTY_WORKSPACE 的值为如下形式:ANDROID_PROPERTY_WORKSPACE=9,32768。
然后获取共享内存的文件句柄和长度,最后对共享内存进行检查并设置全局变量__system_property_area__的值,property_get就是从__system_property_area__里面读取的属性值。
环境变量的初始化在init.c的service_start函数里面。
6. /init.rc里面有设置属性的代码,例如:# Define the oom_adj values for the classes of processes that can be# killed by the kernel. These are used in ActivityManagerService.setprop ro.FOREGROUND_APP_ADJ 0setprop ro.VISIBLE_APP_ADJ 1setprop ro.SECONDARY_SERVER_ADJ 2setprop ro.HOME_APP_ADJ 4setprop ro.HIDDEN_APP_MIN_ADJ 7setprop ro.CONTENT_PROVIDER_ADJ 14setprop ro.EMPTY_APP_ADJ 157. 通过property_list可以枚举所有的属性,下面是一段打印所有属性的代码。
view plaincopy to clipboardprint?#include <cutils/properties.h> #include <stdio.h> void print_prop(const char* key,const char* valu e,void* cookie) { printf("key=%s,value=%s\n",key,value); } int main() { property_list(pri nt_prop,NULL); }Android.mk文件:LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_SRC_FILES:= \list_property.cpp \LOCAL_SHARED_LIBRARIES := \libcutils \libutils \LOCAL_MODULE:= list_propinclude $(BUILD_EXECUTABLE)include $(call all-makefiles-under,$(LOCAL_PATH))所有的属性如下:key=ro.secure,value=0key=ro.allow.mock.location,value=1key=ro.debuggable,value=1key=persist.service.adb.enable,value=1key=ro.kernel.qemu,value=1key=ro.kernel.console,value=ttyS0key=ro.kernel.android.checkjni,value=1key=ro.kernel.android.qemud,value=ttyS1key=ro.factorytest,value=0key=ro.serialno,value=key=ro.bootmode,value=unknownkey=ro.baseband,value=unknownkey=ro.carrier,value=unknownkey=ro.bootloader,value=unknownkey=ro.hardware,value=goldfishkey=ro.revision,value=0key=ro.build.id,value=CUPCAKEkey=ro.build.display.id,value=sdk-eng 1.5 CUPCAKE 148875 test-keys key=ro.build.version.incremental,value=148875key=ro.build.version.sdk,value=3key=ro.build.version.release,value=1.5key=ro.build.date,value=Thu May 14 17:29:49 PDT 2009key=ro.build.date.utc,value=1242347389key=ro.build.type,value=engkey=er,value=android-buildkey=ro.build.host,value=key=ro.build.tags,value=test-keyskey=ro.product.model,value=sdkkey=ro.product.brand,value=generickey=,value=sdkkey=ro.product.device,value=generickey=ro.product.board,value=key=ro.product.manufacturer,value=unknownkey=nguage,value=enkey=ro.product.locale.region,value=USkey=ro.board.platform,value=key=ro.build.product,value=generickey=ro.build.description,value=sdk-eng 1.5 CUPCAKE 148875 test-keyskey=ro.build.fingerprint,value=generic/sdk/generic/:1.5/CUPCAKE/148875:eng/test-keys key=rild.libpath,value=/system/lib/libreference-ril.sokey=rild.libargs,value=-d /dev/ttyS0key=ro.config.notification_sound,value=F1_New_SMS.oggkey=xmpp.auto-presence,value=truekey=ro.config.nocheckin,value=yeskey=,value=Androidkey=net.change,value=net.gprs.local-ipkey=dalvik.vm.stack-trace-file,value=/data/anr/traces.txtkey=persist.sys.timezone,value=GMTkey=nguage,value=enkey=persist.sys.country,value=USkey=persist.sys.localevar,value=key=ro.FOREGROUND_APP_ADJ,value=0key=ro.VISIBLE_APP_ADJ,value=1key=ro.SECONDARY_SERVER_ADJ,value=2key=ro.HOME_APP_ADJ,value=4key=ro.HIDDEN_APP_MIN_ADJ,value=7key=ro.CONTENT_PROVIDER_ADJ,value=14key=ro.EMPTY_APP_ADJ,value=15key=ro.FOREGROUND_APP_MEM,value=1536key=ro.VISIBLE_APP_MEM,value=2048key=ro.SECONDARY_SERVER_MEM,value=4096key=ro.HOME_APP_MEM,value=4096key=ro.HIDDEN_APP_MEM,value=5120key=ro.CONTENT_PROVIDER_MEM,value=5632key=ro.EMPTY_APP_MEM,value=6144key=net.tcp.buffersize.default,value=4096,87380,110208,4096,16384,110208 key=net.tcp.buffersize.wifi,value=4095,87380,110208,4096,16384,110208 key=net.tcp.buffersize.umts,value=4094,87380,110208,4096,16384,110208 key=net.tcp.buffersize.edge,value=4093,26280,35040,4096,16384,35040key=net.tcp.buffersize.gprs,value=4092,8760,11680,4096,8760,11680 key=init.svc.console,value=runningkey=init.svc.servicemanager,value=runningkey=init.svc.vold,value=runningkey=init.svc.debuggerd,value=runningkey=init.svc.ril-daemon,value=runningkey=init.svc.zygote,value=runningkey=init.svc.media,value=runningkey=init.svc.installd,value=runningkey=init.svc.flash_recovery,value=stoppedkey=init.svc.goldfish-setup,value=stoppedkey=init.svc.qemud,value=stoppedkey=init.svc.goldfish-logcat,value=stoppedkey=ARGH,value=ARGHkey=net.eth0.dns1,value=10.0.2.3key=net.gprs.local-ip,value=10.0.2.15key=e-ppp,value=nokey=status.battery.state,value=Slowkey=status.battery.level,value=5key=status.battery.level_raw,value=50key=status.battery.level_scale,value=9key=ro.setupwizard.mode,value=EMULATORkey=.google.locationfeatures,value=1key=init.svc.adbd,value=runningkey=pleted,value=1key=hw.keyboards.65536.devname,value=qwerty2 key=sys.settings_secure_version,value=2key=dev.bootcomplete,value=1key=sys.settings_system_version,value=6key=gsm.sim.operator.numeric,value=key=gsm.sim.operator.alpha,value=key=gsm.sim.operator.iso-country,value=key=gsm.sim.state,value=UNKNOWNkey=adb.connected,value=1。