天天看點

Android屬性之build.prop,及property_get/property_set

簡要分析一下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 ”屬性的請求,屬性服務将使用該屬性值作為服務名找到該服務,啟動該服務。用戶端應用程式可以輪詢那個屬性值,以确定結果。