首页 人工智能元宇宙大数据 企业智能化 智慧城市 科技 商务
当前位置:首页 > 人工智能

Android设备获取OAID调研和实现 Android获取oaid

来源:服务器技术社区 发布日期:2024-07-10

本文介绍了OAID(开放匿名标识符)作为Android10后替代传统设备标识符的新方案,以及AAID和VAID在移动应用中的角色,包括它们的区别、获取方式和在实际开发中的应用示例。强调了隐私保护和设备识别的平衡问题。

摘要由CSDN通过智能技术生成

什么是OAID、AAID、VAID

OAID

OAID是"Android ID"(安卓ID)的一种替代方案,其全称为"Open Anonymous Identifier"(开放匿名标识符)。 因传统的移动终端设备标识如国际移动设备识别码(IMEI)等已被部分国家认定为用户隐私的一部分,并存在被篡改和冒用的风险,所以在Android 10及后续版本中非厂商系统应用将无法获取IMEI、MAC等设备信息。无法获取IMEI会在用户行为统计过程中对设备识别产生一定影响。 移动安全联盟针对该问题联合国内手机厂商推出补充设备标准体系方案,选择OAID字段作为IMEI等的替代字段。OAID字段是由中国信通院联合华为、小米、OPPO、VIVO等厂商共同推出的设备识别字段,具有一定的权威性,可满足用户行为统计的使用场景。

设备唯一标识符(UDID):设备唯一硬件标识,设备生产时根据特定的硬件 信息生成,可用于设备的生产环境及合法性校验。不对第三方应用提供获取接 口,无法通过 SDK 获取。 匿名设备标识符(OAID):可以连接所有应用数据的标识符,移动智能终端 系统首次启动后立即生成,可用于广告业务。可以通过 SDK 获取到接口状态(重 置、关闭)、ID 值。 开发者匿名设备标识符(VAID):用于开放给开发者的设备标识符,可在应用安装时产生,可用于同一开发者不同应用之间的推荐。可以通过 SDK 获取到 ID 值。 应用匿名设备标识符(AAID):第三方应用获取的匿名设备标识,可在应用安装时产生,可用于用户统计等。可以通过 SDK 获取到 ID值。

如何获取

官方SDK接入

SDK获取

移动安全联盟官网:http://www.msa-alliance.cn/ 注意:但是注册需要企业账号,个人开发者无法注册使用,所以测试的时候在网上找了其他人提供的已经下载好的官方SDK。 百度云盘地址:https://pan.baidu.com/s/1sVzBD_3mTXD_oqyu5I2VtQ 提取码:we54 官方文档: 见附件。

配置和调用

把 oaid_sdk_x.x.x.aar 拷贝到项的 libs 目录,并设置依赖,其中 x.x.x 代表版本号将 supplierconfig.json 拷贝到项目 assets 目录下 appid 需要移动互联网应用开发者根据应用使用需求到不同终端厂商的应用 商城申请,具体需咨询相关厂商,不需要填写其他第三方应用商店的 appid。 appid 只与 VAID 的获取有关,用于判断是否为同一开发者,如不需获取 vaid 可 不填写。目前只需设置 vivo 的 appid。(我们本次只需要获取OAID,所以不需要上架,也不需要appid) 配置文件中部分设备如果不配置厂商会无法获取,部分设备如小米即使配置文件中没有,也不影响获取,所以我们对接的时候,为了保险起见,配置文件中尽可能全一些。【 官方文档中说配置文件不用修改,只需填写对应 appid,并放到 assets 目录下即可 】设置依赖设置gradle编译选项,开发者可以根据自己对平台的选择进行合理配置(测试的时候不配置也没什么问题) ndk { abiFilters ‘armeabi-v7a’,‘x86’,‘arm64-v8a’,‘x86_64’,‘armeabi’ }

代码实现

