每一個屬性都有一個名稱和值,他們都是字符串格式。屬性被大量使用在Android系統中,用來記錄系統設置或進程之間的信息交換。屬性是在整個系統中全局可見的。每一個進程能夠get/set屬性。ionic
在系統初始化時,Android將分配一個共享內存區來存儲的屬性。這些是由「init」守護進程完成的,其源代碼位於:device/system/init。「init」守護進程將啓動一個屬性服務。函數
屬性服務在「init」守護進程中運行。每個客戶端想要設置屬性時,必須鏈接屬性服務,再向其發送信息。屬性服務將會在共享內存區中修改和建立屬性。任何客戶端想得到屬性信息,能夠從共享內存直接讀取。這提升了讀取性能。客戶端應用程序能夠調用libcutils中的API函數以GET/SET屬性信息。libcutils的源代碼位於:device/libs/cutils。API函數是:性能
int property_get(const char *key, char *value, const char *default_value);ui
int property_set(const char *key, const char *value);進程
而libcutils又調用libc中的 __system_property_xxx 函數得到共享內存中的屬性。libc的源代碼位於:device/system/bionic。內存
屬性服務調用libc中的__system_property_init函數來初始化屬性系統的共享內存。當啓動屬性服務時,將從如下文件中加載默認屬性:字符串
/default.propget
/system/build.propit
/system/default.propio
/data/local.prop
屬性將會以上述順序加載。後加載的屬性將覆蓋原先的值。這些屬性加載以後,最後加載的屬性會被保持在/data/property中。
特別屬性若是屬性名稱以「ro.」開頭,那麼這個屬性被視爲只讀屬性。一旦設置,屬性值不能改變。
若是屬性名稱以「persist.」開頭,當設置這個屬性時,其值也將寫入/data/property。
若是屬性名稱以「net.」開頭,當設置這個屬性時,「net.change」屬性將會自動設置,以加入到最後修改的屬性名。(這是很巧妙的。 netresolve模塊的使用這個屬性來追蹤在net.*屬性上的任何變化。)
屬性「 ctl.start 」和「 ctl.stop 」是用來啓動和中止服務。
每一項服務必須在/init.rc中定義.系統啓動時,與init守護進程將解析init.rc和啓動屬性服務。一旦收到設置「 ctl.start 」屬性的請求,屬性服務將使用該屬性值做爲服務名找到該服務,啓動該服務。這項服務的啓動結果將會放入「 init.svc.<服務名>「屬性中 。客戶端應用程序能夠輪詢那個屬性值,以肯定結果
能夠用命令 setprop ctl.start 服務名 來啓動服務
好比
setprop ctl.start wpa_supplicant
setprop ctl.start bootanim
setprop ctl.stop bootanim