实现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

[1] [2] 下一页

Copyright © 2007-2012 www.chuibin.com 六维论文网 版权所有