1. 程式人生 > >Android屬性之build.prop,及propeetrty_get/property_s

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 ”屬性的請求,屬性服務將使用該屬性值作為服務名找到該服務,啟動該服務。客戶端應用程式可以輪詢那個屬性值,以確定結果。