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 plain copy print ?
  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 plain copy print ?
  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 plain copy print ?
  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 ”属性的请求,属性服务将使用该属性值作为服务名找到该服务,启动该服务。客户端应用程序可以轮询那个属性值,以确定结果。

更多相关文章

  1. android init.rc详解
  2. android——wifi系统架构
  3. Android基于XMPP Smack Openfire开发IM【三】客户端接收服务器发
  4. Android(安卓)ImageView的scaleType属性与adjustViewBounds属性
  5. 动态修改Android参数信息的方法绕过改机检测
  6. ScrollView属性fillViewport解决android布局不能撑满全屏的问题
  7. Android(安卓)Zygote分析
  8. 有关Android中EditText的一些属性
  9. android jni介绍

随机推荐

  1. Android(安卓)根据显示长度 调整字体大小
  2. 屏蔽apk在主界面上的显示
  3. Android(安卓)Build System
  4. android效果图之轮播
  5. Android(安卓)documentation decompile
  6. android 获取rom名称和版本号
  7. LKM Tricks to Android(安卓)Devices,查
  8. 定制apk名字
  9. Android(安卓)Audio代码分析14 - testPla
  10. Android:Activity:打开另外的Activity、参