2019年4月24日,移动安全联盟于深圳成功召开移动智能终端设备标识研讨会。下一步计划由头部设备厂商先行,逐步推动体系落地实施,并由中国信通院牵头开发支持多厂商、多终端类型的统一补充设备标识SDK,协助移动应用开发者更便捷的使用移动智能终端补充设备标识体系,推进相关业务。
以后逐渐要禁止获取IMEI,使用OAID(匿名设备标识符)来替代IMEI在app的作用(另外我们也可以获取VAID和AAID,下文会提到)
SDK支持的终端范围(2019年数据):
为保护用户用户的隐私和标识设备的唯一性,根据不同使用对象和不同用途,基于移动智能终端设备,分别生成设备唯一标识符、匿名设备标识符、开发者匿名设备标识符和应用匿名设备标识符,将这四个设备标识符构成补充设备标识体系。
准备工作:
访问 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);
// int nres=DirectCall(cxt);
long timee = System.currentTimeMillis();
long offset = timee - timeb;
if (nres == ErrorCode.INIT_ERROR_DEVICE_NOSUPPORT) {//1008612 不支持的设备
MyApplicationLike.setIsSupportOaid(false, nres);
} else if (nres == ErrorCode.INIT_ERROR_LOAD_CONFIGFILE) {//1008613 加载配置文件出错
MyApplicationLike.setIsSupportOaid(false, nres);
} else if (nres == ErrorCode.INIT_ERROR_MANUFACTURER_NOSUPPORT) {//1008611 不支持的设备厂商
MyApplicationLike.setIsSupportOaid(false, nres);
} else if (nres == ErrorCode.INIT_ERROR_RESULT_DELAY) {//1008614 获取接口是异步的,结果会在回调中返回,回调执行的回调可能在工作线程
MyApplicationLike.setIsSupportOaid(false, nres);
} else if (nres == ErrorCode.INIT_HELPER_CALL_ERROR) {//1008615 反射调用出错
MyApplicationLike.setIsSupportOaid(false, nres);
}
Log.d(getClass().getSimpleName(), "return value: " + String.valueOf(nres));
}
/*
* 通过反射调用,解决android 9以后的类加载升级,导至找不到so中的方法
*
* */
private int CallFromReflect(Context cxt) {
return MdidSdkHelper.InitSdk(cxt, true, this);
}
/*
* 直接java调用,如果这样调用,在android 9以前没有题,在android 9以后会抛找不到so方法的异常
* 解决办法是和JLibrary.InitEntry(cxt),分开调用,比如在A类中调用JLibrary.InitEntry(cxt),在B类中调用MdidSdk的方法
* A和B不能存在直接和间接依赖关系,否则也会报错
*
* */
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;
}
/* String oaid=_supplier.getOaid();
String vaid=_supplier.getVAID();
String aaid=_supplier.getAAID();
String udid=_supplier.getUDID();
StringBuilder builder=new StringBuilder();
builder.append("support: ").append(isSupport?"true":"false").append("\n");
builder.append("UDID: ").append(udid).append("\n");
builder.append("OAID: ").append(oaid).append("\n");
builder.append("VAID: ").append(vaid).append("\n");
builder.append("AAID: ").append(aaid).append("\n");
String idstext=builder.toString();*/
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) {
// Log.e("++++++ids: ", ids);
oaid = ids;
}
};
@Override
public void onCreate() {
super.onCreate();
instance = this;
//获取OAID等设备标识符
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;
}
其他详情请查看解压后的集成文档详细描述。