前言
2019年4月24日,移动安全联盟于深圳成功召开移动智能终端设备标识研讨会。下一步计划由头部设备厂商先行,逐步推动体系落地实施,并由中国信通院牵头开发支持多厂商、多终端类型的统一补充设备标识SDK,协助移动应用开发者更便捷的使用移动智能终端补充设备标识体系,推进相关业务。
以后逐渐要禁止获取IMEI,使用OAID(匿名设备标识符)来替代IMEI在app的作用(另外我们也可以获取VAID和AAID,下文会提到)
SDK支持的终端范围(2019年数据):

为保护用户用户的隐私和标识设备的唯一性,根据不同使用对象和不同用途,基于移动智能终端设备,分别生成设备唯一标识符、匿名设备标识符、开发者匿名设备标识符和应用匿名设备标识符,将这四个设备标识符构成补充设备标识体系。

移动智能终端补充设备标识体系统一调用 SDK的集成
准备工作:
访问 http://www.msa-alliance.cn/col.jsp?id=120 移动安全联盟官网,在最下边下载对应的msa_sdk_v1.0.10压缩文件,解压获取对应的jar包和工具类。
开始集成
1,把 miit_mdid_x.x.x.aar 拷贝到项的 libs 目录,并设置依赖,其中 x.x.x代表版本号。
implementation(name: 'miit_mdid_1.0.10', ext: 'aar')
2、将 supplierconfig.json 拷贝到项目 assets 目录下。(暂时不用修改,只需原样放到assets目录下即可,这个是给未来做准备的。如果想要使用VAID,可修改里边对应内容,特别是需要设置 appid 的部分,要去对应厂商的应用商店里注册自己的 app,来获取对应appid。)
3,混淆设置
-keep class com.bun.miitmdid.core.** {*;}
4,设置 gradle 编译选项,这块可以根据自己对平台的选择进行合理配置
ndk {
abiFilters 'armeabi-v7a','x86','arm64-v8a','x86_64','armeabi'
}
packagingOptions {
Android Q(12 月份会正式支持)
doNotStrip "*/armeabi-v7a/*.so"
doNotStrip "*/x86/*.so"
doNotStrip "*/arm64-v8a/*.so"
doNotStrip "*/x86_64/*.so"
doNotStrip "armeabi.so"
}
5,MiitHelper.java文件:
public class MiitHelper implements IIdentifierListener {
private AppIdsUpdater _listener;
public MiitHelper(AppIdsUpdater callback) {
_listener = callback;
}
public void getDeviceIds(Context cxt) {
long timeb = System.currentTimeMillis();
int nres = CallFromReflect(cxt);
long timee = System.currentTimeMillis();
long offset = timee - timeb;
if (nres == ErrorCode.INIT_ERROR_DEVICE_NOSUPPORT) {
MyApplicationLike.setIsSupportOaid(false, nres);
} else if (nres == ErrorCode.INIT_ERROR_LOAD_CONFIGFILE) {
MyApplicationLike.setIsSupportOaid(false, nres);
} else if (nres == ErrorCode.INIT_ERROR_MANUFACTURER_NOSUPPORT) {
MyApplicationLike.setIsSupportOaid(false, nres);
} else if (nres == ErrorCode.INIT_ERROR_RESULT_DELAY) {
MyApplicationLike.setIsSupportOaid(false, nres);
} else if (nres == ErrorCode.INIT_HELPER_CALL_ERROR) {
MyApplicationLike.setIsSupportOaid(false, nres);
}
Log.d(getClass().getSimpleName(), "return value: " + String.valueOf(nres));
}
private int CallFromReflect(Context cxt) {
return MdidSdkHelper.InitSdk(cxt, true, this);
}
private int DirectCall(Context cxt) {
MdidSdk sdk = new MdidSdk();
return sdk.InitSdk(cxt, this);
}
@Override
public void OnSupport(boolean isSupport, IdSupplier _supplier) {
if (_supplier == null) {
return;
}
MyApplicationLike.setIsSupportOaid(isSupport);
String oaid = _supplier.getOAID();
_supplier.shutDown();
if (_listener != null) {
_listener.OnIdsAvalid(oaid);
}
}
public interface AppIdsUpdater {
void OnIdsAvalid(@NonNull String ids);
}
}
6,MyApplicationLike.java代码:
初始化SDK:在应用的 application 的 attachBaseContext方法中调用方法: JLibrary.InitEntry(base);
public class MyApplicationLike extends Application {
private static String oaid;
private static boolean isSupportOaid=true;
private static int errorCode;
public static String getOaid() {
return oaid;
}
public static String getErrorCode() {
return String.valueOf(errorCode);
}
public static boolean isSupportOaid() {
return isSupportOaid;
}
public static void setIsSupportOaid(boolean isSupportOaid) {
MyApplicationLike.isSupportOaid = isSupportOaid;
}
public static void setIsSupportOaid(boolean isSupportOaid,int ErrorCode) {
MyApplicationLike.isSupportOaid = isSupportOaid;
MyApplicationLike.errorCode=ErrorCode;
}
private static MyApplicationLike instance;
public static MyApplicationLike getInstance() {
return instance;
}
private MiitHelper.AppIdsUpdater appIdsUpdater = new MiitHelper.AppIdsUpdater() {
@Override
public void OnIdsAvalid(@NonNull String ids) {
oaid = ids;
}
};
@Override
public void onCreate() {
super.onCreate();
instance = this;
MiitHelper miitHelper = new MiitHelper(appIdsUpdater);
miitHelper.getDeviceIds(instance);
}
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
JLibrary.InitEntry(base);
}
}
7,获取oaid:
public static String getOaid() {
String idfa;
if (MyApplicationLike.isSupportOaid()) {
idfa = MyApplicationLike.getOaid();
} else {
idfa = "获取失败,ErrorCode: " + MyApplicationLike.getErrorCode();
}
return idfa;
}
其他详情请查看解压后的集成文档详细描述。