gzu-liyujiang / Android_CN_OAID

安卓设备唯一标识解决方案,可替代移动安全联盟(MSA)统一 SDK 闭源方案。包括国内手机厂商的开放匿名标识(OAID)、海外手机平台的安卓广告标识(AAID),另外也提供了 IMEI/MEID、AndroidID、WidevineID、PseudoID、GUID 等常见的设备标识的获取方法。
https://gzu-liyujiang.github.io/Android_CN_OAID/
Other
2.21k stars 327 forks source link
aaid androidid deviceid guid imei imsi meid miit msa oaid udid uniqueid utdid uuid widevine

Android_CN_OAID

Release APK Gradle Package

安卓设备唯一标识解决方案,可作为移动安全联盟统一 SDK (miit_mdid_xxx.aar)的替代方案。 注意,这个项目的初衷主要是针对个人开发者的APP,个人开发者没资格使用 MSA 的 SDK,企业的APP应该去申请使用 MSA 的 SDK。 本项目提供了国内各大手机厂商获取 OAID(开放匿名设备标识)及海外手机平台获取 AAID(安卓广告标识)的便携接口, 另外也提供了 IMEI/MEID、AndroidID、PseudoID、GUID 等常见的设备标识的获取方法。

接入指引

最新版本:jitpack更新日志 | JavaDoc

依赖配置

如果你的项目 Gradle 配置是在 7.0 以下,需要在 build.gradle 文件中加入:

allprojects {
    repositories {
        // JitPack 远程仓库
        maven { url 'https://jitpack.io' }
    }
}

如果你的 Gradle 配置是 7.0 及以上,可能需要在 settings.gradle 文件中加入:

dependencyResolutionManagement {
    repositories {
        // JitPack 远程仓库
        maven { url 'https://jitpack.io' }
    }
}

然后直接使用如下依赖即可:jitpack

dependencies {
    implementation 'com.github.gzu-liyujiang:Android_CN_OAID:最新版本号'
}

除了依赖从 Github 拉取代码构建的包外,也可以依赖从码云构建的包:

dependencies {
    implementation 'com.gitee.li_yu_jiang:Android_CN_OAID:最新版本号'
}

注意事项

dependencies {
    implementation('com.github.gzu-liyujiang:Android_CN_OAID:最新版本号') {
        // 如果使用了移动安全联盟SDK,共存的话需排除掉本项目依赖的华为/荣耀官方广告标识服务SDK,因为移动安全联盟SDK也依赖了华为/荣耀的SDK
        // 如果华为官方广告标识服务SDK下载失败或编译报错的话,可考虑在 build.gradle 中增加以下配置:
        // repositories { maven { url 'https://developer.huawei.com/repo' } }
        // runtimeOnly "com.huawei.hms:ads-identifier:3.4.62.300"
        exclude group: 'com.huawei.hms', module: 'ads-identifier' 
        // 荣耀官方广告标识服务SDK同理:      
        // repositories { maven { url 'https://developer.hihonor.com/repo' } }
        // runtimeOnly "com.hihonor.mcs:ads-identifier:1.0.2.301"
        exclude group: 'com.hihonor.mcs', module: 'ads-identifier'
    }
}
<manifest>
    <uses-permission android:name="android.permission.READ_PHONE_STATE" tools:node="remove" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" tools:node="remove" />
</manifest>

代码示例

获取多个可能的设备标识,结合服务端引入拜占庭容错方案得到可靠的稳定的设备唯一标识:

    // 在`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,可能为空。很鸡肋,在某些手机上还可能造成卡死或闪退,自4.2.7版本后已弃用
        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失败
            }
        });

混淆规则

本库自带consumer-rules.pro如下混淆规则,不混淆厂商的相关接口及类。若通过远程依赖的方式引用,则无需进行额外配置:

# 本库模块专用的混淆规则(注:“repeackage”拼写是历史遗留问题)
-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.** { *; }
-keep class repeackage.com.google.android.gms.ads.identifier.internal.** { *; }
-keep interface repeackage.com.google.android.gms.ads.identifier.internal.* { *; }
-keep class repeackage.com.oplus.stdid.** {*; }
-keep interface repeackage.com.oplus.stdid.** {*; }
-keep class com.huawei.hms.ads.** {*; }
-keep interface com.huawei.hms.ads.** {*; }
-keep class com.hihonor.ads.** {*; }
-keep interface com.hihonor.ads.** {*; }
-keep class repeackage.com.qiku.id.** { *; }
-keep interface repeackage.com.qiku.id.** { *; }

支持情况

厂商或品牌 系统或框架
华为(Huawei) HMS Core 2.6.2+、Google Play Service 4.0+
荣耀(Honor) Magic UI 4/5/6、MagicOS 7.0+、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 获取接口主要参考北京数字联盟公开的代码以及逆向分析参考移动安全联盟的 SDK、HUAWEI Ads SDK、小米 DeviceId.jar、Google Play Services SDK 等。

效果预览

OAID(开放匿名设备标识符)

AAID(安卓广告标识符)

不支持 OAID 或 AAID

disabled

nonsupport

锤子(Smartisan)、360(360)、奇酷(QiKu)、海信(Hisense)、金立(Gionee)、
美图(Meitu)、糖果(SOAP)、格力(Gree)、朵唯(Doov)、优思(Uniscope)、
夏普(SHARP)、乐视(LeTV)、维图(VOTO)、宏碁(Acer)、TCL(TCL)、……

参考资料

OAID 是移动智能终端补充设备标识体系中的一员,官方定义为 Open Anonymous Device Identifier(开放匿名设备标识符), 华为称之为 Open Advertising ID (开放广告标识符),谷歌称之为 Android Advertising ID (安卓广告标识符)。

远程真机

许可协议

Copyright (c) 2016-present. gzu-liyujiang<1032694760@qq.com> and All Contributors.

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.

IDE 推荐

支持开源,除了 Intellij IDEA Community / PyCharm Community 和 EAP 版本可免费使用,也可通过 申请开源开发许可证 来免费使用正版的 JetBrains 全家桶开发工具,尤其是 Intellij IDEA Ultimate 版本很强大。