以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函数去执行。
Android 系统默认属性配置加载流程个人总结
猜你喜欢
转载自guyikun.iteye.com/blog/1949361
今日推荐
周排行