android的ro.serialno或者ro.boot.serialno是如何获取到的

通过命令行获取序列号:

getprop ro.serialno

从哪来的呢:

android系统层:

/system/core/init/init.c:

static void import_kernel_nv(char *name, int for_emulator)
{
    if (!strcmp(name,"qemu")) {
        strlcpy(qemu, value, sizeof(qemu));
    } else if (!strncmp(name, "androidboot.", 12) && name_len > 12) {
        const char *boot_prop_name = name + 12; // boot_prop_name: "serialno\0"
        char prop[PROP_NAME_MAX];
        int cnt;

    // prop: "ro.boot.serialno"
    cnt = snprintf(prop, sizeof(prop), "ro.boot.%s", boot_prop_name);
    if (cnt < PROP_NAME_MAX)
        property_set(prop, value);
}

以上确定是通过androidboot.serialno获取的,即通过uboot传递给kernel的cmdline获取的,通过cat /proc/cmdline来查看androidboot.serialno的值即是序列号了,接下来再看bootloader。

bootloader:

找到androidboot.serialno的定义:

bootloader/lk/app/aboot/aboot.c:
static const char *usb_sn_cmdline = " androidboot.serialno=";

查看usb_sn_cmdline的赋值:

unsigned char *update_cmdline(const char * cmdline)
{
    cmdline_len += strlen(usb_sn_cmdline);
    cmdline_len += strlen(sn_buf);
}

猜测sn_buf就是要找的序列号,继续跟踪sn_buf的赋值处:

bootloader/lk/app/aboot/aboot.c
void aboot_init(const struct app_descriptor *app)
{
    target_serialno((unsigned char *) sn_buf);
}

//找到对应target平台下的相应实现:
void target_serialno(unsigned char *buf)
{
        uint32_t serialno;
        if (target_is_emmc_boot()) {
                serialno = mmc_get_psn();
                snprintf((char *)buf, 13, "%x", serialno);
        }
}

// 再找对应的mmc_get_psn的实现(到此基本可以确定如果是emmcboot的方式,sn应该就是emmc的chipid了)
bootloader/lk/platform/msm_shared/mmc.c:
unsigned mmc_get_psn(void)
{
        return mmc_card.cid.psn;
}

 

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值