StevGuo系列文章翻譯之Android系統屬性

jackie_gnu發表於2011-07-21

StevGuo系列文章翻譯之Android系統屬性  

每一個屬性都是一個名值對,名和值都是文字。Android系統中,屬性被大量使用,用來記錄系統設定或者在程式間交換資訊。屬性在整個系統中是可見的,每一個程式都可以get/set屬性。

系統初始化時,在init這個daemon中,Android會分配一些記憶體來儲存這些屬性,Init原始碼在/system/init中。Init這個daemon會開啟一個執行在init程式中的property service,每一個想設定屬性的client都需要連線到這個property service上去,然後向它傳送訊息,property service會在共享記憶體中更新/建立屬性。查詢屬性的client都會從共享記憶體中直接讀取屬性,這就提高了讀取效率。

Client程式會呼叫libcutils中關於get/set的API,而libcutils的原始碼位於/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的原始碼在/system/bionic中。

Property Service也是通過呼叫libc中的__system_Property_init函式來初始化儲存屬性的共享記憶體的。PropertyService初始過程中會從以下檔案中載入預設屬性:

/default.prop
/system/build.prop
/system/default.prop
/data/local.prop

上面就是屬性被載入的順序。屬性重複時,後載入的值會覆蓋先載入的值。最後被載入的是儲存在/data/property中的persistent property。

 

特殊屬性 

如果一個屬性名字以“ro.”開頭,那麼這個屬性會被當作只讀屬性。一旦被設定,屬性值永遠不會被改變。

如果屬性名以“persistent.”開頭,那麼set這個屬性時,屬性的值會被寫到/data/property中去。

如果屬性名以“net.”開頭,set屬性時,屬性名會被新增到“nent.change”檔案中。Netresolve模組用這個屬性來跟蹤net.*屬性是否被改變了。

屬性“ctl.start”和“ctl.stop” 用來開啟或者停止一個服務。每一個服務必須被定義在/init.rc中。在系統啟動時,init這個daemon會解析init.rc來開啟Property Service。一旦有設定“ctl.start”的請求,PropertyService就會使用屬性值作為名字找到並啟動服務,服務的啟動結果被放到屬性“init.svc.<service name>”中。Client程式通過檢查這個值來獲取結果。

 

Android的toolbox 

Android的toolbox提供了兩個小工具:setprop和getprop,分別用來set/get屬性。使用方法如下:

getprop <property name>
setprop <property name> <property value>

Java程式可以使用System.getProperty()/System.setProperty來get/set屬性。

預設情況下,設定屬性只能通過“init”daemon來向共享記憶體中寫,不會執行任何指令碼或者程式。但你可以在init.rc中新增動作來對屬性更新做出響應。例如,在預設的init.rc中,你可以發現下面這些東西:

# adbd on at boot in emulator

on property:ro.kernel.qemu=1 

start adbd


on property:persist.service.adb.enable=1
 

start adbd 

 

on property:persist.service.adb.enable=0 

 stop adbd

所以,如果你把persist.service.adb.enable設定為1的話,“init”daemon就會啟動adbd服務。

 

相關文章