HMT Android SDK 用于帮助接入方记录应用内的页面浏览、用户事件和相关统计信息,向接入方提供统计分析能力。
SDK 默认仅采集 SDK 运行必需的核心字段(事件类型、时间戳、AppKey、渠道 ID、随机设备 ID、操作系统类型、SDK 版本号),默认不采集设备标识符(OAID、OpenUDID)、系统语言等个人信息。
以下信息 SDK 已永久移除,任何情况下均不可采集:IMEI、IMSI、MAC 地址、Android ID、SSID/BSSID、GPS 经纬度、基站信息、传感器状态、网络制式、屏幕分辨率、已安装应用列表、系统语言、Root 状态、Google 广告 ID(AAID)、热力图。
SDK 自身不声明任何 Android 权限,不主动发起运行时权限申请。接入方如需开启可选字段(如网络制式、设备标识符等),需自行在 AndroidManifest 中声明对应权限,并在取得终端用户授权后调用 SDK 相应接口。
接入方负责在其自身隐私政策、授权机制和业务流程中完成对终端用户的告知与授权确认。
将 SDK Jar 包放入项目 libs/ 目录并同步。
<manifest ...>
<application ...>
<!-- AppKey(必填) -->
<meta-data android:name="HMT_APPKEY" android:value="YOUR_APP_KEY" />
<!-- 渠道 ID(必填) -->
<meta-data android:name="HMT_CHANNEL" android:value="YOUR_CHANNEL_VALUE" />
<!-- 可选:排除自动注入的 Activity(字节码插桩场景) -->
<!-- 值为逗号分隔的包名前缀列表 -->
<meta-data android:name="HMT_EXCLUDE_ACTIVITIES"
android:value="com.example.payment.,com.example.health." />
</application>
<!-- SDK 数据上报所需 -->
<uses-permission android:name="android.permission.INTERNET" />
</manifest>
-keep class com.hmt.analytics.** { *; }
建议在用户同意隐私政策后初始化 SDK,不建议在 Application.onCreate() 中直接调用。
// 仅核心字段(type/ts/_ua/device_id/os/sv/v/channel_id)
HMTAgent.Initialize(context, 0x00);
// 指定需要采集的额外字段(白名单)+ 需排除的字段(黑名单)
HMTAgent.Initialize(context, 0x00,
new String[]{"model", "app_name"}, // collectionFields:白名单
new String[]{"device_name"} // blacklistFields:黑名单
);
// 带延迟发送
HMTAgent.Initialize(context, 0x00,
new String[]{"model"}, // 白名单
null, // 黑名单
5000L // 延迟发送(毫秒)
);
参数说明:
| 参数 | 说明 |
|---|---|
context |
上下文 |
reportPolicy |
0x00 批量发送 / 0x01 实时发送 / 0x02 定时发送 / 0x04 计数发送 |
collectionFields |
白名单:需采集的额外字段(仅核心字段时可传 null) |
blacklistFields |
黑名单:白名单中需排除的字段,优先级高于白名单 |
delaySendTime |
启动时延迟发送时间(毫秒),-1 表示不延迟 |
以下方式传入 SDK 推荐的默认采集字段(非个人信息的基础设备与应用信息):
// 使用 @Deprecated 的旧接口,SDK 内部设置默认白名单+黑名单
HMTAgent.Initialize(context, 0x00);
该接口默认采集:char、model、manufacturer、device_name、os_version、app_name、app_version、app_code、package_name。
默认不采集:_oaid、_openudid、muid、cust_id、sd。
| 分类 | 字段名 | 描述 | 默认 |
|---|---|---|---|
| 核心 | type、ts、_ua、device_id、os、sv、v、channel_id |
SDK 运行必需 | ✅ 始终采集 |
| 设备信息 | char |
字符集(utf-8) | 需加入白名单 |
model |
设备型号 | 需加入白名单 | |
manufacturer |
设备厂商 | 需加入白名单 | |
device_name |
厂商+型号 | 需加入白名单 | |
os_version |
操作系统版本 | 需加入白名单 | |
| 应用信息 | app_name |
应用名称 | 需加入白名单 |
app_version |
应用版本名 | 需加入白名单 | |
app_code |
应用版本号 | 需加入白名单 | |
package_name |
应用包名 | 需加入白名单 | |
| 设备标识 | _oaid |
OAID(默认关闭,需集成 OAID SDK) | 需加入白名单 |
_openudid |
OpenUDID(默认关闭,可按需开启) | 需加入白名单 | |
muid |
接入方自定义用户标识(默认关闭) | 需加入白名单 | |
cust_id |
账号 ID(默认关闭) | 需加入白名单 | |
sd |
屏幕色彩深度(当前不可用) | 需加入白名单 | |
| 已永久删除 | IMEI、IMSI、MAC 地址、Android ID、SSID/BSSID、GPS 经纬度、基站信息、传感器状态、网络制式、屏幕分辨率、已安装应用列表、系统语言、Root 状态、AAID、热力图 | — | ❌ 不可采集 |
// 动态添加字段
HMTAgent.enableCollectionField("_oaid");
// 动态屏蔽字段
HMTAgent.disableCollectionField("device_name");
// 重置为默认
HMTAgent.resetCollectionDefaults();
| 方法 | 说明 | 默认值 |
|---|---|---|
enableDebug(boolean) |
开启调试日志 | false |
setDisabled(boolean) |
全局禁用所有数据发送 | false |
setAutoSendClientData(boolean) |
初始化后是否自动发送 client_data | false |
setAutoSendActivity(boolean) |
是否自动追踪页面浏览 | false |
enableActionHook(boolean) |
是否开启自动埋点(点击事件) | false |
setEnableCacheEncrypt(boolean) |
本地缓存是否加密存储 | false |
setBaseURL(String) |
设置服务端地址 | https://changeme.com |
setAppKey(ctx, key) |
设置 AppKey(可代替 Manifest 配置) | — |
setChannelId(ctx, id) |
设置渠道 ID(可代替 Manifest 配置) | — |
setAppVersion(ctx, version) |
手动设置应用版本 | — |
setReportPolicy(ctx, policy) |
设置发送策略 | — |
setSessionContinueMillis(long) |
会话超时间隔(毫秒) | 30000 |
setSendBatchSize(int) |
批量发送每批数量(条) | 50 |
setSendBatchTotal(int) |
批量发送总数量上限(条) | — |
setSendBatchInterval(int) |
批量发送时间间隔(毫秒) | — |
setSendDataTimerMillis(long) |
定时发送周期(毫秒) | 30000 |
setSendDataTimerInterval(long) |
定时发送线程等待时间(毫秒) | 5000 |
setInitializeDelaySendTime(millis) |
启动延迟发送时间(毫秒) | — |
enableAutoCleanDataBase(boolean) |
启动时自动清除过期数据 | false |
setAutoCleanDataBaseExpireDays(long) |
自动清除过期天数 | 90 |
setExcludedActivityPrefixes(String[]) |
排除自动追踪的 Activity 前缀 | — |
setWebViewExposeDeviceId(boolean) |
向 H5 暴露 device_id | false |
开启后自动追踪 Activity 页面浏览:
HMTAgent.setAutoSendActivity(true);
HMTAgent.Initialize(context, 0x00, collectionFields, blacklistFields);
排除特定 Activity(在 Manifest 中配置):
<meta-data android:name="HMT_EXCLUDE_ACTIVITIES"
android:value="com.example.payment.,com.example.health." />
或代码中排除:
HMTAgent.setExcludedActivityPrefixes(new String[]{"com.example.payment."});
SDK 自动采集的 Activity 名称可能无法满足全部业务需求。如果希望使用自定义名称上报页面,可以通过手动调用 onResume / onPause 并传入自定义名称实现。
也可在管理后台通过"设置 → 页面"修改各页面的展示名称,无需修改代码。
在需要自定义页面名称的 Activity 中:
public void onResume() {
super.onResume();
HMTAgent.onResume(this, "自定义页面名称");
}
public void onPause() {
super.onPause();
HMTAgent.onPause(this, "自定义页面名称");
}
重要: Android 中,
onResume和onPause需传入相同的自定义页面名称(或都不传自定义名称),SDK 才会正确计算页面进入和离开的配对关系。如果配对名称不一致,页面时长等数据将无法正确统计。
若 onResume 和 onPause 都不传自定义名称参数,则页面名称由 SDK 自动获取。
除了与自定义事件结合使用,自定义属性也可以添加在页面上报中。例如,在上报某个页面的同时需要记录用户是否为会员、会员等级等信息:
public void onResume() {
super.onResume();
HMTAgent.onResume(this, "商品详情页");
}
public void onPause() {
super.onPause();
HParams property = new HParams();
property.setParams("usertype", "member");
property.setParams("level", "golden");
// 第三个参数为回调函数(不需要可传 null),第四个参数为自定义页面名称
HMTAgent.onPause(this, property, null, "商品详情页");
}
也可以不自定义页面名称,仅添加属性:
public void onResume() {
super.onResume();
HMTAgent.onResume(this);
}
public void onPause() {
super.onPause();
HParams property = new HParams();
property.setParams("usertype", "member");
HMTAgent.onPause(this, property);
}
合规注意: 属性中使用的 key 需在管理后台"设置 → 自定义属性"中提前创建,且属性 key 需在
PrivacyConfig白名单中才能被上报。同时禁止传入手机号、身份证号等可识别个人身份的敏感信息。
应用中常有单个 Activity 嵌套多个 Fragment(子页面)的情况,如下图所示的访问路径:activity.a → activity.b.x → activity.b.y → activity.c。但 SDK 自动采集到的路径可能丢失了 Fragment 层级,变为:activity.a → activity.b → activity.c。