public class MainActivity extends AppCompatActivity implements IIdentifierListener{

private TextView tvContent;

String oaid;

String vaid;

String aaid;

@SuppressLint("MissingInflatedId")

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

tvContent = findViewById(R.id.tv);

MdidSdkHelper.InitSdk(getApplicationContext(), true, this);

//结果是异步返回的,使用时为空的话可以先休眠几秒

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

System.out.println("OAID: "+oaid);

System.out.println("VAID: "+vaid);

System.out.println("AAID: "+aaid);

@Override

public void OnSupport(boolean b, IdSupplier idSupplier) {

if(idSupplier==null) {

return;

oaid=idSupplier.getOAID();

vaid=idSupplier.getVAID();

aaid=idSupplier.getAAID();

StringBuilder builder=new StringBuilder();

builder.append("support: ").append(idSupplier.isSupported()?"true":"false").append(" ");

builder.append("OAID: ").append(oaid).append(" ");

builder.append("VAID: ").append(vaid).append(" ");

builder.append("AAID: ").append(aaid).append(" ");

String idstext=builder.toString();

Log.d("SdkDemo: ", idstext);

onIdsAvalid(idstext);

public void onIdsAvalid(@NonNull final String ids) {

runOnUiThread(new Runnable() {

@Override

public void run() {

tvContent.setText(ids);

三方实现接入

接入指引

github地址:https://github.com/gzu-liyujiang/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'

在这里,如果在kotlin的dsl中应该这么写exclude group:

implementation ("com.github.gzu-liyujiang:Android_CN_OAID:4.2.9"){

exclude(group = "com.huawei.hms', module: 'ads-identifier")

exclude(group = "'com.hihonor.mcs', module: 'ads-identifier")

代码实现

publicclassMainActivityextendsAppCompatActivity{

privateTextViewtextViewOAID;

@SuppressLint("MissingInflatedId")

@Override

protectedvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

textViewOAID=findViewById(R.id.textViewOAID);

//DeviceIdentifier.register(this.getApplication());

//获取IMEI,只支持Android10之前的系统,需要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,newIGetter(){

@Override

publicvoidonOAIDGetComplete(Stringresult){

//不同厂商的OAID/AAID格式是不一样的,可进行MD5、SHA1之类的哈希运算统一

Log.d("oaiddemo","获取成功:"+result);

textViewOAID.setText("OAIDValue:"+result);//更新TextView文本

@Override

publicvoidonOAIDGetError(Exceptionerror){

//获取OAID/AAID失败

Log.d("oaiddemo","获取失败:");

textViewOAID.setText("OAID获取失败");//更新TextView文本,表示获取失败

对比官方和三方的结果,获取到的OAID,同一台设备是一致的。

写在最后

感谢参考的几篇文档: https://blog.csdn.net/Myfittinglife/article/details/121520111 https://blog.csdn.net/mingtiannihao0522/article/details/104630967 https://juejin.cn/post/6924191966146068493

关于OAID要从获取android设备唯一标识说起,Android设备唯一标识包含IMEI,ANDROID_ID,Mac 地址等,随着国外对隐私保护的越来越看重,这些唯一标识要么无法获取,要么就是无效值,亦或者像ANDROID_ID各个应用获取到的是不同值,但总有一些场景需要唯一标识一台设备,尤其是CPI广告(CPI广告是按照实际的安装数量结算,需要唯一标识来确保没有重复计算),所以移动安全联盟搞了这个OAID,其本质是一个设备唯一标识。

OaidDemo:获取oaid的demo,用于获取小米,华为,oppo,vivo等指定系统及以上的oaid,用来替代之前获取的IMEI。具体使用请参考Readme下面的链接博客

OaidDemo

获取oaid的demo,用于获取小米,华为,oppo,vivo等指定系统及以上的oaid,用来替代之前获取的IMEI

目前代码基于《移动智能终端补充设备标识体系统一调用SDK开发者说明文档v1.10》编写,

官方文档和sdk见MSA官网:

v1.1中只保留了获取OAID的方法,其它关于IMEI和权限等代码已删除。

v1.0项目中的相关获取方法的调用,在DevicesUtil.java 工具类中编写,整合了获取oaid,IMEI,AndroidId,UUID等方法。

关于获取IMEI:

在获取IMEI时,Android 6.0及以上需要手动获取权限,Demo中获取权限的相关方法写在rxpermissions2 文件夹里面了,如需要使用可直接把整个文件夹复制到项目中(使用的是 中提供的获取权限得方法,仅供参考使用),

同时需要引用rxJava2.x或者jxJava3

因传统的移动终端设备标识如国际移动设备识别码(IMEI)等已被部分国家认定为用户隐私的一部分,并存在被篡改和冒用的风险,所以在Android 10及后续版本中非厂商系统应用将无法获取IMEI、MAC等设备信息。(3)、第三方应用调用移动联盟sdk获取oaid时,调用步骤1中重写的获取oaid接口,该接口通过属性值persist.oaid读取oaid的值,返回给第三方应用,这样就可以避免获取到oaid值为空情况。oppo厂商的代码如下,具体的可以下载源码查看。3.2 将编译好的apk集成到系统。

Android 10以后就获取不到IMEI了,国内可以用oaid代替,但是不同游戏或媒体用的oaid版本不一致且有的版本不兼容,经常会到导致崩溃。于是处理了一个可以兼容目前所有版本的oaid(基于1.0.25版本)。上传的是smali文件和相关的资源,如果需要生成jar或aar文件需要自己去生成。

安卓设备唯一标识解决方案,可作为移动安全联盟统一 SDK (miit_mdid_xxx.aar)的替代方案。。本项目提供了国内各大手机厂商获取 OAID(开放匿名设备标识)及海外手机平台获取 AAID(安卓广告标识)的便携接口,另外也提供了 IMEI/MEID、AndroidID、WidevineID、PseudoID、GUID 等常见的设备标识的获取方法。

因传统的移动终端设备标识如国际移动设备识别码(IMEI)等已被部分国家认定为用户隐私的一部分,并存在被篡改和冒用的风险,所以在Android 10及后续版本中非厂商系统应用将无法获取IMEI、MAC等设备信息。无法获取IMEI会在用户行为统计过程中对设备识别产生一定影响。近日移动安全联盟针对该问题联合国内手机厂商推出补充设备标准体系方案,选择OAID字段作为IMEI等的替代字段。

根据“移动智能终端补充设备标识体系”技术要求,华为、小米、OPPO、vivo、中兴、努比亚、魅族、联想、三星等设备厂商均将逐步实现本标识体系,联盟计划开发并发布支持多厂商的统一的补充设备标识调用SDK,协助移动应用开发者更便捷的访问移动智能终端补充设备标识体系,推进相关业务。IMEI属于个人隐私,现在已无法获取IMEI,因此需要使用OAID来替代。

随 着大数据和人工智能时代的到来,数据的价值也逐渐增加,移动终端设备标识码,如国际移动设备识别码(IMEI)、Wi-Fi MAC地址、SIM卡国际移动用户识别码(IMSI)和蓝牙地址等终端设备标识信息的收集和使用成为普遍现象。同时各国对用户隐私保护的要求越来越高,传 统的移动终端设备标识如国际移动设备识别码(IMEI)等已...

因传统的移动终端设备标识如国际移动设备识别码(IMEI)等已被部分国家认定为用户隐私的一部分,并存在被篡改和冒用的风险,所以在Android 10及后续版本中非厂商系统应用将无法获取IMEI、MAC等设备信息。无法获取...

JAR(Java Archive)文件是Java平台的库文件格式,包含了编译后的类文件和其他资源,用于在Android应用中实现特定功能,如OAID的获取和管理。集成信通院SDK的步骤通常包括以下几个关键点:1. 添加依赖:将`msa_...

插件说明:OAID支持Android10以上的设备,以前的老设备以及没有更新的设备获取不到。获取到OAID为空的情况下,会自动尝试获取IMEI号,如果用户没有授权或者获取不到IMEI的情况下,会尝试获取MAC地址,再获取不到的时候采用兜底方案AndroidID。结合以上几点来看,单独采用其中某一个方案都不是很完美,所以 移动安全联盟MSA 搞了一个OAID,这个本质上也是一个设备的唯一标识,目前已经支持的厂商包括:华为、小米、OPPO、vivo、中兴、努比亚、魅族、联想、三星等。

code小生一个专注大前端领域的技术平台公众号回复Android加入安卓技术群本项目抹平了各大 Android 手机厂商获取 OAID(开放匿名标识)的差异性,轻松通过几句代码即可获取不...

### 回答1:

C 程序设计考研真题是考查考生 C 语言编程能力和算法基础的一种考试形式,属于计算机专业硕士研究生入学考试中的重要考试科目之一。这种考试形式的出现,旨在对考生的程序设计能力、思维逻辑能力进行全方位的考查,以评估其是否具备入学的资格。

在考试中,考生需要深刻掌握 C 语言编程的基本语法、数据类型、控制结构等方面的知识,并掌握常用算法及数据结构的基础知识。考生需要熟练掌握 C 语言的行为特点和运算特点,熟练运用宏定义、数组、指针等语法,能够独立解决简单的编程问题。

对于考生来说,备考时应认真复习 C 语言编程基础知识和算法基础知识,建立相应的算法模型,并通过刷题和模拟考试等多种方式,提高自己的解题能力和应对考试的实战能力。同时,还要加强对各类常见算法的理解和实践操作,对常用数据结构掌握清晰,以便在考试中能够根据问题的不同需求,选取恰当的数据结构并巧妙运用。最后,在考试中要认真审题,仔细分析题目要求,不得轻率作答,避免出现明显的语法错误和逻辑错误。

### 回答2:

C 程序设计是考研计算机专业的重要科目之一,也是考查学生对编程语言和基本数据结构的掌握和应用的能力。对于考生来说,需要全面掌握C语言基础知识,重点关注指针、数组、字符串、结构体、文件操作等重点部分。

在备考过程中,重点训练自己的编程能力和解决问题的能力。通过做大量的编程题,可以熟悉C语言常用的语法,了解一些常见的算法和数据结构,同时也可以不断提高解决问题的能力。

而在考试中,需要注意阅读题目,理清思路,在规定时间内写出正确的代码,因此平时也需要进行模拟考试和雅思写作练习,并及时纠错,及时调整心态,不断提升自己的解题速度和正确率。

C 程序设计不仅是考研的一门学科,也是计算机专业学生的基础课和必修课。只有掌握扎实的基础知识,熟练的编程技巧以及良好的解决问题的能力,才能成为一位优秀的程序员。

Java异常:java.lang.IllegalArgumentException: Illegal group reference: group index is missing

所以新手使用celery很仔细的建立文件夹名字、文件夹层级、python文件名字。

所以网上的celery博客教程虽然很多,但是并不能学会使用,因为要运行起来需要以下6个方面都掌握好,博客文字很难表达清楚或者没有写全面以下6个方面。

celery消费任务不执行或者报错NotRegistered,与很多方面有关系,如果要别人排错,至少要发以下6方面的截图,因为与一下6点关系很大。

1)整个项目目录结构, 2)@task入参 ,3)celery的配置,4)celery的配置 include ,5)cmd命令行启动参数 --queues=的值,6)用户在启动cmd命令行时候,用户所在的文件夹。

在不规范的文件夹路径下,使用celery难度很高,一般教程都没教。

[项目文件夹目录格式不规范下的celery使用演示](https://github.com/ydf0509/celery_demo) 。

此国产分布式函数调度框架 funboost python万能通用函数加速器https://funboost.readthedocs.io/,

从用法调用难度,用户所需代码量,超高并发性能,qps控频精确程度,支持的中间件类型,任务控制方式,稳定程度等19个方面全方位超过celery。发布性能提高1000%,消费性能提高2000%。

python万能分布式函数调度框架funboost支持python所有类型的并发模式和一切知名消息队列中间件,python函数加速器,框架包罗万象,万能编程功能宝典,一统编程思维,与业务不绑定,适用范围广。

funboot能支持celery作为中间件,用户可以使用funboost的极简api来使用celery核心调度,不用手动复杂的配置操作celery

funboost 自动化操作celeryhttps://github.com/ydf0509/funboost_support_celery_demo

pip installfunboost

ITV女诗人:

有空来看看我朋友的鸿蒙开发学习教程https://blog.csdn.net/lujianfeiccie2009/category_12605850.html