在Android系统中有一个类似Windows系统注册表的文件build.prop。这个文件内定义了系统初始(或永久)的一些参数属性、功能的开放等。通过调整/增加参数可以达到较调系统性能偏重点和附加功能开启的作用。

一般情况下,很少需要自定义build.prop,因为其在编译过程中自动根据一些配置文件生成的。不过,今天所说的是一种特殊情况。我们开发平板项目中,由于市场需要,在结构上将平板分为防水和不防水版本,虽然在硬件上有些许差别,但为开发便捷性,底层使用一个IO口作为兼容区分即只需使用同一个kernel。但防水和不防水在机型上有所差别,一为K1,一为K1S。因此,在USB磁盘驱动器、机型、版本号等一些参数上需要做区分,而这些参数正是从build.prop文件中获取。所以,为使用同一system.img镜像烧录到两个机型不同的机器上而型号、版本号等显示对应,我想出自定义build_K1.prop和build_K1S.prop属性文件,然后修改.prop文件的加载代码,使系统在启动时选择性的加载自定义的两个属性文件,即可达到兼容的目的。

首先分析一下build.prop文件在android系统中如何使用。Android系统启动时,首先进入init进程,打开system/core/init/init.c文件,其中main函数中queue_builtin_action(property_service_init_action, "property_service_init")语句启动了android中的属性初始化服务,在此服务中,会打开build.prop文件,并将其中的一些属性加载进内存,此动作过程由system/core/init/property_service.c文件中的start_property_service()函数完成。至此,就可以在程序中访问build.prop中的一些属性参数。

然后分析system/core/init/property_service.c文件中的start_property_service()函数。在此函数中,首先调用load_properties_from_file(PROP_PATH_SYSTEM_BUILD),加载了PROP_PATH_SYSTEM_BUILD(system/build.prop)文件。因此如果需要修改加载自己制定的其他命名的.prop文件,即在此修改加载文件路径即可。

因此,在分析过后,对加载属性文件load_properties_from_file(PROP_PATH_SYSTEM_BUILD)部分的代码修改为:

char build_prop_name[64]="build_";
char prop_path[64]="/system/";
int flag = 1;
     fd = open("sys/product_version/model_name", O_RDONLY);
     if (fd >= 0) {
flag = 0;
         int n = read(fd, buf, sizeof(buf) - 1);
         if (n > 0) {
             if (buf[n-1] == '\n')
                 n--;
             buf[n] = 0;
         }
         close(fd);
strcat(build_prop_name, buf);
strcat(build_prop_name, ".prop");
strcat(prop_path, build_prop_name);
ERROR("------prop file: %s\n",prop_path);
if ( 0 == access(prop_path, 0) )
load_properties_from_file(prop_path);// prop file exist
else
flag = 1;
     } 
if ( flag ){   
load_properties_from_file(PROP_PATH_SYSTEM_BUILD);  
}

代码中sys/product_version/model_name节点,是在底层添加的一个根据IO口电平状态判断机型,返回K1/K1S的一个接口。至此,系统即可根据机型进行兼容一些属性参数,避免了需要编译制作两套系统镜像,节约开发时间,提高开发便捷性。

而build_K1.prop和build_K1S.prop文件,可以使用shell脚本自动根据build.prop生成,即可以根据编译自动更新其中的内容(如版本号等一些属性的设置)。shell脚本程序如下:

if [ -d $OUT/system ]
 then
cp $OUT/system/build.prop $OUT/system/build_K1.prop
cp $OUT/system/build.prop $OUT/system/build_K1S.prop


sed -i "s/OK1000/K1/g" $OUT/system/build_K1.prop
sed -i "s/OK1000/K1S/g" $OUT/system/build_K1S.prop
 fi

$OUT路径即编译后生成镜像的路径。