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


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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章