1. 程式人生 > >Android 系統屬性的點滴

Android 系統屬性的點滴

      其實之前就接觸過Android的系統屬性相關的一些知識,只是已經很久沒用過了,差不多都忘光了。

      最近遇到了點問題,只好翻下之前的筆記,以及在網上找些資料來加深下了解。

--------------------------

關於Android系統屬性的幾點:

Android的屬性系統:
1,每個屬性都有一個名稱和值,他們都是字串格式
2,用來記錄系統設定或程序之間的資訊交換。
3,android分配一個共享記憶體區來儲存的屬性,屬性是在整個系統中全域性可見的
4, 每個程序可以get/set屬性, set是通過向init程序發出請求,又init去完成,get可以直接讀取共享記憶體


屬性的格式: 以點分格式,可以自己定義,但以下為特殊屬性
屬性名稱以"ro."開頭,那麼這個屬性被視為只讀屬性。一旦設定,屬性值不能改變
屬性名稱以"persist."開頭,當設定這個屬性時,其值也將寫入/data/property/
屬性名稱以"net."開頭,當設定這個屬性時,"net.change"屬性將會自動修改,用於記錄最新被修改的以net.開頭的屬性
屬性"ctrl.start"和"ctrl.stop"是用來啟動和停止服務

系統中預設的屬性檔案/程式碼:
/default.prop
/system/build.prop
/system/default.prop
/data/local.prop
以上檔案一般只有前兩個,後兩個沒有

屬性將會以上述順序載入。後加載的屬性將覆蓋原先的值。這些屬性載入之後,
最後載入的屬性會被保持在/data/property/目錄中中。


/default.prop : 系統預設的屬性,一般都在根檔案系統目錄的頂層
ro.secure=0
ro.allow.mock.location=1
ro.debuggable=1
persist.sys.usb.config=mass_storage,adb

/system/build.prop: 系統編譯的屬性,主要記錄編譯時間,編譯主機,編譯平臺,以及dvm的資訊,
由Makefile自動生成


/data/property/:
persist.sys.country   persist.sys.localevar
persist.sys.language  persist.sys.profiler_ms

修改和檢視屬性的方法:
命令和shell指令碼中:
getprop <屬性名>
setprop <屬性名><<屬性值>
程式碼:
java: 
System.getProperty()
System.setProperty()
c/c++ :
int property_get(const char *key, char *value, const char *default_value);
int property_set(const char *key, const char *value);

啟動服務:
property_set("ctrl.start", "dhcpcd_p2p");

----------------------------

     我目前接觸到的是/system/build.prop,而我想做的就是自定義個prop,然後在可以通過程式碼對該prop進行讀寫

最初測試的時候,定義了個 persist.xxx,然後發現在程式碼中只能是讀到該值,無法寫入值,當然也沒報錯。


     後面還是找了很多的資料,關鍵是也沒找到個好的解決方法,連反射呼叫都嘗試了。


     不過還好 在 stackoverflow(http://stackoverflow.com/questions/27611738/what-linux-permissions-are-needed-for-systemproperties-set-to-work-android) 上總算找到了最終的原因(下面是截圖)


有了上面的線索,馬上到Android原始碼上找下property_service.c 瞧瞧


      上面的內容就是property_service.c 的內容截圖,原始碼路徑在 是 /system/core/init/property_service.c

      

     那我們現在就知道了,在property_service.c 中是定義了property項中相應欄位的許可權。所以我最初嘗試的persist.XXX是由於許可權問題,而如果想實現在程式碼中可以讀和寫property相應項的話,預設的debug.XXX 就有這個許可權,最終我也是使用這種方法。還有一種方法就是,可以修改下property_service.c 中的相應欄位的許可權,不過我還沒去嘗試驗證,只是覺得應該可以。


     下面再看下perprty_service.c 中定義相應欄位的許可權用的AID_RADID、AID_SYSTEM 是在哪裡定義的。

直接看system/core/include/private/android_filesystem_config.h


     直接看截圖內容就好,不解釋了。