各大 Android 手机厂商获取 OAID 开源项目!

该项目提供了一种方式来统一获取不同Android手机厂商的OAID(开放匿名标识),作为移动安全联盟SDK的替代方案。依赖配置简单,支持华硕、中兴、欧珀、三星、华为、联想等多个厂商。代码示例展示了如何实时和预先获取设备标识符,包括OAID、AndroidID、UniqueID等,并提供了混淆规则和厂商支持情况。
摘要由CSDN通过智能技术生成

code小生 一个专注大前端领域的技术平台

公众号回复Android加入安卓技术群

本项目抹平了各大 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:版本号'  //具体实现
}

代码示例

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

  • 用法一:实时获取设备标识符

        final StringBuilder builder = new StringBuilder();
        builder.append("UniqueID: ");
        // 获取设备唯一标识,只支持Android 10之前的系统,需要READ_PHONE_STATE权限,可能为空
        String uniqueID = DeviceID.getUniqueID(this);
        if (TextUtils.isEmpty(uniqueID)) {
            builder.append("DID/IMEI/MEID获取失败");
        } else {
            builder.append(uniqueID);
        }
        builder.append("\n");
        builder.append("AndroidID: ");
        // 获取安卓ID,可能为空
        String androidID = DeviceID.getAndroidID(this);
        if (TextUtils.isEmpty(androidID)) {
            builder.append("AndroidID获取失败");
        } else {
            builder.append(androidID);
        }
        builder.append("\n");
        builder.append("WidevineID: ");
        // 获取数字版权管理ID,可能为空
        String widevineID = DeviceID.getWidevineID(this);
        if (TextUtils.isEmpty(widevineID)) {
            builder.append("WidevineID获取失败");
        } else {
            builder.append(widevineID);
        }
        builder.append("\n");
        builder.append("PseudoID: ");
        // 获取伪造ID,根据硬件信息生成,不会为空,有大概率会重复
        builder.append(DeviceID.getPseudoID());
        builder.append("\n");
        builder.append("GUID: ");
        // 获取GUID,随机生成,不会为空
        builder.append(DeviceID.getGUID(this));
        builder.append("\n");
        // 是否支持OAID
        builder.append("supportedOAID:").append(DeviceID.supportedOAID(this));
        builder.append("\n");
        // 获取OAID,异步回调
        DeviceID.getOAID(this, new IGetter() {
            @Override
            public void onOAIDGetComplete(@NonNull String result) {
                // 不同厂商的OAID格式是不一样的,可进行MD5、SHA1之类的哈希运算统一
                builder.append("OAID: ").append(result);
                tvDeviceIdResult.setText(builder);
            }

            @Override
            public void onOAIDGetError(@NonNull Throwable error) {
                // 获取OAID失败
                builder.append("OAID: ").append(error);
                tvDeviceIdResult.setText(builder);
            }
        });

  • 用法二:预先获取设备标识符

    // 在 Application#onCreate 里调用预取
    DeviceID.register(this);
    // 在需要用到设备标识的地方获取
    // 设备标识统一格式为MD5:DeviceID.getClientIdMD5()
    // 设备标识统一格式为SHA1:DeviceID.getClientIdSHA1()
    tvDeviceIdResult.setText(String.format("DeviceID: %s", DeviceID.getClientId()));

混淆规则

本库自带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。

项目地址

开源地址:https://gitee.com/li_yu_jiang/Android_CN_OAIDf

版权申明:内容来源网络,版权归原创者所有。除非无法确认,都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意!


推荐阅读为什么现在开发一款软件的时间越来越长?
腾讯开源:Kotlin 高性能特效动画组件!
十六年全栈开发者的 Android 开发踩坑实录
使用 Kotlin 开发几个月后,团队决定回归 Java
Android 实现小红书登陆页面背景图无限滚动效果

如果你有写博客的好习惯欢迎投稿

更文不易,点个“在看”小生感恩❤️
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值