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=1start 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服務。
相關文章
- guava翻譯系列之JoinerGuava
- guava翻譯系列之SplitterGuava
- LWN 文章翻譯 - 名字空間實作系列
- 淺談WPF之屬性系統
- ASM 翻譯系列第三十四彈:ASM磁碟組重要屬性介紹ASM
- Android屬性之excludeFromRecentsAndroid
- WPF 屬性系統 依賴屬性之記憶體佔用分析記憶體
- Android 動畫之屬性動畫Android動畫
- Android之佈局屬性Android
- Android Animation 系列——屬性動畫(Property Animation)Android動畫
- Android UI系列-----ImageView的scaleType屬性AndroidUIView
- 原型繼承(翻譯 vjeux 文章)原型繼承UX
- Android開發之屬性動畫Android動畫
- Android學習之 屬性動畫Android動畫
- [非專業翻譯] Mapster - 對映只讀屬性
- Android基礎進階之EffectiveJava翻譯系列(第八章:異AndroidJava
- android之Fragment(官網資料翻譯)AndroidFragment
- 眾成翻譯-國外前端文章前端
- CMake 屬性之全域性屬性
- (翻譯)火狐作業系統javascriptAPI作業系統JavaScriptAPI
- Android UI系列-----RelativeLayout的相關屬性AndroidUI
- Mac系統檔案屬性Mac
- Android原始碼解析(一)動畫篇-- Animator屬性動畫系統Android原始碼動畫
- JS閉包文章--(翻譯)Callbacks in LoopsJSOOP
- android之 控制元件常用的屬性Android控制元件
- CMake 屬性之目標屬性
- CMake 屬性之目錄屬性
- OpenHarmony移植案例與原理:startup子系統之syspara_lite系統屬性部件
- [譯] 系統設計入門 | 掘金翻譯計劃
- 微軟機器翻譯系統:中-英翻譯水平可“與人類媲美”微軟
- win10系統屬性在哪裡 快速開啟win10系統屬性的方法Win10
- Guava翻譯之SmallFunctionGuavaFunction
- JAVA NIO 翻譯系列(七、FileChannel)Java
- 修改gradle屬性,加快Android studio編譯速度GradleAndroid編譯
- Android XML 屬性AndroidXML
- android屬性動畫Android動畫
- android:screenOrientation屬性Android
- Android 《CardView 屬性》AndroidView