日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android属性系统分析

發布時間:2024/1/1 Android 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android属性系统分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

什么是屬性系統

屬性的操作

屬性的分類

屬性系統架構設計

Property 機制總結

Init進程加載調用

JAVA層封裝


什么是屬性系統

屬性系統是Android的一個重要特性。它作為一個服務運行,管理系統配置和狀態,所有的系統配置和狀態都是屬性,每個屬性都是以鍵值對(key/value),其類型都是字符串。

屬性的操作

方法keyvalue功能
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 機制總結

  • 系統啟動就會從若干屬性腳本文件中加載屬性內容。
  • 系統中所有屬性(key/value)會存放在同一塊共享內存中。
  • 系統中各個進程將會這塊內存映射到自己的內存中,該內存是只讀的。
  • 系統中只有property service可以設置修改屬性。
  • 不同進程通過socket方式,向屬性服務發出修改請求,而不能直接修改。
  • 共享內存中的鍵值內容一字典樹的形式組織。
  • 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属性系统分析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。