git:GitHub - gzu-liyujiang/Android_CN_OAID: 安卓设备唯一标识解决方案,可完全替代移动安全联盟统一 SDK 闭源方案。包括国内手机厂商的开放匿名标识(OAID)、海外手机平台的安卓广告标识(AAID),另外也提供了 IMEI/MEID、AndroidID、WidevineID、PseudoID、GUID 等常见的设备标识的获取方法。
?使用
全局build.gradle中
allprojects {
repositories {
maven { url 'https://www.jitpack.io' }
}
}
?app?build.gradle中
api 'com.github.gzu-liyujiang:Android_CN_OAID:4.2.4'
// 在`Application#onCreate`里初始化,注意APP合规性,若最终用户未同意隐私政策则不要调用
@Override
public void onCreate() {
super.onCreate();
if (privacyPolicyAgreed) {
DeviceIdentifier.register(this);
}
}
获取方法
// 获取IMEI,只支持Android 10之前的系统,需要READ_PHONE_STATE权限,可能为空
DeviceIdentifier.getIMEI(this);
// 获取安卓ID,可能为空
DeviceIdentifier.getAndroidID(this);
// 获取数字版权管理ID,可能为空
DeviceIdentifier.getWidevineID();
// 获取伪造ID,根据硬件信息生成,不会为空,有大概率会重复
DeviceIdentifier.getPseudoID();
// 获取GUID,随机生成,不会为空
DeviceIdentifier.getGUID(this);
// 是否支持OAID/AAID
DeviceID.supportedOAID(this);
// 获取OAID/AAID,同步调用
DeviceIdentifier.getOAID(this);
// 获取OAID/AAID,异步回调
DeviceID.getOAID(this, new IGetter() {
@Override
public void onOAIDGetComplete(String result) {
// 不同厂商的OAID/AAID格式是不一样的,可进行MD5、SHA1之类的哈希运算统一
}
@Override
public void onOAIDGetError(Exception error) {
// 获取OAID/AAID失败
}
});
混淆规则
-keep class repeackage.com.uodis.opendevice.aidl.** { *; }
-keep interface repeackage.com.uodis.opendevice.aidl.** { *; }
-keep class repeackage.com.asus.msa.SupplementaryDID.** { *; }
-keep interface repeackage.com.asus.msa.SupplementaryDID.** { *; }
-keep class repeackage.com.bun.lib.** { *; }
-keep interface repeackage.com.bun.lib.** { *; }
-keep class repeackage.com.heytap.openid.** { *; }
-keep interface repeackage.com.heytap.openid.** { *; }
-keep class repeackage.com.samsung.android.deviceidservice.** { *; }
-keep interface repeackage.com.samsung.android.deviceidservice.** { *; }
-keep class repeackage.com.zui.deviceidservice.** { *; }
-keep interface repeackage.com.zui.deviceidservice.** { *; }
-keep class repeackage.com.coolpad.deviceidsupport.** { *; }
-keep interface repeackage.com.coolpad.deviceidsupport.** { *; }
-keep class repeackage.com.android.creator.** { *; }
-keep interface repeackage.com.android.creator.** { *; }
支持情况
厂商或品牌 | 系统或框架 |
---|
华为(Huawei、Honor) | HMS Core 2.6.2+ 、Google Play Service 4.0+ | 小米(XiaoMi、Redmi、BlackShark) | MIUI 10.2+、Google Play Service 4.0+ | 维沃(VIVO、IQOO) | Funtouch OS 9+、OriginOS 1.0+、Google Play Service 4.0+ | 欧珀(OPPO、Realme) | ColorOS 7.0+、Google Play Service 4.0+ | 三星(Samsung) | Android 10+、Google Play Service 4.0+ | 联想(Lenovo) | ZUI 11.4+、Google Play Service 4.0+ | 华硕(ASUS) | Android 10+、Google Play Service 4.0+ | 魅族(Meizu) | Android 10+、Google Play Service 4.0+ | 一加(OnePlus) | Android 10+、Google Play Service 4.0+ | 努比亚(Nubia) | Android 10+、Google Play Service 4.0+ | 酷派(Coolpad) | CoolOS、Google Play Service 4.0+ | 酷赛(Coosea ) | Android 10+、Google Play Service 4.0+ | 卓易(Droi ) | Freeme OS、Google Play Service 4.0+ | 其他(ZTE、HTC、Motorola、……) | SSUI、Google Play Service 4.0+ |
?OAID(开放匿名设备标识符)
?
其他手机请残照 上面网址的下方readMe
?我简单封装了一下 需要可以用我封装好的
//获取安卓ID,可能为空
fun getAndroidId(context: Context): String? {
return DeviceIdentifier.getAndroidID(context);
}
//获取IMEI,只支持Android 10之前的系统,需要READ_PHONE_STATE权限,可能为空
fun getImei(context: Context): String {
return DeviceIdentifier.getIMEI(context);
}
/**
* 获取设备唯一ID
*/
fun getUniqueDeviceId(context: Context): String {
//oaid
val supportedOAID = DeviceID.supportedOAID(context);
if(supportedOAID){
// 获取OAID/AAID,同步调用
val oaid = DeviceIdentifier.getOAID(context);
return oaid
}
//android Id
val androidId = getAndroidId(context);
if (!TextUtils.isEmpty(androidId)) {
return androidId!!;
}
// 获取数字版权管理ID,可能为空
val widevineID = DeviceIdentifier.getWidevineID();
if (!TextUtils.isEmpty(widevineID)) {
return widevineID!!;
}
// 获取伪造ID,根据硬件信息生成,不会为空,有大概率会重复
val pseudoID = DeviceIdentifier.getPseudoID();
if (!TextUtils.isEmpty(pseudoID)) {
return pseudoID!!;
}
//串号
val imei = getImei(context)
if (!TextUtils.isEmpty(imei)) {
return imei;
}
return "";
}
// 获取GUID,随机生成,不会为空 不会重复
private fun getGuid(context: Context): String? {
val guid = DeviceIdentifier.getGUID(context);
return guid
}
// 获取UUID,随机生成,不会为空 不会重复
private fun getUUID(context: Context): String {
val uniqueID: String = UUID.randomUUID().toString()
return uniqueID
}
|