本文档介绍了设备风险SDK(Android系统)的接入流程。
前提条件
设备风险SDK需在Android 4.0.3+(minSdkVersion版本15+)以上版本的系统运行。
为帮助落实针对您产品集成第三方SDK情况所应履行的隐私合规义务,降低隐私违规风险,进而实现您产品合规运营的业务目标,请您务必确保选用阿里云文档中心官网发布的最新版本产品。在使用设备风险识别前,请您务必仔细了解个人信息处理规定及《风险识别SDK隐私权政策》,并按照《设备风险识别SDK合规使用说明》进行接入。
权限说明
为增强风险识别效果,当前SDK需要以下权限:
权限内容 | 是否必选 | 备注 |
权限内容 | 是否必选 | 备注 |
android.permission.INTERNET | 是 | 用于获取网络访问权限。 没有该权限将导致SDK功能不可用。 |
android.permission.ACCESS_NETWORK_STATE | 否(推荐赋予) | 用于获取设备网络状态信息。 |
android.permission.READ_PHONE_STATE | 否(推荐赋予) | 该部分权限在Android 6.0以上系统中需要动态获取。 如果您要启用相关权限,那么在接入设备风险SDK并调用信息采集接口之前,确保您的App已经被授予了相关权限。 |
android.permission.WRITE_EXTERNAL_STORAGE | 否(推荐赋予) | |
android.permission.READ_EXTERNAL_STORAGE | 否(推荐赋予) |
下载和配置SDK
下载Android SDK,并完成解压。SDK为Android标准的.aar包。
拷贝SDK的aar文件到工程的libs目录下,并在App的build.gradle中添加以下依赖关系:
// 设备风险识别SDK implementation files('libs/Android-AliyunDevice-版本号.aar') // 三方网络库依赖 implementation 'com.squareup.okhttp3:okhttp:3.11.0' implementation 'com.squareup.okio:okio:1.14.0'
三方网络库不能省略,否则会造成设备风险识别SDK无法联网。
信息采集
完成信息采集,在进行风险识别的时候,您需要在满足合规要求的情况下尽可能早地调用该函数。
函数原型
public interface SecurityInitListener { // code表示接口调用状态码 void onInitFinish(int code); } public void initWithOptions(Context ctx, String appKey, Map<String, String> options, SecurityInitListener securityInitListener);
参数
ctx:当前Application Context,或Activity Context。
appKey:用于标识用户身份,可在阿里云控制台的设备App管理申请获取。
options:信息采集可选项,默认可以为null。可选参数如下。
字段名
说明
示例
字段名
说明
示例
IPv6
是否使用IPv6域名上报设备信息。
默认为“0”:使用IPv4域名;
“1”:使用IPv6域名。
"1"
CustomUrl
设置自有数据上报服务器域名
"https://cloudauth-device.aliyuncs.com"
CustomHost
设置自有数据上报服务器host
"cloudauth-device.aliyuncs.com"
DataType
设置不采集敏感数据的类型。
默认为空:采集所有数据;
具体可配置数据如下表
单选:
''NO_UNIQUE_DEVICE_DATA''
多选:
''NO_UNIQUE_DEVICE_DATA|
NO_IDENTIFY_DEVICE_DATA''
敏感数据的类型
说明
设备信息字段详情
敏感数据的类型
说明
设备信息字段详情
NO_UNIQUE_DEVICE_DATA
可变更唯一设备标识码
包括:OAID、Google广告ID、Android ID。
NO_IDENTIFY_DEVICE_DATA
不可变更唯一设备标识码
包括:IMEI、IMSI、SimSerial、BuildSerial(SN)、MAC地址。
NO_BASIC_DEVICE_
DATA
基础标识信息
包括:设备名(Build.DEVICE)、Android版本号(Build.VERSION#RELEASE)、屏幕分辨率。
NO_EXTRA_DEVICE_
DATA
扩展敏感信息
包括:黑灰产App列表、局域网IP、DNS IP、连接的WIFI信息(SSID、BSSID)、附近WIFI列表、定位信息。
securityInitListener:设备风险SDK信息采集回调接口,可在回调中判断信息采集是否成功。其中,code字段取值范围可参考“状态返回值”。
返回值
无。
获取客户端token
获取客户端token,并上报到业务服务器,后续通过服务器端设备风险识别事件及返回参数,从而获取设备风险信息。
函数原型
public class Securitytoken {
// 接口调用状态码
public int code;
// 用于服务器端查询结果的token字符串。
public String token;
}
public Securitytoken getDevicetoken();
返回值
Securitytoken类型。
code:返回接口调用状态码,用于判断接口调用是否成功。code字段取值范围可参考“状态返回值”。
token:返回客户端token字符串信息,可用于业务后续查询阿里云设备风险识别接口。
getDevicetoken接口的调用可能会较为耗时,请确保在App的非主线程中调用此接口,以避免因长时间阻塞主线程而导致App出现无响应(ANR)的情况,进而防止App崩溃。
因数据上报可能存在延迟,请确保SDK的信息采集接口和getDevicetoken接口调用时间间隔2秒以上。
token字符串在网络环境良好的场景下,长度为600字节左右;在网络环境较差的场景下,返回的长度在2.5K左右。
状态返回值
SecurityCode | Code | 备注 |
SecurityCode | Code | 备注 |
SC_SUCCESS | 10000 | SDK信息采集成功。 |
SC_NOT_INIT | 10001 | SDK未信息采集。 |
SC_NOT_PERMISSION | 10002 | SDK需要的Android基础权限未完全授权。 |
SC_UNKNOWN_ERROR | 10003 | 系统未知错误。 |
SC_NETWORK_ERROR | 10004 | 网络错误。 |
SC_NETWORK_ERROR_EMPTY | 10005 | 网络错误,返回内容为空串。 |
SC_NETWORK_ERROR_INVALID | 10006 | 网络返回的格式非法。 |
SC_PARSE_SRV_CFG_ERROR | 10007 | 服务端配置解析失败。 |
SC_NETWORK_RET_CODE_ERROR | 10008 | 网关返回失败。 |
SC_APPKEY_EMPTY | 10009 | AppKey为空。 |
SC_PARAMS_ERROR | 10010 | 其他参数错误。 |
SC_FGKEY_ERROR | 10011 | 密钥计算错误。 |
SC_APPKEY_ERROR | 10012 | SDK版本和AppKey版本不匹配。 |
示例代码
设备风险SDK信息采集,信息采集接口需要在满足合规要求的情况下,尽可能早的时候调用。
其中,参数ALIYUN_APPKEY用于标识用户身份,可在阿里云控制台的设备App管理申请获取。
您可以通过参数options中DataType字段,用于控制不采集的具体数据,满足具体业务场景的隐私要求。
public class CustomApplication extends Application {
private static String ALIYUN_APPKEY = "xxxx";
@Override
public void onCreate() {
super.onCreate();
//增加隐私数据采集开关,不采集NO_IDENTIFY_DEVICE_DATA类型数据,多选使用|进行拼接。且"(NO_IDENTIFY_DEVICE_DATA))"处输入数据不可为空。
Map<String, String> options = new HashMap<>();
options.put("DataType", String.valueOf(NO_IDENTIFY_DEVICE_DATA));
// 通过设备风险SDK采集信息,信息采集接口需要在风险场景中尽可能早地时候调用。
SecurityDevice.getInstance().initWithOptions(this, ALIYUN_APPKEY, options, null);
}
}
在业务需要风险识别的场景下(如注册、活动推广等)获取客户端token并上报到业务的服务器端。确保信息采集和getDeviceToken接口的调用间隔在2秒以上。
另外,getDevicetoken接口比较耗时,切勿在UI线程中调用。
new Thread() {
@Override
public void run() {
Securitytoken st = SecurityDevice.getInstance().getDevicetoken();
if(null != st){
if(SecurityCode.SC_SUCCESS == st.code){
Log.d("AliyunDevice", "token: " + st.token);
// 发送token到业务自有服务器并查询阿里云设备风险识别接口。
// sendToAPPServer(st.token);
} else {
Log.e("AliyunDevice", "getDevicetoken error, code: " + st.code);
}
} else {
Log.e("AliyunDevice", "getDevicetoken is null.");
}
}
}.start();
接口混淆配置
-keep class net.security.device.api.** {*;}
-dontwarn net.security.device.api.**
调用风险识别API接口
devicetoken与其他参数,根据如下相应的风险识别服务事件参数文档说明,请求风险识别API进行识别:
常见问题答疑
设备风险识别SDK支付哪些架构?
目前支持arm、armv7和arm64三个架构。
SDK的大小是多少?
单架构的SO文件在1.8M左右。
设备风险识别SDK为了保证自身的抗逆向性以及数据在网络传输过程中的安全性,SDK中有大量的插花、膨胀及加解密操作,所以SDK体积会相对较大。
deviceToken有效期为多少,能否多次调用服务端API使用同一个deviceToken?
deviceToken有效期是7天,可以多次调用。
- 本页导读 (1)
- 前提条件
- 权限说明
- 下载和配置SDK
- 信息采集
- 获取客户端token
- 状态返回值
- 示例代码
- 接口混淆配置
- 调用风险识别API接口
- 常见问题答疑