在android系统里,设计有一种系统叫做属性系统,它是用来做什么呢?这样设计有什么优势呢?其实这个属性系统主要是用来保存系统配置,或者用来交换不同进程的信息。这样的系统最大的优势是统一了系统配置的方式,统一了信息交换方式,通过共享内存的方式提高系统的性能。
下面就来分析属性系统的初始化函数,代码如下:
#001 void property_init(void)
#002 {
#003 init_property_area();
这行代码是调用函数init_property_area来设置属性内存的区域。
#004 load_properties_from_file(PROP_PATH_RAMDISK_DEFAULT);
这行代码是从ramdisk盘里加载属性文件。
#005 }
在这个函数里,需要查看一下宏定义,如下:
#define PROP_PATH_RAMDISK_DEFAULT "/default.prop"
也就是从内存盘里加载属性文件/default.prop,并把这些属性放到属性系统里。
接着来分析函数init_property_area是怎么创建共享内存,并把属性放到里面给所有进程共享使用的,代码如下:
#001 static int init_property_area(void)
#002 {
#003 prop_area *pa;
#004
#005 if(pa_info_array)
#006 return -1;
这段代码是判断当属性信息数组已经初始化,就直接返回。
#007
#008 if(init_workspace(&pa_workspace, PA_SIZE))
#009 return -1;
这段代码是调用函数init_workspace创建共享内存。
#010
#011 fcntl(pa_workspace.fd, F_SETFD, FD_CLOEXEC);
这行代码是设置共享内存的执行结束后关闭。
#012
#013 pa_info_array = (void*) (((char*) pa_workspace.data) + PA_INFO_START);
这行代码是保存创建共享内存指针。
#014
#015 pa = pa_workspace.data;
#016 memset(pa, 0, PA_SIZE);
这段代码是清空属性共享的内存。
#017 pa->magic = PROP_AREA_MAGIC;
#018 pa->version = PROP_AREA_VERSION;
这段代码是设置属性共享内存的版本号。
#019
#020 /* plug into the lib property services */
#021 __system_property_area__ = pa;
这行代码是设置属性共享内存可以给库的属性共享服务使用。
#022
#023 return 0;
#024 }
#025
从上面的函数里可以看到一个创建共享内存的函数,它是怎么样实现创建共享内存的呢?现在来分析它的代码