现象
目前的oaid生成不稳定,会出现生成失败,或者无法生成的问题。导致用户重复绑定。
调研
当前生成方案
目前是通过移动联盟提供的 oaid sdk 作为生成 唯一设备标识。
版本:oaid_sdk 1.0.25
验证生成oaid代码
神策
原理
里面还是通过 msa 进行生成,通过反射,调用各个版本:
InitSdk
结果:
大部分手机,可以获取,少数手机不行
通过的msa oaid获取
原理
都是都通过msa的sdk获取。
结果同上。
msa 的版本升级验证
目前tt采用的是: 版本:oaid_sdk 1.0.25
最新版本,1.2.1:但是需要证书
https://github.com/2tu/msa
验证未创建证书结果:
证书创建:
线上其他生成方式
方案一:通过反射,根据每部手机,反射调用系统提供的方法获取
原理
逻辑基本大同小异,以oppo手机为例:
代码片段1:
https://github.com/gzu-liyujiang/Android_CN_OAID
代码片段2:
https://github.com/dikxia/OaidLite
代码片段3:
https://github.com/shuzilm-open-source/Get_Oaid_CNAdid
结论
在oppo手机上,目前验证的机型,都获取了oaid
方案二:获取设备的常用数据
- imei
需要READ_PHONE_STATE权限 - AndroidId
可能为空
Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID)
- 获取数字版权管理设备ID
可能为空
通过取出ROM版本、制造商、CPU型号以及其他硬件信息来伪造设备标识
参考:https://blog.csdn.net/u013290250/article/details/118580373
代码:https://github.com/z244370114/DeviceLibray
设备指纹算法:
第一部分:imei/meid,双卡时优先取meid,取不到meid的情况下取固定的imei(多个imei必须固定取一个,不能随机取其中之一),得到串1。
第二部分:设备串号serial不为空时,拼接android.os.Build.MANUFACTURER,得到串2。注意,如果串1和串2中的serial都为空,则取Mac地址+android.os.Build.MANUFACTURER作为串2(注意取法上需要兼容6.0、7.0、9.0以上)。
第三部分:静态硬件字段组合,依次拼接下面的字段,以"/"为分隔符号,进行32位md5小端法计算得到串3
android.os.Build.BOARD
android.os.Build.BRAND
android.os.Build.DEVICE
android.os.Build.HARDWARE
android.os.Build.MODEL
android:os.Build.PRODUCT
android.os.Build.TAGS
android.os.Build.TYPE
android.os.Build.USER
android.os.Build.SUPPORTED_ABIS 数组依次拼接
android.os.Build.CPU_ABI
screenWidth
screenHeight
screenDensity
screenDensityDpi
将串1、2、3依次拼接进行32位md5小端法计算得到device_id。
客户端需要缓存得到的device_id,注意存放的位置,在外部存储中以特定隐藏文件夹+隐藏文件的形式存放,包删除后文件不被删除,别的包安装后先读取指定这个隐藏文件的内容,有device_id则直接用,无则生成;
结论:唯一标识生成方案
第一步
通过msa 移动联盟,提供的方法,继承 oaid_sdk_1.0.25 版本,获取手机的oaid
ps:msa,不升级,这样不需要额外申请证书。
第二步
通过反射,根据每部手机,反射调用系统提供的方法获取。
ps:由于项目目前采用的是msa方式生成,故反射放在第二步,如果不考虑历史原因,建议先采用第二步。
第三步
获取设备的常用数据,然后拼接成md5值,作为设备唯一标识。
第四步
以上方法出现空,或者异常,采用随机生成的方式,进行处理。
配套方案
1、采用sp配合使用
2、采用文件读取,配合使用
用于项目要符合国际安全标准,文件授权的问题,需要考虑