田海立@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)的解析。