Android 系统默认属性配置加载流程个人总结

以ringtone的系统默认配置设置为例

1.配置ringtone

在./build/target/product/core.mk中修改默认ringtone配置

# For default sounds

PRODUCT_PROPERTY_OVERRIDES += \

ro.config.notification_sound=NewMessage.ogg \

ro.config.alarm_alert=AlarmBeep.ogg \

看不同的环境加载,也可已在full.mk或者full_base.mk等文件中修改


2.环境配置和.mk加 载

设置好默认属性后 就可 以开始编译了,具体如下:

envsetup.sh ->AndroidProduct.mk->core.mk
具体参考:
http://blog.csdn.net/zirconsdu/article/details/8005415


3.生成build.prop

由Makefile生成build.prop,再由该脚本显示build.prop属性。

具体如下:

./build/tool/Makefile



# build.prop

INSTALLED_BUILD_PROP_TARGET := $(TARGET_OUT)/build.prop

ALL_DEFAULT_INSTALLED_MODULES += $(INSTALLED_BUILD_PROP_TARGET)

ADDITIONAL_BUILD_PROPERTIES := \

$(call collapse-pairs, $(ADDITIONAL_BUILD_PROPERTIES))

ADDITIONAL_BUILD_PROPERTIES := $(call uniq-pairs-by-first-component, \

$(ADDITIONAL_BUILD_PROPERTIES),=)



BUILDINFO_SH := build/tools/buildinfo.sh



$(INSTALLED_BUILD_PROP_TARGET): $(BUILDINFO_SH) $(INTERNAL_BUILD_ID_MAKEFILE) $(BUILD_SYSTEM)/version_defaults.mk $(system_prop_file)



bash $(BUILDINFO_SH) > $@



注: 该过程具体可参考
http://blog.csdn.net/thl789/article/details/7014300


4.init property属性

./system/core/init/init.c




int main(int argc,char **argv)

{



property_init();



//启动服务属性

queue_builtin_action(property_service_init_action, "property_service_init");

...

}


...

static int property_service_init_action(int nargs, char **args)

{

/* read any property files on system or data and

* fire up the property service. This must happen

* after the ro.foo properties are set above so

* that /data/local.prop cannot interfere with them.

*/

start_property_service();

return 0;

}


property_init在property_service.c中

./system/core/init/property_service.c



void property_init(void)

{

init_property_area();

}




static int init_property_area(void)

{

prop_area *pa;

...

fcntl(pa_workspace.fd, F_SETFD, FD_CLOEXEC);

pa_info_array = (void*) (((char*) pa_workspace.data) + PA_INFO_START);

pa = pa_workspace.data;

memset(pa, 0, PA_SIZE);

...

/* plug into the lib property services */

__system_property_area__ = pa;

property_area_inited = 1;

return 0;

}


注:__system_property_area__是bionic libc的库中输出的一个变量,对它赋值后才能实现对于共享内存的指向。


启动属性服务器:


void start_property_service(void)

{

int fd;


//加载/system/default.prop、/system/build.prop、/data/local.prop属性文件

load_properties_from_file(PROP_PATH_SYSTEM_BUILD);

load_properties_from_file(PROP_PATH_SYSTEM_DEFAULT);

load_override_properties();



}


5.当默认的 配置 属性被加载后,则可以通过SystemProperties类来查询 关键 字属性值


./frameworks/base/core/java/android/os/SystemProperties.java

...

public static String get(String key) {

if (key.length() > PROP_NAME_MAX) {

throw new IllegalArgumentException("key.length > " + PROP_NAME_MAX);

}

return native_get(key);

}




该函数是一个native函数,将 会调用

./frameworks/base/core/jni/android_os_SystemProperties.cpp

中的SystemProperties_getS函数

注:是SystemProperties_getS,不是SystemProperties_get,因为

下面有
static JNINativeMethod method_table[] = {

{ "native_get", "(Ljava/lang/String;)Ljava/lang/String;",

(void*) SystemProperties_getS },



};


将对于 native_get的指向引 导到 了SystemProperties_getS函数指针 的地 址。


再由SystemProperties_getSS去获取属 性对 象

static jstring SystemProperties_getSS(JNIEnv *env, jobject clazz,

jstring keyJ, jstring defJ)

{

...

len = property_get(key, buf, "");

...

}


至此,关于default ringtone的设置->编译->加载属性->读取的流 程大体完成。

除了一些只读的属性不能修改外,如果要修改配 置属 性,也可已调用SystemProperties的set函数去执行。

猜你喜欢

转载自guyikun.iteye.com/blog/1949361