Android 的系統(tǒng)屬性(SystemProperties)分析 by bob, 2,184 views
以下分析以android 4.03為基礎 前言Android的系統(tǒng)屬性相當于windows的注冊表,,由key和value組成,,且都是核心系統(tǒng)的一個基本機制,。相對于windows的注冊表,Android的系統(tǒng)屬性要簡單一些,,它沒有windows注冊表的樹狀結構,,而只是一個列表,也就是說沒有父子關系,。value有string,,int,long,,boolean,,但是設置只能通過字符串方式。 Android 的系統(tǒng)屬性包括兩部分:文件保存的持久屬性和每次開機導入的cache屬性,。前者主要保存在下面幾個文件中(目錄下):
后者則通過API方式使用,。 一、接口1. JAVA層接口:包名:android.os 類名:SystemProperties,,為隱藏類 接口:
其key長度不能超過31字,,val不超過91字
2.JNI接口在android_os_SystemProperties.cpp定義,在frameworks/base/core/jni/AndroidRuntime.cpp中注冊JNI
3.本地接口接口:
文件:
4. 底層bionic內(nèi)部接口除非想修改系統(tǒng)屬性機制,,可以分析一下
文件:
5. init.rc接口原始rc文件有
編譯后在跑到out/target/product/platformname/root/下 做成image后在out/target/product/platformname/ramdisk.img,,有可能由于平臺不一樣,文件名不一樣 設備運行后就是在根目錄下的一些init*.rc文件 在init.rc我們可以設置屬性,,監(jiān)聽屬性變化 setprop key value on property:key=value do_your_work 實現(xiàn):property的處理在init進程中,,相關文件
入口函數(shù)start_property_service及property_init、load_persist_props 1. 通訊機制:property_set有兩套實現(xiàn),,一套接口3:本地接口的實現(xiàn),會調用接口4:中的 __system_property_set,,__system_property_set通過本地SOCKET: “/dev/socket/property_service” 與init進程中properties服務通訊。 在init進程的system/core/init/property_service.c(h)代碼中有另一套property_set實現(xiàn),,僅用于init進程,。 2. 安全實現(xiàn):設置key的value時,需要作鑒權,,根據(jù)設置程序所在進程的fd獲知uid值,,比如system server進程可以設置net打頭的key,不可以設置gsm打頭的key,,相關的定義如下: 權限定義system/core/include/private/android_filesystem_config.h #define AID_ROOT 0 /* traditional unix root user */ #define AID_SYSTEM 1000 /* system server */ #define AID_RADIO 1001 /* telephony subsystem, RIL */ #define AID_DHCP 1014 /* dhcp client */ #define AID_SHELL 2000 /* adb and debug shell user */ #define AID_CACHE 2001 /* cache access */ #define AID_APP 10000 /* first app user */ 屬性權限表在system/core/init/property_service.c定義,,采用白名單方式 struct { const char *prefix; unsigned int uid; unsigned int gid; } property_perms[] = { { "net.rmnet0.", AID_RADIO, 0 }, { "net.gprs.", AID_RADIO, 0 }, { "net.ppp", AID_RADIO, 0 }, { "net.qmi", AID_RADIO, 0 }, { "net.lte", AID_RADIO, 0 }, { "net.cdma", AID_RADIO, 0 }, { "ril.", AID_RADIO, 0 }, { "gsm.", AID_RADIO, 0 }, { "persist.radio", AID_RADIO, 0 }, { "net.dns", AID_RADIO, 0 }, { "sys.usb.config", AID_RADIO, 0 }, { "net.", AID_SYSTEM, 0 }, { "dev.", AID_SYSTEM, 0 }, { "runtime.", AID_SYSTEM, 0 }, { "hw.", AID_SYSTEM, 0 }, { "sys.", AID_SYSTEM, 0 }, { "service.", AID_SYSTEM, 0 }, { "wlan.", AID_SYSTEM, 0 }, { "dhcp.", AID_SYSTEM, 0 }, { "dhcp.", AID_DHCP, 0 }, { "debug.", AID_SHELL, 0 }, { "log.", AID_SHELL, 0 }, { "service.adb.root", AID_SHELL, 0 }, { "service.adb.tcp.port", AID_SHELL, 0 }, { "persist.sys.", AID_SYSTEM, 0 }, { "persist.service.", AID_SYSTEM, 0 }, { "persist.security.", AID_SYSTEM, 0 }, { NULL, 0, 0 } }; 通過check_perms函數(shù)來檢查權限 下面是服務控制權限 struct { const char *service; unsigned int uid; unsigned int gid; } control_perms[] = { { "dumpstate",AID_SHELL, AID_LOG }, { "ril-daemon",AID_RADIO, AID_RADIO }, {NULL, 0, 0 } }; 通過check_control_perms函數(shù)來檢查權限 3. 監(jiān)聽變化在修改屬性的時候,會通過函數(shù)property_changed通知init觸發(fā)init.rc中的trigger,。 4. 屬性特殊處理:1. ctl.開頭的屬性是控制屬性,,用于控制系統(tǒng)的本地服務
使用語法 ctl.xxx servicename[:args] 2. ro.開頭的屬性不能被修改;
3. net.開始的屬性(除net.change外)設置,,將引發(fā)net.change=key的屬性設置,,被bionic/libc/netbsd/resolv/res_state.c中的代碼處理(通過__system_property_find函數(shù));
4. persist.開始的屬性,,如果在init.rc和代碼中設置,,將會被寫到/data/property目錄下;
related postrelated post
|
|