系统获取序列号过程
Android系统的SN号,实际是从“cmdline”里面的“androidboot.serialno”获取到的,那么在给系统传递“cmdline”之前,就需要获取到SN号。
以MTK的一个Android 5.1系统为例,MTK的SN号,通过写号工具,和IMEI等参数,一起写入“NV(Non-Volatile)”中,然后开机再读出来用。
读取SN号的部分,在lk中,代码如下,文件:bootable/bootloader/lk/app/mt_boot/mt_boot.c:
void mt_boot_init(const struct app_descriptor *app)
{
unsigned usb_init = 0;
unsigned sz = 0;
int sec_ret = 0;
#ifdef CONFIG_MTK_USB_UNIQUE_SERIAL
u64 key;
u32 chip_code;
#endif
char serial_num[SERIALNO_LEN];
#ifdef CONFIG_MTK_USB_UNIQUE_SERIAL
/* Please enable EFUSE clock in platform.c before reading sn key */
/* serial string adding */
key = readl(SERIAL_KEY_HI);
key = (key << 32) | readl(SERIAL_KEY_LO);
chip_code = DRV_Reg32(APHW_CODE);
//如果有使用写号工具去写号,那么“key”就不为零,这里具体计算SN号的算法,都是平台厂商定义的东西
//估计是写号的时候,使用逆向的算法得到“key”,读的时候使用“key”再去算SN号
if (key != 0)
get_serial(key, chip_code, serial_num); //这里用到厂商定义的算法,算出来SN号来
else
memcpy(serial_num, DEFAULT_SERIAL_NUM, SN_BUF_LEN); //如果没有写号,使用默认值“DEFAULT_SERIAL_NUM”
/* copy serial from serial_num to sn_buf */
memcpy(sn_buf, serial_num, SN_BUF_LEN); //只需要“SN_BUF_LEN”长度做系统SN号
dprintf(CRITICAL,"serial number %s\n",serial_num);
#else
memcpy(sn_buf, DEFAULT_SERIAL_NUM, strlen(DEFAULT_SERIAL_NUM));
#endif
sn_buf[SN_BUF_LEN] = '\0';
surf_udc_device.serialno = sn_buf;
......
}
读取到SN号之后,传递给“cmdline”的“androidboot.serialno”,代码如下,依然在mt_boot.c文件:
/* Append androidboot.serialno=xxxxyyyyzzzz in cmdline */
sprintf(cmdline, "%s%s%s", cmdline, " androidboot.serialno=", sn_buf);
然后,init进程启动之后,会去处理“cmdline”,得到SN号。
代码如下,文件:system/core/init/init.c
static void process_kernel_cmdline(

本文详细介绍了Android系统序列号的来源,从MTK平台的LK阶段如何读取SN号,到init进程如何处理SN号并设置为系统属性。还探讨了如何在系统启动过程中客制化修改SN号,例如使用EMMC的id作为SN号。通过修改LK和init进程的代码,可以实现对SN号的定制,从而满足特定需求。
最低0.47元/天 解锁文章
3215





