簡要分析一下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中首先定義各種變量,這在下一步執行時會用到。比如:
1. ...
2. PRODUCT_DEFAULT_LANGUAGE="$(calldefault-locale-language,$(PRODUCT_LOCALES))" \
3. PRODUCT_DEFAULT_REGION="$(calldefault-locale-region,$(PRODUCT_LOCALES))" \
4. ...
(2)Makefile中調用build/tools/buildinfo.sh執行腳本,并輸出到build.prop。Buildinfo.sh很簡單,隻是echo一些屬性,比如:
1. ...
2. echo"ro.product.locale.language=$PRODUCT_DEFAULT_LANGUAGE"
3. echo"ro.product.locale.region=$PRODUCT_DEFAULT_REGION"
4. ...
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中定義的屬性,如下:
1. ADDITIONAL_BUILD_PROPERTIES:= \
2. $(ADDITIONAL_BUILD_PROPERTIES)\
3. $(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 ”屬性的請求,屬性服務将使用該屬性值作為服務名找到該服務,啟動該服務。用戶端應用程式可以輪詢那個屬性值,以确定結果。