build/core/Makefile 中引用buildinfo.sh 并生成build.prop即作为系统属性默认数据文件
bionic/libc/include/sys/_system_properties.h 定义了build.prop的路径 PROP_PATH_VENDOR_BUILD
bionic/libc/bionic/system_properties.cpp
frameworks/base/core/java/android/os/SystemProperties.java 提供上层接口调用设置系统属性
各种native方法是在frameworks/base/core/jni/android_os_SystemProperties.cpp 中具体实现的
1)system/core/init/init.c 中启动start_property_service
2)system/core/init/property_service.c 中 引用PROP_PATH_VENDOR_BUILD中的定义的属性
加载系统属性默认数据文件
void load_all_props(void)
{
load_properties_from_file(PROP_PATH_SYSTEM_BUILD, NULL);
load_properties_from_file(PROP_PATH_SYSTEM_DEFAULT, NULL);
load_properties_from_file(PROP_PATH_VENDOR_BUILD, NULL);
load_properties_from_file(PROP_PATH_FACTORY, “ro.*”);
load_override_properties();
/* Read persistent properties after all default values have been loaded. */
load_persistent_properties();
}
初始化共享内存空间
static int init_property_area(void)
{
if (property_area_inited)
return -1;
if(__system_property_area_init())
return -1;
if(init_workspace(&pa_workspace, 0))
return -1;
fcntl(pa_workspace.fd, F_SETFD, FD_CLOEXEC);
property_area_inited = 1;
return 0;
}
将文件作为共享内存映射到进程空间内存使用
static int init_workspace(workspace *w, size_t size)
{
void *data;
int fd = open(PROP_FILENAME, O_RDONLY | O_NOFOLLOW);
if (fd < 0)
return -1;
w->size = size;
w->fd = fd;
return 0;
}
3)bionic/libc/bionic/system_properties.cpp
system_property_area每个进程都会使用此变量,指向系统属性共享内存区域,访问系统属性
可以在新的image中生成一份custom.prop作为系统属性数据文件的一部分,在加载系统属性默认数据文件load_all_props时将该客制化的prop文件加入便可访问该客制化的prop了。