OAID 简介
因传统的移动终端设备标识如国际移动设备识别码(IMEI)等已被部分国家认定为用户隐私的一部分,并存在被篡改和冒用的风险,所以在Android 10及后续版本中非厂商系统应用将无法获取IMEI、MAC等设备信息。无法获取IMEI会在用户行为统计过程中对设备识别产生一定影响。
近日移动安全联盟针对该问题联合国内手机厂商推出补充设备标准体系方案,选择OAID字段作为IMEI等的替代字段。OAID字段是由中国信通院联合华为、小米、OPPO、VIVO等厂商共同推出的设备识别字段,具有一定的权威性,可满足用户行为统计的使用场景。
PS:简单理解就是从 Android 10 开始 ,我们上线的应用将无法在获取 IMEI 、MAC 等设备信息 。有什么影响呢 ?如果使用百度统计的话 ,将会在用户统计过程中对设备识别产生影响;如果项目中使用 IMEI 数据的话 ,你肯定获取不到了 ,可以试一下看看会返回 Null 吗 。
然后我这边要求在这一版本上接入 OAID ,其实项目中我没有使用 IMEI 这个字段数据 ,所以单纯项目里面没有什么影响,主要是百度统计的问题 。
接入 OAID 的考虑
讲真的,我是不太赞同接入这个移动安全联盟的 OAID的。
1. 兼容设备厂商问题
目前并没有做到国内厂商的兼容 ,我相信未来一定是可以实现的。目前是主流的 华为、小米、OPPO、VIVO 。你可以看一下应用统计里面的数据 ,这几个厂商几乎全部的份额 。
2.更新日志 (如下图)
看上面的日志 ,我相信很多人都能一下子看出来那些能造成闪退的日志 。关于这一点是比较担心的 。如果百度统计没有统计到设备信息问题不大,但是接入这个SDK造成一些未知闪退就有点尴尬了。Android 开发都知道 ,这些未知的兼容问题是很致命的 。
说这么多没用 ,还是的接入
直接看OAID的接入pdf就可以了 。什么aar包 、什么json文件等等都比较简单 。有个迷惑性的问题就是接入 pdf 中代码调入这一块。
就是在获取设备 ID 的时候这些东西。看上面截图 ,有两种获取方式
首先看 b1 :因为 Android 9 以后类加载的限制 ,所以 Android 9 以后不建议使用这个方法 ,如需使用,需要做 MdidSdk.InitSdk 和 JLibrary.InitEntry()不能在一个类 里,还要注意包含这两个调用的类不能有依赖关系。 什么意思呢 ?就是这两行代码不能在同一个类里面。
然后看b2:反射调用 ,它的好处是 android 版本号无关,缺点是调用时间估计会长, 经过测试跟直接调用在用时上区别不大。这就很尴尬了 。
PS:那么我们到底使用哪个方式调用获取设备ID呢 ? b1是不建议使用 ,b2是可能调用时间会长但是经过测试跟直接调用在用事上区别不大 。哈哈哈 ,要是我选的话 ,那肯定是 b1 呀 ,麻烦点就麻烦点 。说实话 ,在项目总应该是很少去使用 反射这个黑科技的 ,到目前为止我认为是有益无害 。
PS :因为现在在家办公 ,手里没有 Android 10 的测试机 ,所以等下周到公司把他的代码给跑一遍试试 。
待续。。。
PS:开始还这个技术债
获取 IMEI 代码
public static String getIMEI(Context context){
String imei = "";
try {
TelephonyManager tm = (TelephonyManager) context.getSystemService(TELEPHONY_SERVICE);
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP){
imei = tm.getDeviceId();
}else {
Method method = tm.getClass().getMethod("getImei");
imei = (String) method.invoke(tm);
Log.i("AAAAAAAAAAAA","IMEI = " + imei);
}
} catch (Exception e) {
e.printStackTrace();
}
return imei;
}
测试手机:华为 P30 ,Android 系统 10
打印结果
2020-03-06 13:34:43.839 20110-20110/************* I/AAAAAAAAAAAA: IMEI = null
测试手机:小米 8 ,Android 系统 9
2020-03-06 13:46:00.911 14886-14886/*********** I/AAAAAAAAAAAA: IMEI = 861268046826351