android平台Oaid匿名设备标识符的获取

前言

2019年4月24日,移动安全联盟于深圳成功召开移动智能终端设备标识研讨会。下一步计划由头部设备厂商先行,逐步推动体系落地实施,并由中国信通院牵头开发支持多厂商、多终端类型的统一补充设备标识SDK,协助移动应用开发者更便捷的使用移动智能终端补充设备标识体系,推进相关业务。

以后逐渐要禁止获取IMEI,使用OAID(匿名设备标识符)来替代IMEI在app的作用(另外我们也可以获取VAID和AAID,下文会提到)

SDK支持的终端范围(2019年数据):
android平台Oaid匿名设备标识符的获取_第1张图片
为保护用户用户的隐私和标识设备的唯一性,根据不同使用对象和不同用途,基于移动智能终端设备,分别生成设备唯一标识符匿名设备标识符开发者匿名设备标识符应用匿名设备标识符,将这四个设备标识符构成补充设备标识体系。
android平台Oaid匿名设备标识符的获取_第2张图片

移动智能终端补充设备标识体系统一调用 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);
        //        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;
    }

其他详情请查看解压后的集成文档详细描述。

你可能感兴趣的:(Android)