OAID
Android
匿名设备标识符OAID
输出
背景
随着大数据和人工智能时代的到来,数据的价值也逐渐增加,移动终端设备标识码,如国际移动设备识别码(IMEI)、Wi-Fi MAC地址、SIM卡国际移动用户识别码(IMSI)和蓝牙地址等终端设备标识信息的收集和使用成为普遍现象。同时各国对用户隐私保护的要求越来越高,传统的移动终端设备标识如国际移动设备识别码(IMEI)等已被部分国家认定为用户隐私的一部分。另外,在很多与隐私无关的场景中,如生产、售后、报关、政府抽检等场景,传统设备标识码(如IMEI)被篡改或冒用的情况时有发生,给设备生产企业的经济利益带来损失,同时对设备追溯带来较大影响。
ID说明
- 设备唯一标识符(UDID):设备唯一硬件标识,设备生产时根据特定的硬件信息生成,可用于设备的生产环境及合法性校验。不对第三方应用提供获取接口,无法通过 SDK 获取。
- 匿名设备标识符(OAID):可以连接所有应用数据的标识符,移动智能终端系统首次启动后立即生成,可用于广告业务。可以通过 SDK 获取到接口状态(重置、关闭)、ID 值。
- 开发者匿名设备标识符(VAID):用于开放给开发者的设备标识符,可在应用安装时产生,可用于同一开发者不同应用之间的推荐。可以通过 SDK 获取到 ID 值。
- 应用匿名设备标识符(AAID):第三方应用获取的匿名设备标识,可在应用安装时产生,可用于用户统计等。可以通过 SDK 获取到 ID 值。
权利声明
- 移动智能终端补充设备标识体系统一调用 SDK 由中国信息通信研究院泰尔终端实验室、移动安全联盟整合提供,知识产权归中国信通院所有,未经授权或非法复制、逆向、破解、篡改、贩卖或用于其他商业用途,中国信息通信 研究院保留追究其法律责任的权利;
- 移动智能终端补充设备标识体系统一调用 SDK 由中国信息通信研究院泰尔终端实验室、移动安全联盟共同负责 SDK 的合规管理和后期维护;
- 移动智能终端补充设备标识体系依据电信终端产业协会(TAF)、移动安全联盟(MSA)联合推出的团体标准《移动智能终端补充设备标识规范》开发, 移动智能终端补充设备标识体系统一调用 SDK 集成设备厂商提供的接口,并获得主流设备厂商的授权,本次版本为试用版。
下载
安装
- 把
miit_mdid_x.x.x.aar
拷贝到项的libs
目录,并设置依赖,其中 x.x.x 代表版本号。 - 将
supplierconfig.json
拷贝到项目assets
目录下,并修改里边对应 内容,特别是需要设置 appid 的部分。需要设置 appid 的部分需要去对应厂商 的应用商店里注册自己的 app。 - 设置依赖。
implementation files(‘libs/miit_mdid_x.x.x.aar’)
- 混淆设置。
-keep class com.bun.miitmdid.core.** {*;}
- 设置 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"
}
- 初始化。
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();
JSONObject result=miIdHelper.getDeviceIds(getApplicationContext());
效果展示
{
"description":"SUCCESS",
"code":0,
"time":49,
"isSupport":true,
"oaid":"cf8cc008bb5adf96",
"vaid":"f8239c19f92836f1",
"aaid":"0115d997-c845-4e86-8fed-58c4fb246827"
}