Android开发中匿名设备标识符OAID使用及初始化
作者:ZH-黑夜 发布时间:2023-12-23 04:33:54
标签:Android,匿名设备,标识符,OAID
ID说明
设备唯一标识符(UDID):设备唯一硬件标识,设备生产时根据特定的硬件信息生成,可用于设备的生产环境及合法性校验。不对第三方应用提供获取接口,无法通过 SDK 获取。
匿名设备标识符(OAID):可以连接所有应用数据的标识符,移动智能终端系统首次启动后立即生成,可用于广告业务。可以通过 SDK 获取到接口状态(重置、关闭)、ID 值。
开发者匿名设备标识符(VAID):用于开放给开发者的设备标识符,可在应用安装时产生,可用于同一开发者不同应用之间的推荐。可以通过 SDK 获取到 ID 值。
应用匿名设备标识符(AAID):第三方应用获取的匿名设备标识,可在应用安装时产生,可用于用户统计等。可以通过 SDK 获取到 ID 值。
声明
下载链接
移动安全联盟官网SDK 获取地址
覆盖范围
厂商名称 | 支持版本 |
---|---|
华为 | HMS 2.6.2及以上 |
小米 | MIUI10.2及以上版本 |
vivo | Android 9及以上版本 |
oppo | Color OS 7.0及以上版本 |
Lenovo | ZUI 11.4及以上版本 |
三星 | Android 10版本 |
魅族 | Android 10版本 |
努比亚 | Android 10版本 |
中兴 | Android 10版本 |
华硕 | Android 10版本 |
一加 | Android 10版本 |
黑鲨 | Android 10版本 |
摩托罗拉 | Android 10版本 |
Freeme OS | Android 10版本 |
调用方法
1.把oaid_sdk_x.x.x.aar拷贝到项的libs目录,并设置依赖,其中x.x.x代表版本号。
2.将supplierconfig.json拷贝到项目assets目录下,并修改里边对应内容,特别是需要设置appid的部分。需要设置appid的部分需要去对应厂商的应用商店里注册自己的app。需要注意的是,其中label部分内容无需修改。
3.设置依赖implementation files(‘libs/oaid_sdk_x.x.x.aar’)
4.设置gradle编译选项,开发者可以根据自己对平台的选择进行合理配置
ndk {
abiFilters 'armeabi-v7a', 'x86', 'arm64-v8a', 'x86_64', 'armeabi'
}
packagingOptions {
doNotStrip "*/armeabi-v7a/*.so"
doNotStrip "*/x86/*.so"
doNotStrip "*/arm64-v8a/*.so"
doNotStrip "*/x86_64/*.so"
doNotStrip "armeabi.so"
}
5.设置混淆
-keep class XI.CA.XI.**{*;}
-keep class XI.K0.XI.**{*;}
-keep class XI.XI.K0.**{*;}
-keep class XI.vs.K0.**{*;}
-keep class XI.xo.XI.XI.**{*;}
-keep class com.asus.msa.SupplementaryDID.**{*;}
-keep class com.asus.msa.sdid.**{*;}
-keep class com.bun.lib.**{*;}
-keep class com.bun.miitmdid.**{*;}
-keep class com.huawei.hms.ads.identifier.**{*;}
-keep class com.samsung.android.deviceidservice.**{*;}
-keep class org.json.**{*;}
-keep public class com.netease.nis.sdkwrapper.Utils {public <methods>;}
使用
初始化
public class APP extends Application {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
JLibrary.InitEntry(base);
}
}
设置回调
public interface AppIdsUpdater {
void OnValidId(@NonNull JSONObject ids);
}
设置调用类
public class MiIdHelper implements IIdentifierListener {
private boolean isSupport;
private String oaid, vaid, aaid;
public JSONObject getDeviceIds(Context cxt) {
long startTime = System.currentTimeMillis();
int code = CallFromReflect(cxt);
long endTime = System.currentTimeMillis();
long time = endTime - startTime;
JSONObject jsonObject = new JSONObject();
try {
jsonObject.put("description", descriptionCode(code));
jsonObject.put("code", code);
jsonObject.put("time", time);
jsonObject.put("isSupport", isSupport);
jsonObject.put("oaid", oaid);
jsonObject.put("vaid", vaid);
jsonObject.put("aaid", aaid);
} catch (Exception e) {
e.printStackTrace();
}
return jsonObject;
}
private int CallFromReflect(Context cxt) {
return MdidSdkHelper.InitSdk(cxt, true, this);
}
@Override
public void OnSupport(boolean isSupport, IdSupplier _supplier) {
this.isSupport = isSupport;
if (_supplier != null) {
this.oaid = _supplier.getOAID();
this.vaid = _supplier.getVAID();
this.aaid = _supplier.getAAID();
_supplier.shutDown();
}
}
private String descriptionCode(int code) {
switch (code) {
case ErrorCode.INIT_ERROR_DEVICE_NOSUPPORT:
return "DEVICE_NOSUPPORT";
case ErrorCode.INIT_ERROR_LOAD_CONFIGFILE:
return "LOAD_CONFIGFILE";
case ErrorCode.INIT_ERROR_MANUFACTURER_NOSUPPORT:
return "MANUFACTURER_NOSUPPORT";
case ErrorCode.INIT_ERROR_RESULT_DELAY:
return "RESULT_DELAY";
case ErrorCode.INIT_HELPER_CALL_ERROR:
return "HELPER_CALL_ERROR";
default:
return "SUCCESS";
}
}
}
获取OAID
MiIdHelper miIdHelper = new MiIdHelper(new AppIdsUpdater() {
@Override
public void OnValidId(@NonNull JSONObject ids) {
Log.e("OAID", ids.toString());
}
});
miIdHelper.getDeviceIds(getApplicationContext());
来源:https://blog.csdn.net/qq_40945489/article/details/109724415


