• 修改安卓ID为硬件唯一ID


    前言:

    • 最近接到个需求,我们新产品上的外包侧APP需要使用硬件唯一ID(不管怎么升级怎么操作,ID始终不变和硬件绑定),用来做权限校验。
    • 由于了解到安卓ID或序列号都会在擦除升级后重新随机生成,所以这里使用硬件上的ID来作为唯一ID,接下来进入正题
    • 此篇以安卓7.1系统为例

    一,常用硬件信息ID

    这里列举一些常用的一芯一码ID查询获取方式

    1. CPU ID

    我们当前所使用的主芯片RK3128上没有CPU id,此处也举个例

    shell命令:

    cat /proc/cpuinfo | grep Serial

    结果如下:(rk3128上没有固定ID,所以显示的为0)

    Serial          : 0000000000000000

    2. eMMC/Flash ID

    使用存储芯片eMMC(Embedded Multi Media Card)/Flash的cid

    shell命令:

     cat /sys/bus/mmc/devices/mmc0:0001/cid

    这里的mmc0:0001可能为其他地址,请按实际来,结果如下:

    150100424a5444345203e977be8f4963

    此处的Cid的32字节的字串,格式如下:

    MID: [127:120]   —— 8bit(1Byte)Manufacturer ID,由MMCA分配,比如Sandisk为0x02,Kingston为0x37,Samsung为0x15。
    
    OID: [119:104]   —— 16bit OEN/Application ID,OEM/应用ID号,也由MMCA分配。
    
    PNM: [103:64]    —— 40bit Product Name,产品名称。
    
    PRV: [63:56]     —— 8bit Product revision,产品版本,前4bit fw版本,后4bit hw版本。
    
    PSN: [55:24]     —— 32bit Product serial number,产品序列号。
    
    MDT: [19:8]     —— 12bit Manufacturing date,生产日期,前4bit是月份,后8bit为年份,0对应2000年。
    
    CRC: [7:1]       —— 7bit CRC7 checksum,循环冗余校验。

    3. 其他ID

    因为每个平台所配置的外设不一样,实际还需根据情况获取。

    二,应用硬件ID

    在应用硬件ID之前,我们先把安卓framework层中的随机生成安卓ID的部分修改了

    1. 修改framework安卓ID生成源数据

    1. 进到android系统源码里,目录:

    frameworks/base/packages/SettingsProvider/src/com/android/providers/settings

    1. 打开SettingsProvider.java

    先improt相关的包:

    import android.os.SystemProperties;

    然后修改private void ensureSecureSettingAndroidIdSetLocked(SettingsState secureSettings)方法中的 String androidId

    //建议把后面的默认值改为固定一个ID,个人感觉固定比随机好
    String androidId = SystemProperties.get("ro.serialno", Long.toHexString(new SecureRandom().nextLong()));

    PS:原理就是通过序列号的固定值替换生成的随机值。当然,具体用哪个属性值去替换,由咱们自己决定。此处以ro.serialno为例

    2. 获取硬件值ID应用到属性

    通过上个步骤我们已经把安卓ID给固定到了ro.serialno属性值上,下面我们就修改这个属性值

    ps:关于安卓序列号产生的流程,可参考我另一篇笔记安卓ro.serialno产生的整个流程

    1. 让ro.serialno不再从cmdline上获取

    a. 打开安卓系统源码: system/core/init/init.cpp

    b. 找到export_kernel_boot_props这个函数

    c. 注释掉prop_map结构体数组中的这一组值

    如上即可

    1. 将硬件ID应用到属性

      这里主要是将获取到的ID使用property_set设进sys.serialno这个属性里,然后再init.rc里通过如下设进ro.serialno这个属性里

      # set ro.serialno
      on property:sys.serialno=*
          setprop ro.serialno ${sys.serialno}

      主要修改drmservice服务,路径:system/core/drmservice/drmservice.c

      diff patch如下:

      3. 查看结果

      将上面patch应用到项目当中,通过如下命令可查看是否生效:

      adb shell settings get secure android_id #查看安卓ID
      adb get-serialno #查看序列号

      例:

      PS E:\> adb get-serialno
      5203e977be8e4975
      PS E:\> adb shell settings get secure android_id
      5203e977be8e4975
      PS E:\>

      end

      感谢阅读~

      希望能帮到你~

      see you~

      码字不易,转载请注明原作者 ~ (from:https://erdong.work


    __EOF__

  • 本文作者: 耳东Sir
  • 本文链接: https://www.cnblogs.com/erdongsir/p/17148263.html
  • 关于博主: I am a good person
  • 版权声明: 欢迎转载,但转载请注明来源~
  • 声援博主: up这个重庆崽儿还得行~
  • 相关阅读:
    Linux下 coredump 文件定位方法说明
    车路协同自动驾驶研究
    md5在线加密解密是不是什么都能解密?为什么我的没有解出来呢?
    康士柏新能源汽车检测设备-科技之光 驶向未来
    二叉排序树(Java版)
    MyBatis实现延时加载的方式
    入门人工智能 —— 学习 python 使用 IDE :vscode 完成编程 (2)
    安卓magisk刷root权限
    supervisor安装使用
    Minikube使用文档
  • 原文地址:https://www.cnblogs.com/erdongsir/p/17148263.html