实现Android init中对属性作为参数的写入操作

田海立@CSDN

2013-3-31

事情的由来: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命令的实现。

把原来实现:

int do_write(int nargs, char **args)
{
    returnwrite_file(args[1], args[2]);
}

改成

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);
       return -EINVAL;
    }
    returnwrite_file(path, prop_val);
}

就可实现对init.rc中write指令中$(prop)的解析。


猜你喜欢

转载自blog.csdn.net/thl789/article/details/8743715