Android属性系统分析
目錄
什么是屬性系統
屬性的操作
屬性的分類
屬性系統架構設計
Property 機制總結
Init進程加載調用
JAVA層封裝
什么是屬性系統
屬性系統是Android的一個重要特性。它作為一個服務運行,管理系統配置和狀態,所有的系統配置和狀態都是屬性,每個屬性都是以鍵值對(key/value),其類型都是字符串。
屬性的操作
| 方法 | key | value | 功能 |
| getprop | 屬性名 | 獲取屬性值 | |
| setprop | 屬性名 | 屬性值 | 設置屬性值 |
屬性的分類
“ro.”開頭,那么這個屬性值被視為只讀,一旦設置,屬性值不能改變。
“persist.”開頭,當設置這個屬性值時,其值將同時寫入/data/property。
“net.”開頭,當設置這個屬性時,”net.change”屬性將會自動設置。
“ctrl.start”和”ctrl.stop”用來啟動和停止服務,其服務應該在init.rc文件中定義,系統啟動時init守護進程將解析init.rc文件,啟動屬性服務。一旦收到設置”ctrl.start”屬性的請求,屬性服務將以該屬性值作為屬性服務名稱,啟動該服務。并將啟動結果放在”init.svc.服務名”屬性中,輪詢init.svc.服務名,可以判斷服務是否開啟。
屬性系統架構設計
Property 機制總結
Init進程加載調用
初始化屬性空間
1.以可讀寫的方式創建或打開文件/dev/__properties,用mmap()映射成共享內存。
fd = open(property_filename, O_RDONLY | O_NOFOLLOW | O_CLOEXEC);
2.以只讀的方式打開/dev/__properties,并記錄打開文件的handle。
int fd = open(PROP_FILENAME, O_RDONLY | O_NOFOLLOW);
初始化屬性服務
主要加載若干屬性文件,然后創建并監聽socket接口。
加載屬性文件
依次加載下列文件
- "/system/build.prop"
- "/system/default.prop"
- "/data/local.prop" 如果支持覆蓋,則有該步驟
- "/data/property"???? userdata分區目錄,可以保存persist.開頭的屬性。
屬性服務處理
在init進程變成守護進程,非租塞方式查詢socket端口,如果socket端口有數據,接收端口數據并處理。
設置屬性時需要判斷設置屬性值是否合法。
1.長度
- #define PROP_NAME_MAX?? 32
- #define PROP_VALUE_MAX? 92
2.屬性格式
- 大小寫A-Z,數字0-9以及_,-
- 不能有”.”開始和結尾,或者屬性中包括連續兩個”.”
Ctl.處理
1.首先判斷設置屬性的進程是否擁有對該屬性的設置權限。
- AID_SYSTEM和AID_ROOT 擁有設置權限,特殊處理。
- 其它權限需要匹配系統配置的屬性權限設置名單control_perms[]。
2.分別處理設置服務進程的情況,start,stop,restart。
msg_start(arg);
msg_stop(arg);
msg_restart(arg);
3.對服務設置完畢后需要設置屬性init.svc.屬性名為running,stopping,stopped
Ro.處理
1.Ro.開頭的處理首先需要判斷是否擁有對該屬性的設置權限
- AID_ROOT權限特殊處理
- 其它權限需要匹配系統配置的屬性權限設置名單property_perms[]
2.如果在當前屬性空間中已經有該屬性,則直接返回,Ro.開頭的屬性只能設置一次。
3.如果在當前屬性空間中已經有該屬性則更新,沒有則增加
Net.處理
1.Net.開頭的處理首先需要判斷是否擁有對該屬性的設置權限
- AID_ROOT權限特殊處理
- 其它權限需要匹配系統配置的屬性權限設置名單property_perms[]
2.如果在當前屬性空間中已經有該屬性則更新,沒有則增加
3.增加或者修改屬性值后,需要設置"net.change屬性。
Persist.處理
1.首先判斷設置屬性的進程是否擁有對該屬性的設置權限。
- AID_ROOT權限特殊處理
- 其它權限需要匹配系統配置的屬性權限設置名單property_perms[]
2.增加或者修改屬性值后,需要設置"net.change屬性。
3.需要在/data/property文件下增加屬性。
觸發屬性action
屬性設置后,需要輪詢init.rc配置的屬性,那些被觸發,如果滿足條件需要將對應的Action加入到執行隊列中。
JAVA層封裝
屬性系統對上層主要提供get和set兩個接口,jni層對get接口進行了擴展處理。
實際也是對接口的簡單封裝而已。
總結
以上是生活随笔為你收集整理的Android属性系统分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OC面试题大全
- 下一篇: android sina oauth2.