实现Android init中对属性作为参数的写入操作
实现Android init中对属性作为参数的写入操作
事情的由来:Android很多系统的adb id是固定的,驱动一旦写好每个设备的id都是一样。有些需求要求adb的id每个设备都不同。
adb id即是通过命令adb devices查看到的设备的id。
这在Android4.0中已经实现,而实现的要点如下:
1. 内核的Adb usb驱动中暴露出接口/sys/class/android_usb/android0/iSerial,可供应用写入具体的id数值;
2. 手机中的sn号是设备的识别号,而且有一个属性值(ro.serialno)来记录,可用来作为区分adbid的标志;
Sn号也在系统启动的init里通过kernel传了过来论文网
3. 在系统启动阶段(propertyservice已经启动并可用,boot阶段应是不错的选择,所以可写在init.rc的on bootsection)写入:
write /sys/class/android_usb/android0/iSerial ${ro.serialno}
4. Write是init解析init.rc已经支持的命令,但是不支持属性作为参数。
本文着重讲述如何仿照Android4.0在较低版本中也支持属性作为write的参数。
1. /system/core/init/int_parser.h中添加expand_props()的原型定义
int expand_props(char *dst, const char *src, int len);
2. /system/core/init/int_parser.c中从Android 4.0中移植expand_props()的实现。
expand_props()主要实现了对‘$’包括的属性的解析:遇到$(prop)时,直接转化为获取属性值。
因为expand_props()也用到了push_chars(),push_chars()也一并移植过来。
3. /system/core/init/builtins.c中移植do_write()函数的实现。
do_write()也就是init.rc脚本中的write命令的实现。
把原来实现:
[cpp] view plaincopyprint?
01.int do_write(int nargs, char **args)
02.{
03. returnwrite_file(args[1], args[2]);
04.}
int do_write(int nargs, char **args)
{
returnwrite_file(args[1], args[2]);
}
改成
[cpp] view plaincopyprint?
01.int do_write(int nargs, char **args)
02.{
03. constchar *path = args[1];
04. constchar *value = args[2];
05. charprop_val[PROP_VALUE_MAX];
06. intret;
07.
08. ret =expand_props(prop_val, value, sizeof(prop_val));
09. if(ret) {
10. ERROR("cannot expand '%s' while writing to '%s'\n", value,path);
11. return -EINVAL;
12. }
13. returnwrite_file(path, prop_val);
14.}
int do_write(int nargs, char **args)
{
constchar *path = args[1];
constchar *value = args[2];
charprop_val[PROP_VALUE_MAX];
intret;
ret =expand_props(prop_val, value, sizeof(prop_val));
if(ret) 论文网 {
ERROR("cannot expand '%s' while writing to '%s'\n", value,path