[//]: # (@formatter:off)
# Android_CN_OAID
![Release APK](https://github.com/gzu-liyujiang/Android_CN_OAID/workflows/Release%20APK/badge.svg)
![Gradle Package](https://github.com/gzu-liyujiang/Android_CN_OAID/workflows/Gradle%20Package/badge.svg)
安卓设备唯一标识解决方案,可作为移动安全联盟统一 SDK (miit_mdid_xxx.aar)的替代方案。
**注意,这个项目的初衷主要是针对个人开发者的APP,个人开发者没资格使用 MSA 的 SDK,企业的APP应该去申请使用 MSA 的 SDK**。
本项目提供了国内各大手机厂商获取 OAID(开放匿名设备标识)及海外手机平台获取 AAID(安卓广告标识)的便携接口,
另外也提供了 IMEI/MEID、AndroidID、PseudoID、GUID 等常见的设备标识的获取方法。
- 震惊:从没想过之前的参考资料之一 https://github.com/2tu/msa 会被 MSA 举报,作为行业技术标准还兴搞技术垄断,要传播使用 MSA 的 SDK 真是一言难尽啊,参见 https://github.com/github/dmca/blob/master/2023/09/2023-09-21-msa.md 。
- 声明:本库虽然曾经逆向分析过 MSA 的 SDK ,但代码完全是原创的,是基于[北京数字联盟公开的代码](https://github.com/shuzilm-open-source/Get_Oaid_CNAdid)并结合第三方厂商公开或未公开的接口进行加工的,和 MSA 的 SDK 没有直接联系,不存在 `2tu/msa` 之类的侵权问题。根据北京数字联盟的声明,“……标准法的第二十二条规定:……禁止利用标准实施妨碍商品、服务自由流通等排除、限制市场竞争的行为。作为商用 ID 服务商,良性竞争能够让我们的产品变得更好……”,详见[请问该库商用有法律风险吗?](https://github.com/gzu-liyujiang/Android_CN_OAID/issues/50)
- GitHub:`https://github.com/gzu-liyujiang/Android_CN_OAID`
- 码云(GitEE):`https://gitee.com/li_yu_jiang/Android_CN_OAID`
- Demo:[https://github.com/gzu-liyujiang/Android_CN_OAID/blob/master/demo.apk](/demo.apk)
【抱歉!各位小伙伴,从2022年开始我已经没做安卓开发了,项目虽然已经趋于稳定,不过需要大家参与维护,多提PullRequest,我目前已经没法贡献代码了】
## 接入指引
最新版本:[![jitpack](https://jitpack.io/v/gzu-liyujiang/Android_CN_OAID.svg)](https://jitpack.io/#gzu-liyujiang/Android_CN_OAID)
([更新日志](/CHANGELOG.md) | [JavaDoc](https://gzu-liyujiang.github.io/Android_CN_OAID/))
### 依赖配置
如果你的项目 Gradle 配置是在 7.0 以下,需要在 build.gradle 文件中加入:
```groovy
allprojects {
repositories {
// JitPack 远程仓库
maven { url 'https://jitpack.io' }
}
}
```
如果你的 Gradle 配置是 7.0 及以上,可能需要在 settings.gradle 文件中加入:
```groovy
dependencyResolutionManagement {
repositories {
// JitPack 远程仓库
maven { url 'https://jitpack.io' }
}
}
```
然后直接使用如下依赖即可:[![jitpack](https://jitpack.io/v/gzu-liyujiang/Android_CN_OAID.svg)](https://jitpack.io/#gzu-liyujiang/Android_CN_OAID)
```groovy
dependencies {
implementation 'com.github.gzu-liyujiang:Android_CN_OAID:最新版本号'
}
```
除了依赖从 Github 拉取代码构建的包外,也可以依赖从码云构建的包:
```groovy
dependencies {
implementation 'com.gitee.li_yu_jiang:Android_CN_OAID:最新版本号'
}
```
### 注意事项
- **4.2.5.1 版本以后直接使用了华为官方广告标识服务SDK,与移动安全联盟 SDK 共存** 的话可参考如下配置(PS:暂时没太多经历逆向华为的SDK重构包名来共存):
```groovy
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'
}
}
```
- 自 **4.1.1** 开始默认加入了 `READ_PHONE_STATE`、`WRITE_SETTINGS`及`WRITE_EXTERNAL_STORAGE` 权限以便适配低版本安卓系统。
- 为**遵循最小必要原则**保护用户隐私,若项目中没用到 IMEI 及 GUID,那么可酌情在 `AndroidManifest.xml` 中加入如下代码移除相关权限:
```xml
<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>
```
- **本库 4.1.1 至 4.1.3 之间的版本** ,若 Gradle 插件未指定 `targetSdkVersion 29+`,在 Android11+ 设备上可能会导致无法动态申请读写权限问题,参阅 [在权限里面加 maxSdkVersion 的用意](https://github.com/gzu-liyujiang/Android_CN_OAID/issues/25) 。
- **Gradle Plugin 4.0.0 及以下版本编译失败解决方案** ,参阅 [Missing 'package' key attribute on element package](https://github.com/gzu-liyujiang/Android_CN_OAID/issues/26) 。
### 代码示例
获取多个可能的设备标识,结合服务端引入[拜占庭容错方案](https://juejin.cn/post/6844903952148856839#heading-11)得到可靠的稳定的设备唯一标识:
- 第一步(可选的,用于调用 getClientId() 预取 OAID ):
```text
// 在`Application#onCreate`里初始化,注意APP合规性,若最终用户未同意隐私政策则不要调用
@Override
public void onCreate() {
super.onCreate();
if (privacyPolicyAgreed) {
DeviceIdentifier.register(this);
}
}
```
- 第二步:
```text
// 获取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`如下混淆规则,不混淆厂商的相关接口及类。若通过远程依赖的方式引用,则无需进行额外配置:
```proguard
# 本库模块专用的混淆规则(注:“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.Supplementary
徐浪老师
- 粉丝: 8554
- 资源: 1万+
最新资源
- springboot项目基于html的网上团购系统设计与实现.zip
- 220v3300w半桥电磁炉源代码 合泰半桥电磁炉ht45f0074 半桥电磁炉,半桥电磁炉程序电磁炉源程序,电磁炉程序代码,电磁炉开发整套资料,合泰HT45F0074综合资料含有单片机源码,主板PC
- springboot项目基于html的民谣网站的设计与实现.zip
- springboot项目基于Java web的药店管理系统的设计与实现.zip
- springboot项目基于javaEE的校园二手书交易平台的设计与实现.zip
- springboot项目基于HTML语言的环保网站的设计与实现.zip
- springboot项目基于JavaWeb的宠物商城网站设计与实现.zip
- springboot项目基于javaweb的学生用品采购系统.zip
- 电网杆塔训练资源voc格式,已划分好train、val、test
- springboot项目基于JavaWeb的鲜牛奶订购系统的设计与实现.zip
- springboot项目基于javaweb的影院订票系统的设计与实现.zip
- springboot项目基于java的火车票订票系统的设计与实现.zip
- springboot项目基于JAVA的房地产销售管理系统的设计与实现.zip
- OpenCV答题卡识别系统C++实现源码+作业报告.zip
- springboot项目基于Java的家政服务平台的设计与实现.zip
- springboot项目基于Java的民宿管理系统.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