Android接入

法规说明

根据我国《网络安全法》等相关法律法规及国家标准的要求,个人信息的收集和使用,应当遵循合法、正当、必要的原则,公开收集、使用规则,明示收集、使用信息的目的、方式和范围,并经被收集者同意。故我们强烈建议您在拟接入易盾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 {
	compile(name:'netmobsecLib-x.x.x', ext: 'aar')
}

导入需要的ABI

SDK提供了armeabi、armeabi-v7a、x86、x86_64、arm64-v8a五种ABI的支持,默认会导出这五种ABI。注意:

  • 如果产品本身不支持这么多ABI,就需要对最终导出的ABI进行过滤,不然会CRASH
  • 如果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不会申请任何权限,但是为了提升反作弊的效果,建议在AndroidMenifest.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_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

添加ProGuard配置

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

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

SDK接口

反作弊配置类:WatchManConf

使用之前,先导入该类

import com.netease.mobsec.WatchManConf;

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

  • 作用:是否允许采集本机已安装的软件
public void setCollectApk(boolean flag)
  • 作用:在init的时候,是否允许开始采集传感器实时数据
public void setCollectSensor(boolean flag)
  • 作用:设置APP渠道名称
public void setChannel(String Channel)
  • 作用:供用户上传自定义数据,可多次调用
public void setExtraData(String key, String value)
  • 作用:设置私有化的url地址,正常情况下不用设置
public void setUrl(String Url)
  • 作用:供用户自行实现网络相关行为
public void setAbstractNetClient(AbstractNetClient netclient)

反作弊类:WatchMan

init接口

使用之前,先导入类

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,采集数据并将数据提交到服务端

参数说明:

参数名类型是否必须作用
contextContext用于获取设备基本信息
productNumberString产品编号
watchmanconfWatchManConf设置配置
callbackInitCallback结果描述

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

public interface InitCallback {
    void onResult(int code, String msg);
}

code为200,表示成功;其他值均为失败,失败信息通过msg返回。

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,此接口是异步接口
参数名类型是否必须作用
timeoutint最长超时时间,单位毫秒。若没指定,则默认3000毫秒;timeout可设置范围为1000~10000毫秒
callbackRequestCallback结果描述

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

public interface GetTokenCallback {
    void onResult(int code, String msg, String token);
}

code为200,表示成功,可获取token值;其他code值均为失败,失败信息通过msg返回。

setSeniorCollectStatus 接口

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

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

接口的定义如下:

public static void setSeniorCollectStatus(boolean flag)

接口说明如下:

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

接入示例

在项目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后,关闭传感器数据采集
}