Android屬性之build.prop,及propeetrty_get/property_s
簡要分析一下build.prop是如何生成的。Android的build.prop檔案是在Android編譯時收集的各種property(LCD density/語言/編譯時間, etc.),編譯完成之後,檔案生成在out/target/product/<board>/system/目錄下。在Android執行時可以通過property_get()[c/c++域] / SystemProperties_get*()[Java域]讀取這些屬性值。
(1)build.prop的生成是由make系統解析build/core/Makefile完成。Makefile中首先定義各種變數,這在下一步執行時會用到。比如:
- ...
- PRODUCT_DEFAULT_LANGUAGE="$(calldefault-locale-language,$(PRODUCT_LOCALES))" \
- PRODUCT_DEFAULT_REGION="$(calldefault-locale-region,$(PRODUCT_LOCALES))" \
- ...
(2)Makefile中呼叫build/tools/buildinfo.sh執行指令碼,並輸出到build.prop。Buildinfo.sh很簡單,只是echo一些屬性,比如:
- ...
- echo"ro.product.locale.language=$PRODUCT_DEFAULT_LANGUAGE"
- echo"ro.product.locale.region=$PRODUCT_DEFAULT_REGION"
- ...
ro.product.locale.language/ ro.product.locale.region就是些屬性,等號後面是值。
(3)Makefile中直接把$(TARGET_DEVICE_DIR)/system.prop的內容追加到build.prop中,還會收集ADDITIONAL_BUILD_PROPERTIES中的屬性,追加到build.prop中。
ADDITIONAL_BUILD_PROPERTIES又會收集PRODUCT_PROPERTY_OVERRIDES中定義的屬性,如下:
- ADDITIONAL_BUILD_PROPERTIES:= \
- $(ADDITIONAL_BUILD_PROPERTIES)\
- $(PRODUCT_PROPERTY_OVERRIDES)
通過build.prop生成過程的分析,可知哪裡可以修改原有的屬性或加入自己定義屬性,那就是2) buildinfo.sh; 3) system.prop; 4) ADDITIONAL_BUILD_PROPERTIES或PRODUCT_PROPERTY_OVERRIDES。
(4)屬性(property)都有一個名稱和值,他們都是字串格式,用來記錄系統設定或程序之間的資訊交換。屬性是在整個系統中全域性可見的。
在系統初始化時,Android將分配一個共享記憶體區來儲存的屬性。這些是由“init”守護程序完成的,“init”守護程序將啟動一個屬性服務。任何客戶端想獲得屬性資訊,可以從共享記憶體直接讀取。客戶端應用程式可以呼叫libcutils中的API函式以GET/SET屬性資訊:
int property_get(const char *key, char *value, const char *default_value);
int property_set(const char *key, const char *value);
當啟動屬性服務時,將從以下檔案中載入預設屬性:
/default.prop
/system/build.prop
/system/default.prop
/data/local.prop
屬性將會以上述順序載入,後加載的屬性將覆蓋原先的值。特別屬性如果屬性名稱以“ro.”開頭,那麼這個屬性被視為只讀屬性,比如ro.mediatek.version.release=ALPS.ICS2.MP.V1就是指示版本號,應用中用property_get("ro.mediatek.version.release", val, "unknown");即可用來獲得版本資訊;屬性“ ctrl.start ”和“ ctrl.stop ”是用來啟動和停止服務。每一項服務必須在/init.rc中定義,系統啟動時init守護程序將解析init.rc和啟動屬性服務。一旦收到設定“ ctrl.start ”屬性的請求,屬性服務將使用該屬性值作為服務名找到該服務,啟動該服務。客戶端應用程式可以輪詢那個屬性值,以確定結果。