【Android_CN_OAID】安卓设备唯一标识解决方案,可作为移动安全联盟统一 SDK (miit_mdid_xxx.aar)的替代方案。
Android_CN_OAID
安卓设备唯一标识解决方案,可作为移动安全联盟统一 SDK (miit_mdid_xxx.aar)的替代方案。本项目提供了国内各大手机厂商获取 OAID(开放匿名设备标识)及海外手机平台获取 AAID (安卓广告标识)的便携接口,另外也提供了 IMEI/MEID、AndroidID、WidevineID、PseudoID、GUID 等常见的设备标识的获取方法。
- GitHub:https://github.com/gzu-liyujiang/Android_CN_OAID
- 码云(GitEE):https://gitee.com/li_yu_jiang/Android_CN_OAID
接入指引
最新版本 | 更新日志 | Java Doc
依赖配置
allprojects {repositories {maven { url 'https://www.jitpack.io' }}
}
dependencies {implementation 'com.github.gzu-liyujiang:Android_CN_OAID:4.1.2'
}
自 4.1.1 开始默认加入了 READ_PHONE_STATE
、WRITE_SETTINGS
及WRITE_EXTERNAL_STORAGE
权限以便适配低版本安卓系统。为遵循最小必要原则保护用户隐私,若项目中没用到 IMEI 及 GUID,那么可酌情在 AndroidManifest.xml
中加入如下代码移除相关权限:
<manifest><uses-permissionandroid:name="android.permission.READ_PHONE_STATE"tools:node="remove" /><uses-permissionandroid:name="android.permission.WRITE_SETTINGS"tools:node="remove" />
</manifest>
代码示例
获取多个可能的设备标识,结合服务端引入拜占庭容错方案得到可靠的稳定的设备唯一标识:
- 用法一:实时获取设备标识符
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/AAIDbuilder.append("supported:").append(DeviceID.supportedOAID(this));builder.append("\n");// 获取OAID/AAID,异步回调DeviceID.getOAID(this, new IGetter() {@Overridepublic void onOAIDGetComplete(@NonNull String result) {// 不同厂商的OAID/AAID格式是不一样的,可进行MD5、SHA1之类的哈希运算统一builder.append("OAID/AAID: ").append(result);tvDeviceIdResult.setText(builder);}@Overridepublic void onOAIDGetError(@NonNull Exception error) {// 获取OAID/AAID失败builder.append("OAID/AAID: 失败,").append(error);tvDeviceIdResult.setText(builder);}});
- 用法二:预先获取设备标识符(建议不要和用法一同时存在)
// 在 Application#onCreate 里调用预取。注意:如果不需要调用`getClientId()`及`getOAID()`,请不要调用这个方法DeviceID.register(this);// 在需要用到设备标识的地方获取// 客户端标识原始值:DeviceID.getClientId()// 客户端标识统一格式为MD5:DeviceID.getClientIdMD5()// 客户端标识统一格式为SHA1:DeviceID.getClientIdSHA1()// 开放匿名设备标识原始值:DeviceID.getOAID()tvDeviceIdResult.setText(String.format("ClientID: %s", DeviceID.getClientIdMD5()));
混淆规则
本库自带consumer-rules.pro
如下混淆规则,不混淆厂商的相关接口及类。若通过远程依赖的方式引用,则无需进行额外配置:
-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.** { *; }
支持情况
厂商或品牌 | 系统或框架 |
---|---|
华为(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+、Origin OS 1.0+、Google Play Service 4.0+ |
欧珀(OPPO、RealMe) | Color OS 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+ |
其他(ZTE、HTC、Motorola、……) | Freeme OS、SSUI、Google Play Service 4.0+ |
注:本项目的 OAID 获取接口主要参考北京数字联盟公开的代码以及逆向分析参考移动安全联盟的 SDK、HUAWEI Ads SDK、小米 DeviceId.jar、Google Play Services SDK 等。
效果预览
OAID(开放匿名设备标识符)
AAID(安卓广告标识符)
不支持 OAID 或 AAID
锤子(Smartisan)、酷派(Yulong,Coolpad)、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 (安卓广告标识符)。
- 移动安全联盟统一 SDK 下载 (from http://www.msa-alliance.cn )。
- 谷歌官方文档 使用标识符的最佳做法 。
- 团体标准-移动智能终端补充设备标识规范-v20190516.pdf 。
- 华为 开放广告标识符(OAID) 。
- 小米 设备标识体系说明 。
- 魅族 移动智能终端补充设备标识 。
- 维沃 移动智能终端补充设备标识服务 。
- 欧珀 移动智能终端补充设备标识体系 。
- 三星 适配指导 | Android Q Device ID 权限变更 。
- 北京数字联盟公开的获取各厂商 OAID 的简易代码:Get_Oaid_CNAdid。
- 获取或生成设备唯一标识后,推荐参考“一种 Android 移动设备构造 UDID 的方案 ”。
- StackOverFlow Is there a unique Android device ID ? 。
远程真机
- 免费 华为远程真机云调试 。
- 免费 小米云测平台远程真机租用 。
- 免费 VIVO 云测平台远程真机 。
- 免费 OPPO 云测平台远程真机 。
- 免费 三星远程开发测试平台真机调试 。
- 新人试用 腾讯 WeTest 云真机调试、阿里 EMAS 移动测试远程真机、百度 MTC 远程真机调试、Testin 远程真机测试、AllTesting 真机测试 。
许可协议
Copyright (c) 2019-2021 gzu-liyujiang <1032694760@qq.com>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.
【Android_CN_OAID】安卓设备唯一标识解决方案,可作为移动安全联盟统一 SDK (miit_mdid_xxx.aar)的替代方案。相关推荐
- 获取安卓设备唯一标识码并存储在SharedPRreferences中
前言:设备登陆时提供设备序列号信息传到后端,安卓设备日新月异,一些设备仅支持wifi上网即没插卡功能,且互联网企业APP根本无法限制统一用户设备,用户可使用虚拟机不断创建新模拟器来伪装成新设备用于注册 ...
- android设备唯一标识符_安卓设备唯一标识,用什么来获取》?
appcan.device.getInfo(infoId,callback) 获取设备对应id的信息 infoId:相关信息id 0: 描述CPU频率的字符串,eg:"1024MHZ&quo ...
- android设备id完美解决方法,安卓获取渠道名渠道id Android获取设备唯一标识的终极解决方法,防止安卓7.0时崩溃问题...
一,先说获取渠道名(这里以友盟为例) /* * 4.5.1新加渠道名字段,用来传给后台去统计各个渠道下载量 * */ public static String getSource() { //获取渠道 ...
- 获取android设备唯一编号_android获取设备唯一标识完美解决方案的思考以及实现方式...
关于Android设备唯一标识符号 前言 由于在开发中需要开发游客模式,在用户没有登录的情况下必须确保设备的唯一性,于是惯性思维想到的肯定是使用DevicesId 来作为设备的唯一标识,用以代替用户登 ...
- android获取设备唯一标识完美解决方案
转自:https://blog.csdn.net/aa1733519509/article/details/50053553 有时需要对用户设备进行标识,所以希望能够得到一个稳定可靠并且唯一的识别码. ...
- android获取设备唯一标识_数据埋点:用户唯一标识
用户唯一标识,是用户唯一的身份ID,相同的身份ID,就会被当做是相同的一个用户. 01 为什么要建设用户唯一标识 如何区分某个用户就是他这个用户,而不是另一个用户,在数据埋点中,是一个非常重要的事情. ...
- 转-ios设备唯一标识获取策略
[http://www.2cto.com/kf/201308/237648.html] 英文原文:In iOS 7 and later, if you ask for the MAC address ...
- JS生成浏览器唯一标识解决方案
前端页面如何在浏览器中检测生成设备的唯一标识 一.前提: js本身是不能通过浏览器获取设备唯一标识的,但是可以获取其它的信息作为唯一标识,给用户一个 visitorId,并且根据这个 visitorI ...
- iOS设备唯一标识符解决方案
iOS设备唯一标识符解决方案 最近在公司的项目中有记录设备唯一标识符的需求,通过唯一标识符去识别设备的注册类别从而进行角色的切换,在这个过程中查找了一些资料,在此稍作总结,留下一些痕迹,当然能给有同类 ...
- 获取安卓设备唯一ID
先介绍安卓设备中的几种ID 1.IMEI Android系统为开发者提供的用于标识手机设备的串号,也是各种方法中普适性较高的,可以说几乎所有的设备都可以返回这个串号,并且唯一性良好.它根据不同的手机设 ...
最新文章
- 你和区块链的距离就差这篇文章!
- electron.js_在使用Electron.js之前我希望知道的事情
- 云中家园FTP搜索站点开通
- Solaris基础系列之三:辅助工具
- 推荐系统-07-lambda架构
- 开发者们,「Innovation 2021」网易应用创新开发者大赛正式开赛了!
- 查看Product table entry数量的几种办法
- Julia与R/Python/MATLAB比较及Julia中的Text Analysis模块
- 【程序设计】程序错误类型
- 《转》Android 今日头条屏幕适配方案终极版正式发布!
- 你的押金在这?ofo发文曝光多起贪腐案:总涉案金额达数百万元
- rails 开发随手记 9
- 绿色建筑评价标准(GB/T 50378-2006)
- 【标准】ISO14001:2015新版标准正式发布
- 最可怕联想win7 64位旗舰版下载
- 显著性水平 置信度 置信区间 实例讲解
- 考虑结构预应力的坎贝尔图分析
- Excel VBA之类模块 实例
- Java实现压缩文件与解压缩zip文件
- 程序员前世今生,从门外汉到菜鸟,再到独当一面,再到思变转行