Java 接入教程
1. 环境要求
| 说明 | |
|---|---|
| 兼容版本 | Android 5.0 及以上系统 |
| 支持架构 | armeabi-v7a, arm64-v8a, x86, x86_64 |
2. 合规说明
2.1 隐私合规指引
集成本 SDK 时,请遵循易盾隐私合规要求:风控引擎隐私合规指引 - 网易易盾。
2.2 Google Play 数据安全要求
对于上传到 Google Play 的应用,需填写数据安全表单。面向海外市场时可参考下表填写:
| Google Play 数据安全表单问题 | 回复 |
|---|---|
| 您的应用是否收集或共享任何用户数据类型? | 是 |
| 收集什么类型的数据? | 设备或其他标识符 |
| 这些数据是被收集、共享,还是两者兼有? | 收集 |
| 这些数据是暂时处理的吗? | 是 |
| 为什么要收集这些用户数据? | 欺诈预防、安全和合规 |
3. 导入 SDK
3.1 gradle 7.0 以下版本
(1)将 aar 文件放到工程 libs 文件夹下,在 app 的 build.gradle 中增加:
repositories {
flatDir {
dirs 'libs'
}
}
(2)在 dependencies 中增加对 aar 包的引用(x.x.x 为版本号,请联系技术支持确认最新版本):
dependencies {
implementation(name: 'HTProtectLib-x.x.x', ext: 'aar')
}
3.2 gradle 7.0 及以上版本
将 aar 文件放到工程 libs 文件夹后,在 build.gradle 中增加:
dependencies {
implementation files('libs/HTProtectLib-x.x.x.aar')
}
3.3 过滤需要的 ABI
SDK 默认导出 armeabi-v7a, arm64-v8a, x86, x86_64 四种 ABI。
注意:
- 如果应用本身不支持这么多 ABI,需对最终导出的 ABI 进行过滤;
- 过滤时只能在上述四种范围内选择。示例(仅保留三种):
defaultConfig {
applicationId "com.XX.XXX"
minSdkVersion XX
targetSdkVersion XX
versionCode XX
versionName "X.X.X"
ndk {
abiFilters "armeabi-v7a", "arm64-v8a", "x86"
}
}
3.4 权限说明
使用 AAR 接入会自动声明如下权限,无需在 AndroidManifest.xml 中手动添加。SDK 自身不会主动向用户申请运行时权限,以下权限仅用于提升风控识别效果,宿主 App 可按需保留:
<!--网络通信-->
<uses-permission android:name="android.permission.INTERNET"/>
<!--获取 MAC 地址-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<!--获取网络状态-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!--若 targetSdkVersion >= 30,需增加以下配置,否则会影响 SDK 功能-->
<!--谷歌广告ID权限-->
<uses-permission android:name="com.google.android.gms.permission.AD_ID" />
<!--华硕oaid权限,不添加则无法获取-->
<uses-permission android:name="com.asus.permission.READ_SDID_PROVIDER" />
<uses-permission android:name="com.asus.msa.SupplementaryDID.ACCESS" />
<uses-permission android:name="freemme.permission.msa" />
<uses-permission android:name="freemme.permission.msa.SECURITY_ACCESS" />
<uses-permission android:name="com.nemu.oaid.permission.read" />
<queries>
<intent>
<action android:name="android.intent.action.MAIN"/>
</intent>
</queries>
3.5 添加 ProGuard 配置
若使用 ProGuard 混淆,需将 SDK 类排除:
-keep class com.netease.htprotect.**{*;}
-keep class com.netease.mobsec.**{*;}
4. 初始化
前置条件(必须满足):
- 必须在用户同意隐私政策后再调用;
- 必须在主进程调用,避免加载异常;
init()必须先于其他接口调用。
4.1 方法定义
public static void init(Context context, String productId, HTPCallback callback, HTProtectConfig config);
4.2 HTPCallback 回调 code 说明
HTPCallback.onResult(int code, String msg) 的 code 取值如下:
| code | 含义 | 建议处置 |
|---|---|---|
200 |
初始化正常,SDK 一切正常 | 可继续调用其他接口 |
199 |
初始化参数错误 | 检查 productId、config 等入参是否正确 |
400 |
需走配置下发流程(见 4.3,非必须) | 将 msg 上报业务服务端,按 4.3 流程回填配置 |
初始化响应内部包含 Token 缓存时长 cacheTime,默认 60 秒,具体值以服务端配置为准。SDK 根据该时长维护内存缓存;该配置不改变现有 HTPCallback 回调签名。
4.3 code == 400 的处理流程(非必须)
当 code 返回 400 时,可由业务服务端协助完成一次配置下发。此流程非必须:若不接入,SDK 将使用缓存或内置默认配置,不影响正常运行。流程如下:
sequenceDiagram
participant SDK as 易盾智能风控SDK
participant App as App
participant Biz as 业务服务端
participant YD as 易盾服务端
SDK-->>App: onResult(code=400, msg)
App->>Biz: 上报 msg
Biz->>YD: 通过配置下发(getConfig)接口转发 msg
YD-->>Biz: 返回配置数据 configData
Biz-->>App: 下发 configData
App->>SDK: ioctl(Cmd_SetConfigData, configData)
对应代码:
// code == 400 时,msg 需经业务服务端转发给易盾服务端(配置下发接口),
// 拿到易盾返回的 configData 后,通过通用查询接口回填给 SDK:
HTProtect.ioctl(RequestCmdID.Cmd_SetConfigData, configData);
4.4 初始化示例
public class DemoApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// 仅在主进程初始化
if (!isMainProcess(this)) {
return;
}
// 仅在用户已同意隐私协议后初始化
if (!hasAgreedPrivacyPolicy()) {
return;
}
HTProtectConfig config = new HTProtectConfig();
config.setServerType(1); // 1=中国大陆(默认)
config.setExtraData("uid", "123456"); // 可选:业务字段
config.setExtraData("bizId", "10001");
HTProtect.init(
this,
"your_product_id",
new HTPCallback() {
@Override
public void onResult(int code, String msg) {
if (code == 200) {
// 初始化成功,可获取 Token
} else if (code == 199) {
// 参数错误,检查入参
} else if (code == 400) {
// 走 4.3 配置下发流程(非必须)
}
}
},
config
);
}
}
5. HTProtectConfig 配置说明
HTProtectConfig 的所有配置项均为可选,按需设置。
| 方法 | 说明 | 默认 / 备注 |
|---|---|---|
setServerType(int server) |
设置服务器地区类型(取值见 5.1) | 默认 1(中国大陆) |
setHost(String host) |
设置服务端地址,仅私有化部署需要 | SaaS 服务无需配置 |
setExtraData(String key, String value) |
追加单个扩展字段(可多次调用) | 可选 |
5.1 setServerType 取值
以下取值用于选择加速节点。若需使用海外数据中心,请联系技术支持。
| 取值 | 地区 | 说明 |
|---|---|---|
1 |
中国大陆地区 | 默认值,无须设置 |
2 |
中国台湾地区 | |
3 |
海外地区 |
5.2 扩展字段设置
通过 setExtraData 逐字段追加扩展字段:
HTProtectConfig config = new HTProtectConfig();
config.setExtraData("uid", "12345");
config.setExtraData("bizId", "1");
6. 获取 Token
前置条件:必须在
init()后再调用。同步 / 异步如何选择:
- 同步
getToken():优先检查缓存 token 是否仍在初始化响应下发的缓存时长内;缓存有效时,对缓存 token 二次加密后立即返回,同时在后台异步刷新 token;无缓存或缓存已过期时,立即返回降级 token,同时触发后台异步刷新。适合追求快速拿到可用 token的场景。- 异步
getTokenAsync():每次调用都实时采集设备 / 风险数据并上报,完成后通过回调返回最新 token,属于耗时操作,适合需要实时风险状态的场景。注意事项:
GetTokenCallback不应传null;- SDK 未初始化时返回
code == 201(error not init)。
初始化响应会下发 Token 缓存时长 cacheTime,默认 60 秒,具体值以服务端配置为准;缓存不会持久化到 App 本地存储。
6.1 方法定义
// 同步获取:优先返回有效缓存或降级 token,并在后台异步刷新
public static AntiCheatResult getToken();
// 异步获取:每次实时采集并上报,属于耗时操作
public static void getTokenAsync(GetTokenCallback callback);
6.2 异步获取
HTProtect.getTokenAsync(new GetTokenCallback() {
@Override
public void onResult(AntiCheatResult result) {
if (result.code == 200) {
String token = result.token;
// 上报 token 至业务服务端(注意兼容离线 token ~5KB)
} else {
// 失败,参照第 7 章结果码表(result.code / result.codeStr)
}
}
});
6.3 同步获取
// 注意:同步接口在主线程调用会返回 code==202,请放到子线程
AntiCheatResult result = HTProtect.getToken();
if (result.code == 200) {
String token = result.token;
} else {
// 处理错误,参照第 7 章
}
注意:同步接口可能触发耗时逻辑,请放到子线程执行,不要在主线程频繁调用。
7. 获取 Token 的返回值(AntiCheatResult)
getToken() / getTokenAsync() 均返回 AntiCheatResult 对象。
7.1 AntiCheatResult 类结构
package com.netease.htprotect.result;
public class AntiCheatResult {
public String token; // token 内容
public int code; // 结果码,200 为成功
public String codeStr; // 结果码对应的文字说明
}
7.2 字段说明
| 字段 | 说明 |
|---|---|
code |
结果码,200 表示成功,其余均为失败(取值见 7.3) |
codeStr |
结果码对应的文字说明(见 7.3) |
token |
code==200 时返回正常 token;网络不佳或超时时返回离线 token(见 7.4) |
7.3 结果码(code)说明
| code | codeStr | 含义 | 建议处置 |
|---|---|---|---|
200 |
success |
调用成功 | 正常使用 token |
201 |
error not init |
SDK 未初始化 | 确认 init() 已回调 code==200 后再取 token |
202 |
error. run on main thread |
在主线程运行(同步接口) | 将 getToken() 放到子线程执行 |
204 |
gen token error |
其他原因导致生成 token 失败 | 重试;持续失败按 8.4 收集信息反馈 |
7.4 token 长度与离线 token
| 情况 | token 类型 | 大致长度 |
|---|---|---|
| 正常(网络可用) | 在线 token | 默认 40 字节 |
| 网络异常 / 超时 / 降级 | 离线 token | 5KB 左右 |
重要:
- 业务侧不要对 token 长度做硬编码限制 / 截断,需同时兼容 40 字节的在线 token 与约 5KB 的离线 token;
- 上报字段、数据库列、网络包大小限制等都应预留足够空间,避免离线 token 被截断导致服务端校验失败;
- 离线 token 仍可正常上报,由易盾服务端识别处理,无需业务侧区分在线/离线。
7.5 返回值判断示例
HTProtect.getTokenAsync(new GetTokenCallback() {
@Override
public void onResult(AntiCheatResult result) {
if (result.code == 200) {
String token = result.token; // 可能是在线(40B)或离线(~5KB) token
uploadToken(token); // 完整上报,勿截断
} else {
// 失败:参照 7.3 结果码表,result.codeStr 为文字说明
handleTokenError(result.code, result.codeStr);
}
}
});
8. 接入指引
8.1 调用时序总览
sequenceDiagram
participant App as App
participant SDKAPI as 易盾风控SDK接口层
participant SDKCore as 易盾风控SDK底层
participant YD as 易盾服务端
Note over App,SDKCore: 用户同意隐私协议后,主进程调用接口触发 SDK 加载
App->>SDKAPI: init(productId, config)
SDKAPI->>SDKCore: 触发 SDK 加载与初始化
SDKCore->>YD: 初始化握手 / 拉取策略
YD-->>SDKCore: 初始化响应(业务配置、Token 缓存时长,默认 60 秒)
SDKCore->>SDKCore: 保存业务配置并记录 Token 缓存时长
SDKCore-->>SDKAPI: SDK 加载完成
Note over SDKAPI,SDKCore: 后续 Token 接口复用已加载组件
SDKAPI-->>App: HTPCallback.onResult(code)
Note over App,SDKCore: 业务接口调用触发 Token 获取
App->>SDKAPI: getToken()(同步,放在子线程)
SDKAPI->>SDKCore: 触发同步 Token 获取
SDKCore->>SDKCore: 检查缓存 token 是否超过缓存时长
alt 缓存有效
SDKCore->>SDKCore: 对缓存 token 二次加密
SDKCore-->>SDKAPI: AntiCheatResult(缓存 token)
SDKAPI-->>App: 立即返回缓存 token
else 无缓存或缓存已过期
SDKCore->>SDKCore: 生成降级 token
SDKCore-->>SDKAPI: AntiCheatResult(降级 token)
SDKAPI-->>App: 立即返回降级 token
end
Note over SDKAPI,SDKCore: 同步 getToken() 返回后,底层同时执行后台异步刷新
SDKCore->>SDKCore: 实时采集设备 / 风险数据
SDKCore->>YD: 上报采集数据并请求新 token
YD-->>SDKCore: 返回新 token
SDKCore->>SDKCore: 按 Token 缓存时长更新内存缓存
App->>SDKAPI: getTokenAsync(callback)(异步,耗时)
SDKAPI->>SDKCore: 触发实时 Token 获取
SDKCore->>SDKCore: 每次实时采集设备 / 风险数据
SDKCore->>YD: 上报采集数据并请求最新 token
YD-->>SDKCore: 返回最新 token
SDKCore->>SDKCore: 按 Token 缓存时长更新内存缓存
SDKCore-->>SDKAPI: AntiCheatResult(最新 token)
SDKAPI-->>App: callback(最新 token)
时序图中的 Token 缓存时长由初始化响应下发,默认 60 秒;仅当缓存 token 未超过该时长时,
getToken()才会走缓存二次加密分支。
8.2 推荐接入流程
// 1. 用户同意隐私协议后,Application 主进程初始化
HTProtectConfig config = new HTProtectConfig();
config.setServerType(1); // 中国大陆,默认值
config.setExtraData("uid", "12345");
HTProtect.init(context, "product_id", callback, config);
// 2. init 回调 code==200 后,首次在业务节点用异步获取 token(每次实时采集并上报,耗时)
HTProtect.getTokenAsync(new GetTokenCallback() {
@Override
public void onResult(AntiCheatResult result) {
if (result.code == 200) {
uploadToken(result.token);
}
}
});
// 3. 之后的业务埋点,使用同步 getToken() 获取并上报(须在子线程)
// 有效缓存会二次加密后立即返回;无效缓存会返回降级 token,并同时触发后台刷新
new Thread(() -> {
AntiCheatResult result = HTProtect.getToken();
if (result.code == 200) {
uploadToken(result.token);
}
}).start();
接入步骤:
- 向运营获取
productId(必传); - 在隐私政策弹窗中加入易盾智能风控 SDK 采集授权说明;
- 用户同意隐私协议后,在
Application.onCreate主进程中构建HTProtectConfig并调用HTProtect.init(); init回调code==200后,首次在业务节点(注册、登录、营销结算、支付、关键操作等)通过getTokenAsync()获取 Token 并上报;- 之后的业务埋点建议使用
getToken()获取 Token 并上报(须在子线程); - 客户端将 Token 随业务请求完整上报至业务服务端;服务端后续处理不属于客户端接入范围。
8.3 接入建议
- 必须在用户同意隐私政策后再调用
HTProtect.init(); HTProtect.init()必须先于所有其他接口调用;- 按需选择
getTokenAsync()/getToken()(选择逻辑见第 6 章); GetTokenCallback不要传null;HTProtectConfig尽量在初始化前配置完整;- 多进程 App 须确认 SDK 运行在主进程中。
- 客户端职责止于获取并上报 Token,不在客户端执行风控校验或决策。
8.4 排查信息收集清单
向技术支持反馈问题时,建议附带以下信息以加快定位:
| 信息项 | 说明 |
|---|---|
| SDK 版本号 | 当前接入的 HTProtect 版本 |
| 设备信息 | 机型、系统版本、CPU 架构(ABI) |
| 复现步骤 | 触发问题的接口调用顺序 |
| 返回值 | code / codeStr / msg |
| 日志 | init 回调日志、异常堆栈(如 UnsatisfiedLinkError) |
9. 如何验证接入成功
按以下清单逐步自检,全部通过即视为接入成功。
9.1 编译与打包验证
| 检查项 | 通过标准 |
|---|---|
| aar 依赖 | 编译无报错,能引用到 HTProtect 类 |
| so 打包 | 解压 APK,lib/<abi>/ 下含 libNetHTProtect.so |
| ABI 匹配 | abiFilters 与目标设备架构一致,安装运行不报 UnsatisfiedLinkError |
| ProGuard | release 包混淆后 SDK 类未被裁剪(见 3.5 keep 规则) |
9.2 初始化验证
HTProtect.init()的HTPCallback.onResult回调返回code == 200;- 若返回
199:检查productId/ config 入参; - 若返回
400:可按 4.3 完成配置下发流程;若不接入该流程,将使用默认配置,不影响运行。
new HTPCallback() {
@Override
public void onResult(int code, String msg) {
Log.d("HTProtect", "init code=" + code + ", msg=" + msg);
// 期望看到 code=200
}
};
9.3 获取 Token 验证
- 调用
getTokenAsync(),回调返回result.code == 200且result.token非空; - 打印长度确认:正常网络下约 40 字节;断网/弱网下为 离线 token(~5KB),二者均属正常。
HTProtect.getTokenAsync(result -> {
Log.d("HTProtect", "code=" + result.code
+ ", len=" + (result.token == null ? 0 : result.token.length()));
// 期望 code=200,token 非空
});
弱网验证技巧:开启飞行模式或限速后再取 token,应返回离线 token(~5KB)而非失败,借此验证业务侧对离线 token 的兼容性。
9.4 Token 上报验证
- 客户端能将 token 随业务请求完整上报至业务服务端;
- 业务服务端能正常接收 token,且在线 / 离线 token 均未被截断;
- 服务端后续风控处理不属于客户端接入范围。
9.5 接入成功判定
同时满足以下条件,即接入成功:
- ✅ init 回调
code == 200; - ✅ getToken 回调
code == 200且 token 非空; - ✅ 在线/离线 token 均能完整上报、不被截断;
- ✅ 业务服务端能完整接收客户端上报的 token。
10. FAQ / 异常排查
10.1 初始化相关
Q:调用 HTProtect.init() 后没有任何回调 / 回调 code 非 200?
排查顺序:
- 确认
productId等参数是否正确,host(如配置)是否可达; - 确认
HTPCallback未传null,否则无法接收初始化结果; - 确认是否在用户同意隐私协议之后调用,提前调用可能被业务逻辑拦截。
Q:多进程 App 应该在哪个进程初始化?
只在主进程初始化即可。建议在 Application.onCreate() 中先判断进程名,非主进程直接 return:
@Override
public void onCreate() {
super.onCreate();
if (!isMainProcess(this)) {
return; // 非主进程不初始化
}
// 主进程初始化逻辑
}
Q:可以重复调用 init() 吗?
不建议,请保证初始化只执行一次。若为切换海外数据中心,可根据切换频次调用 init()。
Q:HTPCallback code 为 400 时,是否必须接入业务服务端配置下发?
非必须。拉取配置失败后会使用缓存或内置配置,不影响运行。
10.2 获取 Token 相关
Q:如何选择同步还是异步调用?
- 同步
getToken():缓存 token 在缓存时长内时二次加密后立即返回;无缓存或缓存已过期时返回降级 token,并同时触发后台异步刷新; - 异步
getTokenAsync():每次实时采集数据并上报,完成后通过回调返回最新 token,属于耗时操作; - 若需要快速拿到一个可用 token,请使用同步;若需要实时的风险状态,请使用异步。
Q:getTokenAsync() 回调返回 code == 201(error not init)?
说明 SDK 尚未初始化或初始化未完成:
- 确认
HTProtect.init()已先于getTokenAsync()调用; - 初始化是异步过程,建议在
HTPCallback.onResult成功(code==200或者code==400)后再触发首次取 Token; - 确认初始化进程与取 Token 进程一致(均为主进程)。
Q:Token 一直获取失败 / code != 200?
- 检查服务端是否正常下发,确认
productId在服务端已配置; - 打印
result.code与result.codeStr,结合 7.3 结果码表定位; - 避免在初始化完成前的极早期高频调用。
Q:同步 getToken() 阻塞主线程导致卡顿 / ANR?
同步接口可能触发耗时逻辑,请放到子线程执行,不要在主线程频繁调用。
Q:设备信息、设备 id、token 是否缓存到本地?
不会持久化到 App 本地存储。SDK 按初始化响应中的 cacheTime 在内存中维护 token 缓存,默认有效期为 60 秒;无缓存或缓存已过期时,同步 getToken() 返回降级 token,并在后台异步刷新。
10.3 Native 加载相关
Q:出现 UnsatisfiedLinkError?
- 确认 APK 实际打包的 ABI 与目标设备匹配,
abiFilters未误删所需架构; - 确认 SDK 的
.so未被资源压缩 / 混淆裁剪掉。
Q:与其他加固 / 加壳工具冲突?
- 部分加固方案会对
.so加密或对类加载做改写,可能影响 native 初始化; - 建议确认 HTProtect 的 native 库在加固白名单中,或调整加固策略避免对其
.so二次处理。
10.4 接入复杂度相关
Q:接入这个 SDK 工作量大吗?需要改动很多业务代码?
接入很轻,核心只有两步:
Application.onCreate(主进程、隐私同意后)调用一次HTProtect.init();- 在业务节点调用
getToken()/getTokenAsync()拿到 token,随业务请求上报。
不需要改动现有业务逻辑,token 作为一个附加字段透传给业务服务端即可。
Q:config 里这么多参数都要配吗?
不需要。除 init 的 productId 必传外,HTProtectConfig 所有配置项均为可选。
10.5 误封 / 误判相关
Q:会不会把正常用户误判为风险 / 直接封禁?
SDK 侧不做封禁决策,最终是否拦截、如何处置,由业务服务端结合易盾返回的风险标签自行决定。建议:
- 业务侧不要对单一校验结果直接做「封号」等强处置,应结合风险等级分级响应(如二次验证、限流、人工复核);
- 中 / 低风险标签优先用于观察 / 加验证,再逐步收紧策略,避免上线即误伤。
Q:token 校验失败(code != 200)是否等于用户有问题?
不是。code != 200 多数是环境 / 网络 / 时序问题(如 init 未完成就取 token、网络不通),并非用户作弊。请先按 7.3 结果码表排查技术原因,不要直接对用户做处置。
10.6 性能 / 稳定性影响相关
Q:接入后会不会拖慢 App 启动 / 卡顿 / 增加崩溃?
- 启动:
init()内部为异步初始化,不阻塞Application.onCreate主流程; - 取 token:同步
getToken()优先返回缓存或降级 token,并在后台异步刷新; - 异步
getTokenAsync()每次实时采集并上报,属于耗时操作,回调在完成后触发; - 同步
getToken()仍可能触发内部处理,严禁在主线程调用,必要时放子线程。
Q:取 token 耗时多久?可以高频调用吗?
token 获取涉及实时采集,存在一定耗时。建议:
- 在关键业务节点按需获取,不要在循环 / 高频回调里反复取;
- 避免在 init 完成前的极早期高频调用(会返回
code == 201)。
10.7 数据获取与处理相关
Q:SDK 会采集哪些数据?
SDK 用于欺诈预防与安全,采集的是设备及其他标识符类信息(用于风险识别),不采集与风控无关的隐私内容。具体采集范围与用途,请以隐私合规指引(见 2.1)及 Google Play 数据安全表(见 2.2)为准。
Q:SDK 会主动申请权限吗?
不会。SDK 自身不主动申请运行时权限(见 3.4)。AAR 声明的网络 / 设备状态等权限仅用于提升风控效果,缺失不会导致崩溃,但可能降低识别精度。
Q:必须在用户同意隐私政策后才能初始化吗?
是,这是强制要求。必须在用户同意隐私政策后再调用 HTProtect.init(),并在隐私政策弹窗中加入本 SDK 的采集授权说明,否则存在合规风险。
Q:采集的数据存在哪、会不会泄露给第三方?
数据用于欺诈预防、安全与合规目的(与 Google Play 表单一致),处理与传输遵循易盾隐私合规要求。涉及数据存储、共享、留存的具体条款,以易盾隐私合规指引(2.1)及双方协议为准。
Q:海外 / GDPR 场景需要注意什么?
可通过海外数据中心确保数据在合规区域处理,具体情况请联系技术支持沟通。
11. AI 辅助接入 Prompt 约束
你是「易盾智能风控 SDK-Android」接入助手。请严格依据本接入文档回答与生成代码,遵守以下约束:
【API 白名单(仅可使用以下方法签名)】
- HTProtect.init(Context, String productId, HTPCallback, HTProtectConfig)
- HTProtect.getToken() // 返回 AntiCheatResult,同步,须在子线程
- HTProtect.getTokenAsync(GetTokenCallback) // 异步,回调返回 AntiCheatResult
- HTProtect.ioctl(RequestCmdID.Cmd_SetConfigData, configData) // 仅 code==400 配置下发时使用
- HTProtectConfig.setServerType(int) / setHost(String)
/ setExtraData(String, String)
- AntiCheatResult 字段:token / code / codeStr / businessId
不得调用上述清单之外的任何 SDK 方法或字段;如涉及未列出的能力,
请明确回复「文档未提供该 API」,禁止编造方法名、参数或返回值。
【关键事实(不得偏离)】
- 成功码统一为 code == 200;其余 code(201/202/203/204)均为失败,含义见结果码表。
- 结果对象为 AntiCheatResult,判断成功用 result.code == 200,禁止使用 ret / ERROR_NOT_INIT 等旧写法。
- 初始化响应包含 token 缓存时长:cacheTime 默认 60 秒,具体值以服务端配置为准;不会持久化到 App 本地存储。
- 同步 getToken():缓存 token 在缓存时长内时二次加密后立即返回;无缓存或缓存已过期时返回降级 token,同时触发后台异步刷新;在主线程调用会返回 code==202,必须放子线程。
- 异步 getTokenAsync():每次实时采集数据并上报,属于耗时操作,完成后回调返回最新 token。
- init 必须满足:用户已同意隐私政策、主进程、先于其他接口调用;回调 code==200 后方可取 token。
- token 长度:在线约 40 字节,离线(弱网/超时)约 5KB;禁止对 token 做长度限制或截断。
- HTProtectConfig 除 init 的 productId 外全部可选;setHost 仅私有化部署需要,SaaS 无需配置。
- code==400 的配置下发为非必须流程,不接入则使用缓存/内置配置,不影响运行。
- SDK 不做封禁决策、不主动申请运行时权限、不在本地缓存设备信息/设备id/token。
【输出要求】
- 生成代码须与文档示例风格一致;同步取 token 的示例必须放在子线程。
- 涉及合规/采集字段问题时,引导参考隐私合规指引(2.1)与 Google Play 数据安全表(2.2),不臆造采集字段。
- 不确定或文档未覆盖时,明确说明并建议联系易盾技术支持,不做猜测性回答。

