該需求主要是爲了能夠獲取自定義的版本號,或者需要bootloader裏,定製代碼的執行結果需要傳遞到bootloader從而控制啓動等。
首先可以從shell裏查看LK傳入的值。
cat proc/cmdline
得知androidboot.serialno=xxxxx 那麼可以再源碼樹裏查找serialno關鍵字並依葫蘆畫瓢即可
bootable/bootloader/lk/app/aboot/aboot.c
1、同樣和serialno增加一個屬性名。
static const char *usb_sn_cmdline = " androidboot.serialno=";
+static const char *bootloader_version = " bootloader.version=";
2、和serialno增加一個存儲的buf
char sn_buf[13];
+char lkversion_buf[32];
3、和serialno類似,進行buf賦值,並且更新cmdline的長度
unsigned char *update_cmdline(const char * cmdline) {
………………………………
cmdline_len += strlen(usb_sn_cmdline);
cmdline_len += strlen(sn_buf);
+ cmdline_len += strlen(bootloader_version);
+ snprintf((char *)lkversion_buf, 32, "%s", "20171026");
+ cmdline_len += strlen(lkversion_buf);
………………………………
}
4、將寫入的值賦值到傳入kernel參數的緩衝區裏。
unsigned char *update_cmdline(const char * cmdline) {
………………………………
+
+ //bootloader version
+ src = bootloader_version;
+ if (have_cmdline) --dst;
+ have_cmdline = 1;
+ while ((*dst++ = *src++));
+ src = lkversion_buf;
+ if (have_cmdline) --dst;
+ have_cmdline = 1;
+ while ((*dst++ = *src++));
+
………………………………
以上爲LK部分的修改,對於kernel層,我們可以將獲取到的cmdline參數解析後設置到Android系統的systemprop裏
system/core/init/init.c
static void import_kernel_nv(char *name, int for_emulator){
………………………………
+
+ if (!strncmp(name, "bootloader.version", 18) && name_len > 18) {
+ property_set("ro.bootloader.version",value);
+ }
………………………………
}