该需求主要是为了能够获取自定义的版本号,或者需要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);
+ }
………………………………
}