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


http://blog.csdn.net/zhandoushi1982/article/details/7378264


簡要分析一下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中首先定義各種變量,這在下一步執行時會用到。比如:

[cpp] view plaincopy
  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一些屬性,比如:

[cpp] view plaincopy
  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中定義的屬性,如下:

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

 

參考原文:http://blog.csdn.net/thl789/article/details/7014300

參考原文: http://blog.csdn.net/xujianqun/article/details/6363318

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com