此时需要在 Fragment 中手动发送页面事件:
// Fragment X 进入时
public void onResume() {
super.onResume();
HMTAgent.onResume(getActivity(), "activity.b.x");
}
// Fragment X 离开时
public void onPause() {
super.onPause();
HMTAgent.onPause(getActivity(), "activity.b.x");
}
// Fragment Y 进入时
public void onResume() {
super.onResume();
HMTAgent.onResume(getActivity(), "activity.b.y");
}
// Fragment Y 离开时
public void onPause() {
super.onPause();
HMTAgent.onPause(getActivity(), "activity.b.y");
}
注意: Fragment 的
onResume/onPause中传入的 Context 应为所属的Activity(通过getActivity()获取),自定义页面名称前后需保持一致。
如果不想使用 SDK 的自动页面追踪,可以关闭自动追踪并完全手动控制页面上报:
// 初始化前关闭自动页面追踪
HMTAgent.setAutoSendActivity(false);
HMTAgent.Initialize(context, 0x00, collectionFields, blacklistFields);
之后在每个需要追踪的 Activity 中手动调用:
public void onResume() {
super.onResume();
HMTAgent.onResume(this);
// 或带自定义名称:HMTAgent.onResume(this, "自定义名称");
}
public void onPause() {
super.onPause();
HMTAgent.onPause(this);
// 或带自定义名称:HMTAgent.onPause(this, "自定义名称");
// 或带自定义属性:HMTAgent.onPause(this, property, null, "自定义名称");
}
// 基本事件
HMTAgent.onAction(context, "事件名称");
// 带次数
HMTAgent.onAction(context, "事件名称", 5);
// 带属性
HParams params = new HParams();
params.setParams("key", "value");
HMTAgent.onAction(context, "事件名称", params);
// 带回调
HMTAgent.onAction(context, "事件名称", new HMTCallback() {
@Override
public void callback() { /* 发送完成 */ }
});
// 完整形式(属性+次数+回调)
HMTAgent.onAction(context, "事件名称", 1, params, callback);
注意: 事件名称和属性 key 需在管理平台预先创建;自定义属性中禁止传入手机号、身份证号、IMEI 等可识别个人身份的原始信息。
// 注册全局异常捕获(需在初始化后调用)
HMTAgent.onError(context);
// 手动上报错误
HMTAgent.onError(context, "错误信息");
// 带自定义属性
HParams params = new HParams();
params.setParams("level", "critical");
HMTAgent.onError(context, "错误信息", params);
// 注入 JSBridge
HMTAgent.setWebViewAction(webView, context);
// 可选:向 H5 暴露 device_id(默认关闭)
HMTAgent.setWebViewExposeDeviceId(true);
H5 端调用:
// H5 事件上报
window.hmt.hmtAction('{"act_name":"click","act_count":"1"}');
// H5 页面追踪
window.hmt.hmtActivityStart('{"activity":"home"}');
window.hmt.hmtActivityEnd('{"activity":"home"}');
SDK 提供两个重载方法绑定推送 ID:
// 方式一:使用预定义的推送系统枚举
HMTAgent.bindPushKey(context, HMTAgent.PUSH_KEY.JPUSH_KEY, pushId);
// 方式二:使用自定义字符串 key
HMTAgent.bindPushKey(context, "customPushKey", pushId);
预定义枚举 PUSH_KEY 包含:
| 枚举值 | 对应 key | 说明 |
|---|---|---|
PUSH_KEY.JPUSH_KEY |
jgid |
极光推送 |
PUSH_KEY.XIAOMI_KEY |
xmid |
小米推送 |
PUSH_KEY.GETUI_KEY |
gtid |
个推 |
如果使用的推送系统不在枚举中,可直接传入自定义字符串 key。
请先参考极光推送 Android 版客户端 SDK 使用指南完成集成。
极光推送版本 < 3.3.0(通过自定义广播接收器获取 RegistrationID)
<!-- AndroidManifest.xml 中注册广播接收器 -->
<receiver
android:name="您自己定义的 Receiver"
android:enabled="true"
android:exported="false">
<intent-filter>
<action android:name="cn.jpush.android.intent.REGISTRATION" />
<action android:name="cn.jpush.android.intent.MESSAGE_RECEIVED" />
<action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED" />
<action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED" />
<action android:name="cn.jpush.android.intent.CONNECTION" />
<category android:name="您应用的包名" />
</intent-filter>
</receiver>
class MyJPushReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent != null && JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) {
String registrationId = intent.getExtras().getString(JPushInterface.EXTRA_REGISTRATION_ID);
// 绑定推送 ID
HMTAgent.bindPushKey(context, HMTAgent.PUSH_KEY.JPUSH_KEY, registrationId);
}
}
}
极光推送版本 ≥ 3.3.0(通过 JPushMessageReceiver 获取 RegistrationID)
<!-- AndroidManifest.xml 中注册 -->
<receiver
android:name="自定义 Receiver"
android:enabled="true"
android:exported="false">
<intent-filter>
<action android:name="cn.jpush.android.intent.RECEIVE_MESSAGE" />
<category android:name="您应用的包名" />
</intent-filter>
</receiver>
class MyJPushMsgReceiver extends JPushMessageReceiver {
@Override
public void onRegister(Context context, String registrationId) {
super.onRegister(context, registrationId);
// 绑定推送 ID
HMTAgent.bindPushKey(context, HMTAgent.PUSH_KEY.JPUSH_KEY, registrationId);
}
}
注意事项: 集成了极光推送的 App 仅在第一次初始化成功时会发出
JPushInterface.ACTION_REGISTRATION_ID广播。为了确保已安装的老用户也能正确上报推送 ID,建议在极光推送初始化之后通过JPushInterface.getRegistrationID()再次获取并绑定:String registrationId = JPushInterface.getRegistrationID(context); HMTAgent.bindPushKey(context, HMTAgent.PUSH_KEY.JPUSH_KEY, registrationId);
请先参考小米推送 Android 版客户端 SDK 使用指南完成集成。
通过继承 PushMessageReceiver 获取 RegID:
class MyXiaomiPushMsgReceiver extends PushMessageReceiver {
@Override
public void onReceiveRegisterResult(Context context, MiPushCommandMessage message) {
super.onReceiveRegisterResult(context, message);
String command = message.getCommand();
List<String> arguments = message.getCommandArguments();
String regID = arguments.get(0);
if (MiPushClient.COMMAND_REGISTER.equals(command)) {
if (message.getResultCode() == ErrorCode.SUCCESS) {
// 绑定推送 ID
HMTAgent.bindPushKey(context, HMTAgent.PUSH_KEY.XIAOMI_KEY, regID);
}
}
}
}
请先参考个推 Android 版客户端 SDK 使用指南完成集成。
通过继承 GTIntentService 获取 CID:
class MyGTIntentService extends GTIntentService {
@Override
public void onReceiveClientId(Context context, String cid) {
// 绑定推送 ID
HMTAgent.bindPushKey(context, HMTAgent.PUSH_KEY.GETUI_KEY, cid);
}
}
SDK 支持在用户的一次访问(或多次访问)中持续携带某些自定义属性,这些属性会自动附加到后续所有的页面浏览和事件上报中。SDK 提供临时属性和永久属性两种类型,通过枚举 HMTCacheState 区分:
| 类型 | 枚举值 | 生命周期 | 存储方式 |
|---|---|---|---|
| 临时属性 | HMTCacheState.HMT_CACHE_TEMPORARY |
仅当次 App 运行期间有效,App 关闭即清除 | 内存 |
| 永久属性 | HMTCacheState.HMT_CACHE_PERMANENT |
跨 App 启动保持,直到被移除或缓存被清除 | SharedPreferences |
优先级规则: 临时属性的优先级高于永久属性。当同一个 key 同时设置了临时值和永久值时,上报以临时值为准。
更新规则: 重复设置相同的属性 key,会更新该属性对应的值。
合规注意: 自定义属性中的 key 和 value 由接入方主动传入,SDK 会通过
PrivacyConfig.isFieldAllowed(key)校验后才加入上报。接入方不得传入手机号、身份证号等敏感个人信息。属性 key 建议在管理后台"设置 → 自定义属性"中提前创建。
临时属性仅当次 App 运行有效,App 重新打开后需重新设置。
public static void bindExtraProperty(Context context, HMTCacheState dataType, String property, Object value)
示例:
String key = "member_level";
String value = "normal";
HMTAgent.bindExtraProperty(mContext, HMTCacheState.HMT_CACHE_TEMPORARY, key, value);
public static void bindExtraProperties(Context context, HMTCacheState dataType, JSONObject properties)
示例:
JSONObject jsonObj = new JSONObject();
jsonObj.put("level", "golden");
jsonObj.put("source", "campaign");
jsonObj.put("vip", "true");
HMTAgent.bindExtraProperties(mContext, HMTCacheState.HMT_CACHE_TEMPORARY, jsonObj);
String key = "member_level";
HMTAgent.removeExtraProperty(mContext, HMTCacheState.HMT_CACHE_TEMPORARY, key);
HMTAgent.removeExtraProperty(mContext, HMTCacheState.HMT_CACHE_TEMPORARY, "DELETE-ALL");
永久属性会跨 App 启动保持,直到 App 缓存被清除或主动移除。
String key = "member_level";
String value = "vip";
HMTAgent.bindExtraProperty(mContext, HMTCacheState.HMT_CACHE_PERMANENT, key, value);
JSONObject jsonObj = new JSONObject();
jsonObj.put("member_level", "vip");
jsonObj.put("register_date", "2024-01-15");
HMTAgent.bindExtraProperties(mContext, HMTCacheState.HMT_CACHE_PERMANENT, jsonObj);
String key = "member_level";
HMTAgent.removeExtraProperty(mContext, HMTCacheState.HMT_CACHE_PERMANENT, key);
// 注意大小写:DELETE-ALL 是固定值
HMTAgent.removeExtraProperty(mContext, HMTCacheState.HMT_CACHE_PERMANENT, "DELETE-ALL");
// 获取当前所有临时属性
JSONObject tempProps = HMTAgent.getExtraProperties(context, HMTCacheState.HMT_CACHE_TEMPORARY);
// 获取当前所有永久属性
JSONObject permProps = HMTAgent.getExtraProperties(context, HMTCacheState.HMT_CACHE_PERMANENT);
场景: 用户在 App 中登录后,希望在后续所有页面浏览和事件中自动携带"会员等级"和"注册来源"两个属性。
// 用户登录成功后
JSONObject props = new JSONObject();
props.put("member_level", "golden");
props.put("register_source", "wechat");
// 使用永久属性,下次打开 App 仍然有效
HMTAgent.bindExtraProperties(context, HMTCacheState.HMT_CACHE_PERMANENT, props);
场景: 某次营销活动期间,希望临时标记用户来源,活动结束后自动清除。
// 用户通过活动链接进入 App
HMTAgent.bindExtraProperty(context, HMTCacheState.HMT_CACHE_TEMPORARY, "campaign_id", "618");
// App 关闭后该属性自动清除,不影响后续正常使用
系统中默认使用随机设备 ID 对用户进行标识。如需统计登录用户或会员这类指标,可使用账号 ID 绑定方法:
HMTAgent.bindAccountID(context, "userAccountId");
生命周期: 通过此方法设置的账号 ID 仅在当次 App 运行期间有效。App 重新启动后需重新设置。
注销账号 ID: 传空值(null 或 "")即可注销:
// 用户退出登录时
HMTAgent.bindAccountID(context, "");
// 或
HMTAgent.bindAccountID(context, null);
切换账号: 用户切换账号时,直接传入新的账号 ID 即可:
// 用户切换账号
HMTAgent.bindAccountID(context, "newUserAccountId");
合规说明: 账号 ID 字段 cust_id 受 PrivacyConfig.isFieldAllowed("cust_id") 控制,默认不采集。如需上报账号 ID,需在初始化时将 cust_id 加入白名单:
HMTAgent.Initialize(context, 0x00,
new String[]{"cust_id"}, // 将 cust_id 加入白名单
null
);
也可以在初始化后动态开启:
HMTAgent.enableCollectionField("cust_id");
需集成 OAID SDK,然后调用:
HMTAgent.bindOAID(context, oaidValue);
OAID 字段受 PrivacyConfig.isFieldAllowed("_oaid") 控制,默认不采集。
HMTAgent.bindMuid(context, "自定义用户ID");
muid 字段受 PrivacyConfig.isFieldAllowed("muid") 控制,默认不采集。
在批量发送模式(reportPolicy = 0x00)下,数据上报存在一定延迟。如需主动触发上报,可调用手动发送接口:
// 发送全部缓存数据(事件、页面、异常等)
HMTAgent.pushAllData(context);
适用场景:
开发者可根据实际业务场景决定调用时机。
HMTAgent.pushAdvActionData(context);
// 带回调
HMTAgent.pushAdvActionData(context, new HMTCallback() {
@Override
public void callback() {
// 发送完成
}
});
// 清除全部本地缓存数据
HMTAgent.cleanDataBase(context);
// 清除指定时间戳之前的缓存数据
HMTAgent.cleanDataBase(context, timestamp);
// 初始化前开启自动清除过期数据
HMTAgent.enableAutoCleanDataBase(true);
HMTAgent.setAutoCleanDataBaseExpireDays(90); // 清除 90 天前的数据
对于支持数据发送的 API,SDK 提供 HMTCallback 参数,在数据发送完成后触发 callback() 方法以通知调用方。
| API | 说明 |
|---|---|
onPause(context, callback) |
页面退出数据发送完成 |
onError(context, err, callback) |
错误信息发送完成 |
onAction(context, actName, callback) |
事件数据发送完成 |
postClientData(context, callback) |
设备信息发送完成 |
pushAllData(context, callback) |
缓存数据发送完成 |
pushAdvActionData(context, callback) |
广告事件发送完成 |
// 页面退出回调
HMTAgent.onPause(context, new HMTCallback() {
@Override
public void callback() {
Log.d("HMT", "页面数据发送完成");
}
});
// 事件发送回调
HMTAgent.onAction(context, "purchase", new HMTCallback() {
@Override
public void callback() {
Log.d("HMT", "事件数据发送完成");
}
});
// 手动推送回调
HMTAgent.pushAllData(context, new HMTCallback() {
@Override
public void callback() {
Log.d("HMT", "全部缓存数据发送完成");
}
});
HMTAgent.setBaseURL("https://yourdomain.com");
HMTAgent.Initialize(context, 0x00, collectionFields, blacklistFields);
注意: 若您使用的是独立部署的环境,在初始化前通过
setBaseURL()配置即可。新版 SDK 已移除setOnlineConfigUrl()方法,在线配置地址将自动从服务端地址派生。
SDK 支持自动采集用户行为(当前支持控件单击事件),开启后可以自动抓取部分按钮事件。事件会获取按钮类型、文本内容、控件 ID 等信息。
使用此功能需要引入 Gradle 插件,SDK 版本需 ≥ 1.3.4。
在项目根目录下的 build.gradle 文件中添加对插件的引用:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.6.2'
// 添加 hmt-plugin 依赖
classpath 'com.hypers.analytics:hmt-plugin:1.0.0'
}
}
在主 module 的 build.gradle 文件中添加插件:
apply plugin: 'com.hypers.analytics'
添加成功后执行 Gradle 任务可见如下日志:
> Configure project :app
HMT插件已经添加
在初始化前调用 enableActionHook(true)(默认不开启):
HMTAgent.enableActionHook(true);
HMTAgent.Initialize(context, 0x00, collectionFields, blacklistFields);
插件提供了 DSL 进行配置:
HMTConfig {
// 开启插件日志输出
enableLog = true
}
SDK 通过会话(Session)对用户的使用行为进行分组。一次会话指用户从打开 App 到离开 App 的连续使用过程。
当 App 切到后台超过指定时间后再次回到前台,SDK 会认为开启了一次新的会话。默认超时间隔为 30 秒:
// 初始化前或初始化后调用
HMTAgent.setSessionContinueMillis(60000); // 设置为 60 秒
| 字段 | 所需系统 API | 所需权限 |
|---|---|---|
_oaid |
OAID SDK(com.bun.miitmdid) |
取决于 OAID SDK 版本 |
_openudid |
OpenUDID 服务 IPC | 无 |
SDK 自身不声明任何权限。 接入方需根据实际使用的字段在自身 Manifest 中声明对应权限。