Android接入

2024.03.13 15:46:30

    法规说明

    根据我国《网络安全法》等相关法律法规及国家标准的要求,个人信息的收集和使用,应当遵循合法、正当、必要的原则,公开收集、使用规则,明示收集、使用信息的目的、方式和范围,并经被收集者同意。故我们强烈建议您在拟接入易盾SDK前,检查和完善拟接入软件的《隐私政策》中有关采集个人信息部分的说明,确保已涵盖拟接入SDK项下需要采集的个人信息(详见附表),并明确您有权将上述个人信息提供给第三方用于安全服务。

    附表:

    采集信息类型 备注
    设备型号
    设备IP地址
    设备MAC地址
    设备软件版本信息
    设备唯一标识码(IMEI)
    传感器数据 提供开关,默认打开,可根据业务需求随时设置关闭
    APK安装列表 提供开关,默认打开,可根据业务需求随时设置关闭

    接入步骤

    Android SDK接入分为如下步骤:

    • 嵌入SDK
    • init:初始化SDK
    • getToken:调用getToken接口获取token,每次调用返回不同的token值。一般由用户操作(提交等)来触发getToken,请注意:一个token只能使用一次,如果在同一个页面中,允许用户多次操作,请多次调用getToken接口以获取不同的token;
    • 提交token:将token作为请求参数提交到业务方后端。

    嵌入SDK

    嵌入SDK有如下步骤:

    • 导入SDK
    • 导入需要的ABI
    • 添加权限信息
    • 添加ProGuard配置

    导入SDK

    将获取的sdk的aar文件放到工程中的libs文件夹下,然后在app的build.gradle文件中增加如下代码

    repositories {
        flatDir {
            dirs 'libs'
        }
    }
    

    在build.gradle配置文件的dependencies依赖中增加对aar包的引用(x.x.x表示版本号,请联系您的专属安全策略经理确认最新的版本号):

    dependencies {
    	implementation(name:'netmobsecLib_x.x.x', ext: 'aar')
    }
    

    导入需所的ABI

    SDK提供了armeabi、armeabi-v7a、x86、arm64-v8a四种ABI的支持(当前不支持x86_64),默认会包含这四种ABI。注意:

    • 如果产品本身不支持这么多ABI,则需要对最终导出的ABI进行过滤,否则可能会导致崩溃
    • 如果app只需要支持特定的ABI,比如armeabi,armeabi-v7a,x86三种,可以在build.gradle添加如下配置:
    defaultConfig {
        applicationId "com.XX.XXX"
        minSdkVersion XX
        targetSdkVersion XX
        versionCode XX
        versionName "X.X.X"
        ndk {
            abiFilters "armeabi", "armeabi-v7a", "x86"
        }
    }
    

    添加权限信息

    SDK不会申请任何权限,但是为了提升反作弊的效果,建议在 AndroidManifest.xml 文件中添加下列权限配置:

    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    

    添加ProGuard配置

    若使用ProGuard进行混淆,需要将SDK使用的类排除掉。若使用Android Studio开发,则在proguard-rules.pro文件里添加如下信息:

    -keep class com.netease.mobsec.**{*;}
    -keep class com.netease.htprotect.**{*;} 
    

    SDK接口

    反作弊配置类:WatchManConf

    使用之前,请先导入该类。

    import com.netease.mobsec.WatchManConf;
    

    该类用于对一些配置进行设置,有以下接口:

    • 作用:是否允许采集本机已安装的软件,默认开启
    public void setCollectApk(boolean flag)
    
    • 作用:在init的时候,是否允许开始采集传感器实时数据,默认开启
    tpublic void setCollectSensor(boolean flag)
    
    • 作用:设置应用程序渠道名称
    public void setChannel(String Channel)
    
    • 作用:供用户上传自定义数据,可多次调用
    public void setExtraData(String key, String value)
    
    • 作用:设置私有化的 URL 地址,正常情况下不用设置
    public void setUrl(String Url)
    
    • 作用:供用户自行实现网络相关行为
    public void setAbstractNetClient(AbstractNetClient netclient)
    
    • 作用:供用户上传 trackId,不同用户应设置不同值用于区分
    public void setCustomTrackId(String trackid)
    
    • 作用:兼容 kotlin 协程模式,默认为 false。若当前使用 kotlin 的 runBlocking 方法,则设置为 true,否则initgetToken可能无法回调结果。
    public void setOnCoroutines(boolean onCoroutines)
    
    • 开始支持的版本:4.4.5.7
    • 作用:支持在离线或网络异常状态下返回详细数据(离线token),默认关闭
    public void setOfflineToken(boolean offlineToken)
    
    • 开始支持的版本:4.4.7.8
    • 作用:控制 init 时是否发送设备相关信息,默认关,如开启,需确保在隐私政策同意后进行调用
    public void setInitDInfo(boolean flag)
    
    • 开始支持的版本:4.4.11.4

    反作弊类:WatchMan

    init接口

    使用之前,先导入类(为保证接入合规,请在用户同意隐私政策后调用init),注意从4.4.7.10版本开始该接口初始化成功后,再次调用初始化会提示错误码

    import com.netease.mobsec.WatchMan;
    import com.netease.mobsec.InitCallback;
    

    在项目的Application类或者Activity类的onCreate或onStart()方法中调用init方法来初始化SDK,接口定义如下:

    public static void init ( Context context, 
    						  String ProductNum, 
    						  WatchManConf conf, 
    						  InitCallback callback)
    

    接口说明如下:

    • 开始支持的版本:4.4.0

    • 调用方式:WatchMan.init(context, productNumber,watchmanconf,callback)

    • 接口描述:初始化SDK,采集数据并将数据提交到服务端,内部为异步实现,不会阻塞线程

    参数说明:

    参数名 类型 是否必须 作用
    context Context 用于获取设备基本信息
    productNumber String 产品编号
    watchmanconf WatchManConf 设置配置
    callback InitCallback 结果描述

    接入方可通过InitCallback获取初始化结果,InitCallback的定义如下:

    public interface InitCallback {
        void onResult(int code, String msg);
    }
    //code为200,表示成功;其他值均为失败,失败信息通过msg返回。
    
    • 回调code说明
    code 说明
    200 SDK初始化成功
    1001 产品编号错误
    1003 SDK初始化参数非法
    1004 SDK初始化异常
    1005 SDK初始化成功后,且被再次调用初始化

    getToken接口

    使用之前,先导入类

    import com.netease.mobsec.WatchMan;
    import com.netease.mobsec.GetTokenCallback;
    

    getToken接口通过回调返回唯一凭证token,业务方客户端需要将此token提交到业务后端,业务后端再使用此token来check接口获取检测结果。

    接口的定义如下:

    public static void getToken(GetTokenCallback callback)
    public static void getToken(int timeout, GetTokenCallback callback)
    
    • 开始支持的版本:4.4.0
    • 调用方式:WatchMan.getToken(callback) 或 WatchMan.getToken( timeout,callback)
    • 接口描述:获取唯一凭证token,为同步接口,建议不要在主线程使用,否则可能导致ANR或者崩溃
    • 注意:开启离线token功能后,如设置getToken超时时间,网络异常状态下实际返回时间会在超时时间基础上最大增加150毫秒,返回数据长度在2000-8000字节之间,可当作正常token进行使用
    • 强烈建议:初始化init到gettoken时间间隔2s以上,并且由用户触发。
    参数名 类型 是否必须 作用
    timeout int 最长超时时间,单位秒。若没有指定,则默认3s;timeout可设置范围为1~10秒
    callback GetTokenCallback 结果描述

    接入方可通过GetTokenCallback获取结果,GetTokenCallback的定义如下:

    public interface GetTokenCallback {
        void onResult(int code, String msg, String token);
    }
    //code为200,表示成功,可获取token值;其他code值均为失败,失败信息通过msg返回。
    
    • 回调code说明
    code 说明
    200 成功
    1002 SDK初始化失败

    getTokenAsync接口

    getToken接口的异步模式

    接口的定义如下:

    public static void getTokenAsync(int timeout, GetTokenCallback callback)
    
    • 开始支持的版本:4.4.5.9
    • 调用方式: WatchMan.getTokenAsync( timeout,callback)
    • 接口描述:获取唯一凭证token,为getToken的异步接口,注意在回调中不要执行UI操作
    • 该接口不支持离线token模式

    getToken带返回值同步接口

    接口的定义如下:

    public static WatchManResult getToken(int timeout)
    
    • 开始支持的版本:4.4.7.10
    • 调用方式: WatchMan.getToken( timeout)
    • 接口描述:获取唯一凭证token,同步接口,请勿在主线程中调用
    • 该接口不支持离线token模式

    WatchManResult定义如下:

    参数名 类型 作用
    getCode int 获取返回状态码
    getToken String 获取token
    getMsg String 获取提示信息

    setSeniorCollectStatus 接口

    该接口用于实时控制传感器数据的采集,可随时启用或关闭采集功能,但是必须在init之后方可调用该接口。

    该接口与WatchManConf里的setCollectSensor接口的区别主要在于采集时机的不同,若WatchManConf里面设置为true,则在init的时候就开始采集传感器数据;若在WatchManConf里面设置为false,可根据业务需要,在指定页面中调用setSeniorCollectStatus开启采集功能,getToken之后再关闭采集。

    接口的定义如下:

    public static void setSeniorCollectStatus(boolean flag)
    

    接口说明如下:

    • 开始支持版本:4.3.2
    • 调用方式:WatchMan.setSeniorCollectStatus(flag)
    • 接口描述:用于控制是否采集传感器数据,可结合业务需要,随时开启或者关闭
    参数名 类型 是否必须 作用
    flag boolean true:开启 false:关闭

    setCustomTrackId接口

    该接口用于将用户设置的trackid上传到易盾后端。

    该接口与WatchManConf中的setCustomTrackId接口的作用是相同的,区别主要在于设置的时机不同。若在init之前客户已经获取到trackid,即可在WatchManConf设置一次即可。若在init之后才能拿到trackid或者trackid有更新,那么可以调用该接口进行设置。

    接口的定义如下:

    public static void setCustomTrackId(String trackId)
    

    接口说明如下:

    • 开始支持版本:4.4.2
    • 调用方式:WatchMan.setCustomTrackId(trackid)
    • 接口描述:用于将用户生成的trackid上传到易盾后端
    参数名 类型 是否必须 作用
    trackid string 设置trackid

    接入示例

    在项目Application类或者主Activity类的onCreate()方法中初始化SDK。

    import com.netease.mobsec.WatchMan;
    import com.netease.mobsec.WatchManConf;
    
    public class MyApplication extends Application {
        @Override
        public void onCreate() {
            super.onCreate();
            
    		// 设置配置类相关信息
    		WatchManConf myconf = new WatchManConf();
    		myconf.setCollectApk(TRUE);		// 采集apk安装列表
    		myconf.setCollectSensor(FALSE);	//init时候不采集传感器数据
    		
            //初始化SDK
            WatchMan.init(mContext, "your productNumber", myconf, new InitCallback() {
                @Override
                public void onResult(int code, String msg) {
                    Log.e(TAG,"init OnResult , code = " + code + " msg = " + msg);
                }
            });
            // 业务代码   
        }
    }
    

    在需要反作弊的接口中,首先获取反作弊Token,然后进行其他相应的操作,例如:

    public void rise() {
    	
        WatchMan.setSeniorCollectStatus(true);  // 开启传感器数据采集
        
        // 获取反作弊查询token,使用默认延时3秒
    	WatchMan.getToken( new GetTokenCallback(){
    		@Override
    		public void onResult(int code, String msg,String Token) {
    			Log.e(TAG,"Register, code = " + code + " msg = " + msg+" Token:"+Token);
    			Map<String, String> params = new HashMap<String, String>();
        		// 携带反作弊查询token
        		params.put("token", token);
        		params.put("username", username);
        		params.put("password", password);
        		// 点赞操作需要反作弊检查
        		String riseResp = HttpClient4Utils.sendPost(httpClient, RISE_URL, params, Consts.UTF_8);
        		// 处理点赞的响应
    		}
    	});
        
        WatchMan.setSeniorCollectStatus(false); //提交token后,关闭传感器数据采集
    }
    
    Online Chat Tel:95163223 Free trial