本项目抹平了各大 Android 手机厂商获取 OAID(开放匿名标识)的差异性,轻松通过几句代码即可获取不同手机的 OAID,可作为移动安全联盟官网提供的 SDK 闭源方案(miit_mdid_xxx.aar)的替代方案。
allprojects {
repositories {
maven { url 'https://www.jitpack.io' }
}
}
在没有用到移动安全联盟SDK的情况下,依赖如下:
dependencies {
implementation 'com.github.gzu-liyujiang.Android_CN_OAID:OAID_ASUS:版本号' //华硕
implementation 'com.github.gzu-liyujiang.Android_CN_OAID:OAID_BUN:版本号' //中兴、卓易
implementation 'com.github.gzu-liyujiang.Android_CN_OAID:OAID_HEYTAP:版本号' //欧珀、一加
implementation 'com.github.gzu-liyujiang.Android_CN_OAID:OAID_SAMSUNG:版本号' //三星
implementation 'com.github.gzu-liyujiang.Android_CN_OAID:OAID_UODIS:版本号' //华为
implementation 'com.github.gzu-liyujiang.Android_CN_OAID:OAID_ZUI:版本号' //联想、摩托罗拉
implementation 'com.github.gzu-liyujiang.Android_CN_OAID:OAID_IMPL:版本号' //具体实现
}
若项目中直接或间接地使用了移动安全联盟的SDK,则可能需要取消相关有冲突的依赖项,例如,取消和“msa_mdid_1.0.22.aar”有冲突的项依赖如下:
dependencies {
//implementation 'com.github.gzu-liyujiang.Android_CN_OAID:OAID_ASUS:版本号' //华硕
//implementation 'com.github.gzu-liyujiang.Android_CN_OAID:OAID_BUN:版本号' //中兴、卓易
implementation 'com.github.gzu-liyujiang.Android_CN_OAID:OAID_HEYTAP:版本号' //欧珀、一加
//implementation 'com.github.gzu-liyujiang.Android_CN_OAID:OAID_SAMSUNG:版本号' //三星
implementation 'com.github.gzu-liyujiang.Android_CN_OAID:OAID_UODIS:版本号' //华为
implementation 'com.github.gzu-liyujiang.Android_CN_OAID:OAID_ZUI:版本号' //联想、摩托罗拉
implementation 'com.github.gzu-liyujiang.Android_CN_OAID:OAID_IMPL:版本号' //具体实现
}
获取多个可能的设备标识,结合服务端引入拜占庭容错方案得到可靠的稳定的设备唯一标识:
// 获取DID/IMEI/MEID,只支持Android 10之前的系统,需要READ_PHONE_STATE权限,可能为空
DeviceID.getUniqueID(context);
// 获取安卓ID,可能为空
DeviceID.getAndroidID(context);
// 获取伪造ID,根据硬件信息生成,不会为空,有大概率会重复
DeviceID.getPseudoID();
// 获取GUID,随机生成,存到SharedPreferences,不会为空
DeviceID.getGUID(context);
获取OAID:DeviceID.with(context).doGet(new IOAIDGetter() { ... });
IDeviceId deviceId = DeviceID.with(context);
if (!deviceId.supportOAID()) {
// 不支持OAID,须自行生成GUID。
return;
}
deviceId.doGet(new IOAIDGetter() {
@Override
public void onOAIDGetComplete(@NonNull String oaid) {
// 不同厂商的OAID格式是不一样的,可进行MD5、SHA1之类的哈希运算统一
}
@Override
public void onOAIDGetError(@NonNull Exception exception) {
// 获取OAID失败
}
});
本库自带consumer-rules.pro
混淆规则,不混淆厂商的相关接口及类。若通过远程依赖的方式应用,则无需进行额外配置:
-keep class com.asus.msa.SupplementaryDID.** { *; }
-keep interface com.asus.msa.SupplementaryDID.** { *; }
-keep class com.bun.lib.** { *; }
-keep interface com.bun.lib.** { *; }
-keep class com.heytap.openid.** { *; }
-keep interface com.heytap.openid.** { *; }
-keep class com.samsung.android.deviceidservice.** { *; }
-keep interface com.samsung.android.deviceidservice.** { *; }
-keep class com.uodis.opendevice.aidl.** { *; }
-keep interface com.uodis.opendevice.aidl.** { *; }
-keep class com.zui.deviceidservice.** { *; }
-keep interface com.zui.deviceidservice.** { *; }
厂商 | 版本 |
---|---|
小米(Xiaomi) | MIUI 10.2 及以上 |
黑鲨(BlackShark) | MIUI 10.2 及以上 |
维沃(VIVO) | Funtouch OS 9 及以上 |
华为(Huawei) | HMS 2.6.2 及以上 |
欧珀(OPPO) | Color OS 7.0 及以上 |
联想(Lenovo) | ZUI 11.4 及以上 |
摩托罗拉(Motorola) | ZUI 11.4 及以上 |
华硕(ASUS) | Android 10 及以上 |
魅族(Meizu) | Android 10 及以上 |
三星(Samsung) | Android 10 及以上 |
努比亚(Nubia) | Android 10 及以上 |
一加(OnePlus) | Android 10 及以上 |
中兴(ZTE) | Android 10 及以上 |
卓易(Freeme OS) | Android 10 及以上 |
注:本项目的OAID获取接口主要参考北京数字联盟公开的代码并逆向分析参考移动安全联盟的SDK,酷派、乐视、真我、锤子等厂商截止目前(2021.01.19)并未见到移动安全联盟有支持,也未查阅到厂商相关公开资料,,需自行生成GUID。
OAID 即 Open Anonymous Identifier,开放匿名标识符,是移动智能终端补充设备标识体系中的一员。
- 谷歌官方文档 使用标识符的最佳做法 。
- 团体标准-移动智能终端补充设备标识规范-v20190516.pdf 。
- 华为官方文档 《获取 OAID 信息(SDK 方式)》 。
- Flyme SDK 移动智能终端补充设备标识 。
- 北京数字联盟公开的获取各厂商 OAID 的简易代码:Get_Oaid_CNAdid。
- 获取或生成设备唯一标识后,推荐参考“一种 Android 移动设备构造 UDID 的方案 ”。
- StackOverFlow Is there a unique Android device ID ? 。
Copyright (c) 2019-2021 gzu-liyujiang <[email protected]>
The software is licensed under the Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
PURPOSE.
See the Mulan PSL v2 for more details.