猜你喜欢
- 我们知道,多线程是Android开发中必现的场景,很多原生API和开源项目都有多线程的内容,这里简单总结和探讨一下常见的多线程切换方式。我们
- 前导:发过程中经常会使用java将office系列文档转换为PDF, 一般都使用微软提供的openoffice+jodconverter 实
- 测试Spring Boot定时任务冲突时,使用的线程数量引入依赖:Spring Boot 2.6.1 <dependency>
- 本文实例讲述了C#定义简单的反射工厂用法。分享给大家供大家参考。具体分析如下:首先,定义一个水果抽象类,代码如下:class Fruit{
- 有时候数据库文档需要整理,可是只能手动的复制粘贴,心中一万只草泥马奔腾而过。。。screw简洁好用的数据库表结构文档生成工具。1. 创建项目
- 请求SpringBoot接受前台参数的六种方式,首先因为从前台发送的请求没有界面的话只能是从地址栏发送并且只能是Get请求,为了测试其他的请
- 前言开发做得久了,总免不了会遇到各种坑。而在Android开发的路上,『软键盘挡住了输入框』这个坑,可谓是一个旷日持久的巨坑——来来来,我们
- 本文实例讲述了Android控件之ListView用法。分享给大家供大家参考。具体如下:示例一:在android开发中ListView是比较
- 目录数据类型布尔类型字符串类型String拼接字符'+'转义字符运算符加减乘除模运算增量赋值运算符自增运算符和自建运算符赋值
- Android 捕获运行时异常详解Android 异常分为两类:CheckedException 和 UnCheckedExceptionC
- 先说结论:字段类型更改为 'keyword'elasticSearch官方文档中创建index代码如下PUT /my_sto
- Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。Spri
- 本文实例讲述了Android实现ListView数据动态加载的方法。分享给大家供大家参考,具体如下:list.setOnScrollList
- 一些初学Android的朋友可能会遇到JAVA的数据类型之间转换的苦恼,例如,整数和float,double型之间的转换,整数和String
- struct InputStream 是单个输入流的管理器。是由 add_input_stream() 函数申
- 前言之前提到了关于Spring的显示配置方式有两种,一种是基于XML配置,一种是基于JavaConfig的方式配置。对于这两种配置方式并不是
- 通过子类调用父类的变量,有两种方法:1、把父类的变量设置成public:package triangle.opengl.wlz.stu.ch
- 对于一个应用程序而言,控件是搭建用户界面的积木。它们具备交互式的特征。VS 2012中的控件都放在工具箱中,添加一个控件到窗体,只需在工具箱
- 在使用EL时,其实EL是先看标识符是否是其隐式对象之一,如果不是,才从四个域(page、request、session、applicatio
- C#中WPF ListView绑定数据的实例详解WPF中ListView用来显示数据十分方便, 我们可以将它分成几个列,每一个列用来显示一条