Skip to content

Analytics SDK Android 接入指南 ​

具体的事件上报参数说明,参考文档:Lark 链接 密码:@8228T56

文档版本:1.9 | SDK 版本:1.5.1 | minSdk 24 | Java 8+

下载 SDK ​

下载 Android SDK (android-sdk-v1.5.1.zip)


目录 ​

  1. 环境要求
  2. 集成 AAR
  3. 初始化
  4. 配置刷新
  5. 用户管理
  6. 事件上报
  7. Session 管理
  8. 页面名称映射
  9. 自动追踪说明
  10. 播放器自动埋点(PlayerTracker)
  11. 枚举值参考
  12. 调试
  13. 销毁与资源释放
  14. 版本更新说明

1. 环境要求 ​

项目要求
minSdk24 (Android 7.0+)
compileSdk35
Java8
网络权限已内置,AAR 自动合并,无需手动声明

2. 集成 AAR ​

将交付包中的 analytics-sdk-1.5.1.aar 放入 app/libs/(替换旧包,只保留一份本 SDK),然后在 app/build.gradle 中添加依赖:

groovy
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.aar'])
    implementation 'com.squareup.okhttp3:okhttp:4.12.0'
    implementation 'org.json:json:20240303'
    implementation 'androidx.core:core:1.13.1'
}

OAID 已内嵌:Release AAR 已包含 Android_CN_OAID、华为 / 荣耀 ads-identifier(含资源、Manifest、混淆规则)。宿主无需再声明这三个 Maven 依赖,也无需额外配置 JitPack / 华为 / 荣耀仓库。若宿主或其他库已直接或间接引入,请移除直接依赖或排除传递依赖,避免重复类。

设备指纹与升级 ​

业务方无需新增初始化参数。SDK 自动生成 device_fingerprint,可通过 getParams() 或实际事件 JSON 读取;不要把它当作 deviceId 参数传回。

项目约定
sdk_version1.5.1
fp_version4.0.0
持久化文件Context.getFilesDir()/analytics_device_fingerprint.txt
生成时机本地没有非空值时,按 Android 启动快照稳定字段计算 SHA-256
后续初始化读取已有文件;不随语言、时区或系统升级重算
失败降级初始化尚未完成或存储失败时为空;下次初始化继续恢复 / 重试

language 和 timezone 仍可出现在 sdk_init 环境信息中,但不参与指纹。首次从 v3(1.4.8)升级时会生成新的 v4 指纹;原先的 analytics_fingerprint.txt 是旧 UUID 兼容入口文件,不会当作 v4 指纹迁移。从 1.4.9 升级至 1.5.1 直接复用已保存的 v4 指纹,无需清理。

不卸载且保留应用数据和指纹文件时,指纹稳定。清除应用数据、删除文件等操作会触发重新生成。服务端应按 fp_version 区分新旧指纹。

验收: 初始化完成后记录指纹与 fp_version;强制结束进程后重启、重复 init()、修改语言 / 时区后检查值不变。不要在正式用户数据上执行清除数据测试。

混淆配置(ProGuard/R8) ​

无需手动添加任何规则。 AAR 内已内嵌 consumer ProGuard rules,Gradle 在构建时会自动合并到 app 的混淆配置中。

若 app 的 build.gradle 开启了混淆:

groovy
buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
}

SDK 的公开 API(入口类、事件实体、枚举、生命周期观察者)会被自动保护,无需在 proguard-rules.pro 中额外声明。


3. 初始化 ​

在 Application.onCreate() 中调用,且必须在所有事件上报之前完成。

java
import com.datapluse.analyticssdk.core.AnalyticsSdk;
import com.datapluse.analyticssdk.utils.AnalyticsUtils;

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        // 由业务方控制日志:调试开、正式关;也可在运行中切换(Release AAR 默认关闭)
        AnalyticsSdk.setLoggingEnabled(BuildConfig.DEBUG);

        // 设置客户端版本(所有事件会自动携带此字段,无需每次传参)
        AnalyticsUtils.setClientVersion(BuildConfig.VERSION_NAME);

        // 初始化 SDK
        AnalyticsSdk.getInstance().init(
            this,                  // Context(推荐传 Application,Activity context 也可)
            "your_app_id",         // appId,由平台分配
            null,                  // encryptedConfig,见第 4 节;启动时可传 null
            "official",            // channel 渠道标识
            getUserId(),           // uid,未登录传 null
            getDeviceId(),         // 设备唯一标识
            true                   // enableAutoPageTrack:自动页面展示与点击追踪
        );
    }
}

参数说明 ​

参数类型说明
contextContext推荐在 Application.onCreate() 中传 this;SDK 内部会自动调用 getApplicationContext(),传 Activity context 也安全
appIdString平台分配的应用 ID
encryptedConfigStringAES-GCM 加密配置,包含域名列表和事件白名单;可先传 null,配置到达后调用 refreshConfig()
channelString渠道标识,如 "official" "google_play"
uidString用户 ID;未登录传 null;非空时长度须 ≥ 4(由宿主保证,SDK 不额外校验)
deviceIdString设备唯一标识
enableAutoPageTrackbooleantrue(FULL)时自动上报页面展示与 page_click;未启用自动点击时也可手动 track(PageClickEvent)

注意:encryptedConfig 包含域名列表,SDK 初始化后才能上报事件。若启动时尚未拿到配置,需要尽快调用 refreshConfig()。正式环境若在配置顶层下发 signKey,v1.4.8 起可正确读取并生成 event_sig。


4. 配置刷新 ​

服务端下发加密配置后调用,包含域名列表(测速后自动选最快节点)和事件白名单。

java
// 从服务端拉取后调用,可在任意时机调用(线程安全)
AnalyticsSdk.getInstance().refreshConfig(encryptedConfigString);

配置内容(解密后结构):

json
{
  "domainList": ["https://api1.example.com", "https://api2.example.com"],
  "eventList": ["app_page_view", "page_click", "video_play"]
}
  • domainList:SDK 会并发 HEAD 测速,自动选择响应最快的节点作为上报地址。
  • eventList:事件类型白名单,不在列表中的事件类型会被静默丢弃。

5. 用户管理 ​

java
import com.datapluse.analyticssdk.utils.AnalyticsUtils;
import com.datapluse.analyticssdk.manager.UserManager;
import com.datapluse.analyticssdk.enums.UserTypeEnum;

// 登录成功后:同时设置 uid 和用户类型(推荐用法)
UserManager.setUserIdAndType("real_user_id_123", UserTypeEnum.VIP);

// 或分别更新
AnalyticsUtils.setUid("real_user_id_123");
UserManager.updateUserType(UserTypeEnum.VIP);

// 登出:自动清空 uid 并将用户类型重置为 NORMAL
UserManager.logoutUser();

// 更新渠道(动态切换渠道时使用)
UserManager.setChannel("new_channel");

说明: UserManager 是用户状态的统一管理入口,负责 uid、userType、channel 的协同更新,保证事件字段一致。AnalyticsUtils.setUid() 仍然可用,但涉及 userType 变更时推荐统一通过 UserManager 操作。非空 uid 长度须 ≥ 4(由宿主保证)。


6. 事件上报 ​

所有事件通过同一入口上报,SDK 内部自动批量处理:

java
AnalyticsSdk.getInstance().track(event);

如需立即上报(如 App 退出前):

java
AnalyticsSdk.getInstance().flush();

事件 JSON 结构 ​

每条事件上报的 JSON 分为两层:

json
{
  // ── 公共字段(SDK 自动注入,无需手动传)──
  "event":            "page_click",
  "event_id":         "a3f1...",
  "app_id":           "your_app_id",
  "uid":              "user_123",
  "sid":              "abc...",
  "channel":          "official",
  "client_ts":        1713400000,
  "device":           "Android",
  "device_id":        "xxx",
  "device_brand":     "Xiaomi",
  "device_model":     "Mi 14",
  "system_name":      "Android",
  "system_version":   "14",
  "device_fingerprint": "xxx",
  "fp_version":       "4.0.0",
  "client_version":   "2.3.0",
  "sdk_version":      "1.5.1",
  "app_version":      "1.0.0",
  "user_agent":       "",

  // ── 业务字段(按事件类型不同,见各节说明)──
  "payload": { ... }
}

page_key 格式说明 ​

所有事件的 pageKey、referrerPageKey、currentPageKey、navigationKey 字段,SDK 在上报时会自动去掉前导 /:

传入值实际上报值
/homehome
/video_detailvideo_detail
//(仅有斜杠时保留)
homehome(无斜杠不变)

接入方按习惯传带 / 或不带 / 均可,SDK 统一处理。


6.1 页面展示 — AppPageViewEvent ​

java
import com.datapluse.analyticssdk.entity.AppPageViewEvent;

// 标准(含推荐场景 trace_id)
AppPageViewEvent event = new AppPageViewEvent(
    "vip",           // userType,可传空字符串
    "/home",         // pageKey
    "首页",           // pageName
    "/splash",       // referrerPageKey(来源页)
    "启动页",         // referrerPageName
    "/home",         // currentPageKey
    "首页",           // currentPageName
    320,             // pageLoadTime(毫秒)
    "trace_abc123"   // recommendTraceId,非推荐场景传 ""
);
AnalyticsSdk.getInstance().track(event);
java
// 简化(非推荐场景,省略 recommendTraceId)
AppPageViewEvent event = new AppPageViewEvent(
    "vip", "/home", "首页", "/splash", "启动页", "/home", "首页", 320
);
AnalyticsSdk.getInstance().track(event);

payload 字段

字段类型说明
page_keyString去前导 / 后的页面标识
page_nameString页面名称
referrer_page_keyString来源页面标识
referrer_page_nameString来源页面名称
current_page_keyString当前页面标识
current_page_nameString当前页面名称
page_load_timeint页面加载耗时(毫秒)
recommend_trace_idString推荐引擎 trace_id,非推荐场景为 ""
user_typeString用户类型,如 "vip"

6.2 页面点击 — PageClickEvent ​

FULL 模式自动上报(默认 300ms 节流,滑动 / 取消手势不触发)。也可手动调用下方接口;未启用自动追踪时需自行上报。

java
import com.datapluse.analyticssdk.entity.PageClickEvent;

PageClickEvent event = new PageClickEvent(
    "/home", "首页",
    540, 960,      // 点击坐标 x, y(像素)
    50, 50,        // 点击位置百分比 x%, y%(0-100)
    1080, 1920,    // 屏幕宽高
    "trace_abc123" // recommendTraceId,非推荐场景传 ""
);
AnalyticsSdk.getInstance().track(event);

payload 字段

字段类型说明
page_keyString去前导 / 后的页面标识
page_nameString页面名称
click_page_xint点击坐标 X(像素)
click_page_yint点击坐标 Y(像素)
click_x_percentint点击位置横向百分比(0-100)
click_y_percentint点击位置纵向百分比(0-100)
screen_widthint屏幕宽度(像素)
screen_heightint屏幕高度(像素)
recommend_trace_idString推荐引擎 trace_id,非推荐场景为 ""

6.3 导航 — NavigationEvent ​

java
import com.datapluse.analyticssdk.entity.NavigationEvent;

AnalyticsSdk.getInstance().track(
    new NavigationEvent("/video_detail", "视频详情页")
);

payload 字段

字段类型说明
navigation_keyString去前导 / 后的导航目标标识
navigation_nameString导航目标名称

6.4 视频行为 — VideoEvent ​

推荐使用 VideoMetadata 封装视频内容信息,将构造函数从 13 个参数简化为 8 个:

java
import com.datapluse.analyticssdk.entity.VideoEvent;
import com.datapluse.analyticssdk.entity.VideoMetadata;
import com.datapluse.analyticssdk.enums.VideoEventEnum;
import com.datapluse.analyticssdk.enums.VideoContentTypeEnum;

VideoMetadata meta = new VideoMetadata(
    "video_001",    // videoId
    "搞笑合集第一期", // videoTitle
    "type_comedy",  // videoTypeId
    "娱乐",          // videoTypeName
    "tag_funny",    // videoTagKey
    "搞笑"           // videoTagName
);

VideoEvent event = new VideoEvent(
    meta,
    300,                           // videoDuration(总时长,秒)
    120,                           // playDuration(本次播放时长,秒)
    40,                            // playProgress(进度,0-100)
    VideoEventEnum.VIDEO_PLAY,     // videoBehavior
    VideoContentTypeEnum.SHORT_VIDEO, // videoContentType
    "media_001",                   // mediaId
    "trace_abc123"                 // recommendTraceId,非推荐传 ""
);
AnalyticsSdk.getInstance().track(event);

旧构造器继续兼容,play_speed 默认 100(1 倍速)。帖子视频使用完整重载,在末尾追加 postId、playSpeed:

java
AnalyticsSdk.getInstance().track(new VideoEvent(
    meta, 300, 120, 40, VideoEventEnum.VIDEO_PLAY,
    VideoContentTypeEnum.POST_VIDEO, "media_001", "", "post_001", 125
)); // play_speed = 125 表示 1.25 倍速

仅 post_video 上报 post_id,且帖子 ID 必须非空;普通长视频 / 短视频等其他内容类型均省略该字段。

payload 字段

字段类型说明
video_idString视频 ID
video_titleString视频标题
video_type_idString视频分类 ID
video_type_nameString视频分类名称
video_tag_keyString视频标签标识
video_tag_nameString视频标签名称
video_durationint视频总时长(秒)
play_durationint本次播放时长(秒)
play_progressint播放进度(0-100)
play_speedint播放倍速,100=1 倍速,125=1.25 倍速;默认 100
video_behavior_keyString行为标识,如 "video_play"
video_behavior_nameString行为展示名,如 "播放"
video_content_typeString内容类型,如 "short_video" / "post_video"
post_idString帖子 ID;仅 post_video 必填且非空,其他类型省略
media_idString媒体 ID
recommend_trace_idString推荐引擎 trace_id,非推荐场景为 ""

注意: videoBehavior 枚举在 payload 中拆分为 video_behavior_key(字符串值)和 video_behavior_name(中文展示名)两个字段。


6.15 帖子展示 — PostEvent ​

java
import com.datapluse.analyticssdk.entity.PostEvent;
import com.datapluse.analyticssdk.enums.PostContentTypeEnum;

AnalyticsSdk.getInstance().track(new PostEvent(
    "media_001", "post_001", "视频帖子", System.currentTimeMillis() / 1000L,
    "author_001", "作者", PostContentTypeEnum.VIDEO_POST
));

帖子展示默认行为为 view / “展示”;分类默认 default / “默认分类”,标签默认 default / “默认标签”,推荐 trace 默认为空。post_id 必须非空,否则事件丢弃。构造参数仍为 createTime;payload 输出字段为 post_create_time(10 位秒级),fromJson 只读新字段。支持 fromJson(JSONObject) / fromJson(Map)。

启用 eventList 白名单时加入 post_event。post_like / post_comment / post_collect / post_unlock 由服务端上报,SDK 登记名称并跳过客户端自动加签。


6.16 剧集播放 — DramaEvent ​

java
import com.datapluse.analyticssdk.entity.DramaEvent;
import com.datapluse.analyticssdk.enums.DramaPlayBehaviorEnum;

AnalyticsSdk.getInstance().track(new DramaEvent(
    "drama_001", "短剧标题", 5, 20, "media_005", "video_005",
    300, 60, 20, DramaPlayBehaviorEnum.EP_PLAY
));

drama_id、video_id 必须非空。内容类型默认 short_drama,倍速默认 100。播放行为含 EP_VIEW / EP_PLAY / EP_PAUSE / EP_FORWARD / EP_REWIND,以及 EP_COMPLETE(播放完成)、EP_SHARE(分享)。启用白名单时加入 drama_event。


6.17 剧集状态变更 — DramaStatusChangeEvent ​

java
import com.datapluse.analyticssdk.entity.DramaStatusChangeEvent;
import com.datapluse.analyticssdk.enums.DramaBehaviorEnum;

AnalyticsSdk.getInstance().track(new DramaStatusChangeEvent(
    "drama_001", "短剧标题", 5, "media_005", "video_005", 2,
    DramaBehaviorEnum.EP_SWITCH
)); // 从第 2 集切到第 5 集

启用白名单时加入 drama_status_change。drama_like / drama_comment / drama_collect / drama_purchase 由服务端上报并跳过客户端自动加签。


6.5 小说阅读 — NovelEvent ​

java
import com.datapluse.analyticssdk.entity.NovelEvent;
import com.datapluse.analyticssdk.enums.ReadBehaviorEnum;

NovelEvent event = new NovelEvent(
    "novel_001", "斗破苍穹",     // novelId, novelTitle
    "type_fantasy", "玄幻",      // novelTypeId, novelTypeName
    "tag_xh", "仙侠",            // novelTagKey, novelTagName
    35,                          // readProgress(0-100)
    128,                         // pageNo(当前页码)
    ReadBehaviorEnum.PAGE_NEXT,  // novelBehavior
    "media_novel_001",           // mediaId
    "trace_abc123",              // recommendTraceId,非推荐传 ""
    "chapter_003",               // chapterId,没有章节传 ""
    "第三章 风起云涌"              // chapterName,没有章节传 ""
);
AnalyticsSdk.getInstance().track(event);

payload 字段

字段类型说明
novel_idString小说 ID
novel_titleString小说标题
novel_type_idString分类 ID
novel_type_nameString分类名称
novel_tag_keyString标签标识
novel_tag_nameString标签名称
read_progressint阅读进度(0-100)
page_noint当前页码。普通小说从 1 开始;仅有声小说业务约定允许 0。注意:当前校验器仍会移除 page_no = 0
novel_behavior_keyString行为标识,如 "view"
novel_behavior_nameString行为展示名,如 "下一页"
media_idString媒体 ID
recommend_trace_idString推荐引擎 trace_id,非推荐场景为 ""
chapter_idString章节 ID,无章节传 ""
chapter_nameString章节名称,无章节传 ""

注意: novelBehavior 枚举在 payload 中拆分为 novel_behavior_key 和 novel_behavior_name 两个字段。


6.6 漫画阅读 — ComicEvent ​

java
import com.datapluse.analyticssdk.entity.ComicEvent;
import com.datapluse.analyticssdk.enums.ReadBehaviorEnum;

ComicEvent event = new ComicEvent(
    "comic_001", "火影忍者",
    "type_action", "热血",
    "tag_ninja", "忍者",
    60,                         // readProgress(0-100)
    700,                        // pageNo
    ReadBehaviorEnum.PAGE_NEXT,
    "media_comic_001",
    "trace_abc123",             // recommendTraceId,非推荐传 ""
    "chapter_010",              // chapterId,没有章节传 ""
    "第十话 忍道"                 // chapterName,没有章节传 ""
);
AnalyticsSdk.getInstance().track(event);

payload 字段

字段类型说明
comic_idString漫画 ID
comic_titleString漫画标题
comic_type_idString分类 ID
comic_type_nameString分类名称
comic_tag_keyString标签标识
comic_tag_nameString标签名称
read_progressint阅读进度(0-100)
page_noint当前页码
comic_behavior_keyString行为标识,如 "view"
comic_behavior_nameString行为展示名,如 "下一页"
media_idString媒体 ID
recommend_trace_idString推荐引擎 trace_id,非推荐场景为 ""
chapter_idString章节 ID,无章节传 ""
chapter_nameString章节名称,无章节传 ""

注意: comicBehavior 枚举在 payload 中拆分为 comic_behavior_key 和 comic_behavior_name 两个字段。


6.7 广告展示 — AdImpressionEvent ​

SDK 自动对广告 ID 按页面维度去重:同一页面内已上报的广告 ID 不会重复上报;用户返回该页面后,去重记录自动重置,广告可重新上报。Session 结束时全部清空。

java
import com.datapluse.analyticssdk.entity.AdImpressionEvent;
import com.datapluse.analyticssdk.enums.AdTypeEnum;

// 多个广告 ID 用逗号分隔
AdImpressionEvent event = new AdImpressionEvent(
    "/home", "首页",
    "slot_banner_top", "顶部Banner",
    "ad_001,ad_002",       // adId(多个用英文逗号分隔)
    AdTypeEnum.BANNER,
    "cr_001,cr_002"        // creativeId(可选,与 adId 一一对应)
);
AnalyticsSdk.getInstance().track(event);

payload 字段

字段类型说明
page_keyString去前导 / 后的页面标识
page_nameString页面名称
ad_slot_keyString广告位标识
ad_slot_nameString广告位名称
ad_idString广告 ID,多个用英文逗号分隔
ad_typeString广告类型,来自 AdTypeEnum.getLabel()
creative_idString素材 ID,可选,默认 ""

6.8 广告点击 — AdClickEvent ​

java
import com.datapluse.analyticssdk.entity.AdClickEvent;
import com.datapluse.analyticssdk.enums.AdTypeEnum;

AdClickEvent event = new AdClickEvent(
    "/home", "首页",
    "slot_banner_top", "顶部Banner",
    "ad_001",                    // adId
    AdTypeEnum.BANNER.getLabel(), // adType(字符串,推荐用枚举 .getLabel() 保持统一)
    "cr_001"                     // creativeId(可选)
);
AnalyticsSdk.getInstance().track(event);

注意: AdClickEvent 的 adType 参数为字符串(与 AdImpressionEvent 使用枚举不同)。建议统一通过 AdTypeEnum.XXX.getLabel() 传值,避免拼写错误。

payload 字段

字段类型说明
page_keyString去前导 / 后的页面标识
page_nameString页面名称
ad_slot_keyString广告位标识
ad_slot_nameString广告位名称
ad_idString广告 ID
ad_typeString广告类型字符串
creative_idString素材 ID,可选,默认 ""

6.9 广告通用事件 — AdvertisingEvent ​

java
import com.datapluse.analyticssdk.entity.AdvertisingEvent;

AdvertisingEvent event = new AdvertisingEvent(
    "show",                 // eventType(自由字符串,建议团队内统一约定,如 show/click/close)
    "adv_key_summer",       // advertisingKey
    "夏季促销活动",           // advertisingName
    "adv_campaign_001"      // advertisingId
);
AnalyticsSdk.getInstance().track(event);

payload 字段

字段类型说明
event_typeString广告行为类型,无枚举约束,由业务方自定义(如 "show" "click" "close")
advertising_keyString广告活动标识
advertising_nameString广告活动名称
advertising_idString广告活动 ID

6.10 推荐列表展示 — RecommendListViewEvent ​

java
import com.datapluse.analyticssdk.entity.RecommendListViewEvent;
import com.datapluse.analyticssdk.enums.RecommendContentTypeEnum;

RecommendListViewEvent event = new RecommendListViewEvent(
    "/home", "首页",
    RecommendContentTypeEnum.VIDEO,          // 内容类型
    "trace_abc123",                          // recommendTraceId(推荐引擎下发)
    "vid_001,vid_002,vid_003",               // 可视窗口内内容 ID(逗号分隔)
    "{\"algo\":\"cf\",\"exp_id\":\"A1\"}"    // recommendTraceInfo(溯源 JSON)
);
AnalyticsSdk.getInstance().track(event);

payload 字段

字段类型说明
page_keyString去前导 / 后的页面标识
page_nameString页面名称
recommend_content_typeString内容类型,如 "video"
recommend_trace_idString推荐引擎 trace_id
recommend_idString可视内容 ID,多个用英文逗号分隔
recommend_trace_infoString推荐溯源详情(JSON 字符串)
client_versionString客户端版本,SDK 从公共字段注入 payload

6.11 推荐列表点击 — RecommendListClickEvent ​

java
import com.datapluse.analyticssdk.entity.RecommendListClickEvent;
import com.datapluse.analyticssdk.enums.RecommendContentTypeEnum;

RecommendListClickEvent event = new RecommendListClickEvent(
    "/home", "首页",
    "trace_abc123",                          // recommendTraceId
    "vid_002",                               // 被点击内容 ID
    RecommendContentTypeEnum.VIDEO,
    "{\"algo\":\"cf\",\"exp_id\":\"A1\"}"    // recommendTraceInfo
);
AnalyticsSdk.getInstance().track(event);

payload 字段

字段类型说明
page_keyString去前导 / 后的页面标识
page_nameString页面名称
recommend_trace_idString推荐引擎 trace_id
recommend_idString被点击内容 ID
recommend_content_typeString内容类型,如 "video"
recommend_trace_infoString推荐溯源详情(JSON 字符串)
client_versionString客户端版本,SDK 从公共字段注入 payload

6.12 应用安装 — AppInstallEvent ​

java
import com.datapluse.analyticssdk.entity.AppInstallEvent;

// traceId 从剪贴板或落地页链接中获取
AppInstallEvent event = new AppInstallEvent("trace_install_abc001");
AnalyticsSdk.getInstance().track(event);

payload 字段

字段类型说明
trace_idString落地页点击生成的唯一 ID,从剪贴板读取

6.13 关键词搜索 — KeywordSearchEvent ​

java
import com.datapluse.analyticssdk.entity.KeywordSearchEvent;

// 仅关键词 + 结果数;search_content_type / search_trace_id / search_id 默认为空字符串
AnalyticsSdk.getInstance().track(
    new KeywordSearchEvent("搞笑视频合集", 256)
);

// 帖子 / 短剧搜索示例
AnalyticsSdk.getInstance().track(new KeywordSearchEvent(
    "短剧关键词", 2, "short_drama", "trace_001", "drama_001,drama_002"
));

payload 字段

字段类型说明
keywordString搜索关键词
search_result_countint搜索结果数量
search_content_typeString搜索列表类型:video / novel / comic / post / short_drama;未接搜索推荐引擎传 ""
search_trace_idString搜索引擎 trace ID;未接搜索推荐引擎传 ""
search_idString可视范围内的搜索结果 ID,多个英文逗号分隔(不是搜索会话 ID);未接搜索推荐引擎传 ""

6.14 关键词点击 — KeywordClickEvent ​

java
import com.datapluse.analyticssdk.entity.KeywordClickEvent;
import com.datapluse.analyticssdk.enums.ClickItemTypeEnum;

AnalyticsSdk.getInstance().track(new KeywordClickEvent(
    "搞笑视频合集",        // 关键词
    "vid_001",            // 点击内容 ID
    ClickItemTypeEnum.VIDEO, // VIDEO / NOVEL / COMIC / POST / SHORT_DRAMA
    3                     // 点击位置(从 0 开始)
));

payload 字段

字段类型说明
keywordString搜索关键词
click_item_idString点击内容 ID
click_item_type_keyString内容类型标识:video / novel / comic / post / short_drama
click_item_type_nameString内容类型展示名,如 "视频" / "帖子" / "短剧"
click_positionint点击位置(从 0 开始)
search_trace_idString搜索引擎 trace ID,默认 ""

注意: clickItemType 枚举在 payload 中拆分为 click_item_type_key 和 click_item_type_name 两个字段。


7. Session 管理 ​

SDK 默认自动管理 Session(30 分钟超时),通常无需手动干预。

7.1 生命周期通知 ​

enableAutoPageTrack = true 时(默认),SDK 通过 ActivityLifecycleObserver 自动处理前后台切换,无需手动调用。

只有在 enableAutoPageTrack = false 的情况下,才需要手动通知 SDK:

java
import com.datapluse.analyticssdk.manager.SessionManager;

// App 进入后台时调用
SessionManager.getInstance().onAppBackground();

// App 回到前台时调用(后台超过 30 分钟则自动生成新 Session)
SessionManager.getInstance().onAppForeground();

7.2 Session 新建时机 ​

场景说明
冷启动每次 init() 必定生成新 sid
后台超时回前台后台停留 > 30 分钟,回前台时生成新 sid
行为超时上次用户行为距今 > 30 分钟,下次上报时生成新 sid

7.3 服务端上报场景获取 sid ​

sid(会话 ID)由客户端 SDK 在初始化时自动生成,格式为 32 位十六进制字符串(UUID v4 去掉 -)。
服务端自行上报事件时,sid 必须从客户端获取后回传,不能由服务端自行生成,否则与客户端事件流断链,无法关联同一会话。

java
import com.datapluse.analyticssdk.manager.SessionManager;

// 在需要上报到服务端的场景,将当前 sid 随业务请求一起传给后端
String currentSid = SessionManager.getInstance().getSessionId();
// 将 currentSid 附加到你的 API 请求参数中,由服务端上报时使用

getSessionId() 会自动检查行为超时,调用即视为一次用户行为记录,返回值始终是当前有效的 sid。


8. 页面名称映射 ​

SDK 自动追踪时通过 Activity 类名生成 pageKey(如 MainActivity → /main)。可通过 PageNameMapper 自定义:

java
import com.datapluse.analyticssdk.manager.PageNameMapper;
import java.util.HashMap;

// 批量配置
HashMap<String, String> pages = new HashMap<>();
pages.put("/main",    "首页");
pages.put("/detail",  "详情页");
pages.put("/user",    "个人中心");
pages.put("/search",  "搜索页");
PageNameMapper.addMappings(pages);

// 动态新增单条
PageNameMapper.addMapping("/live", "直播间");

// 完全自定义 pageKey 生成逻辑
PageNameMapper.setPageKeyProvider(activity -> {
    // 返回 null 时回退到默认规则
    if (activity instanceof LiveActivity) return "/live";
    return null;
});

默认 pageKey 规则(无自定义时):

Activity 类名pageKey(内部)实际上报值
MainActivity/mainmain
HomeActivity/homehome
DetailActivity/detaildetail
UserActivity/useruser
DiscoverActivity/discoverdiscover
其他(去掉 Activity 后缀转小写)/{name}{name}

9. 自动追踪说明 ​

enableAutoPageTrack = true(AutoTrackMode.FULL)时,SDK 自动监听 Activity/Fragment 页面生命周期,上报页面展示与点击,并维护页面停留:

触发时机行为
页面进入上报 AppPageViewEvent,并初始化该页面的广告去重缓存
页面离开结束页面停留,清除该页面的广告去重缓存
页面点击自动上报 PageClickEvent(默认 300ms 节流;滑动 / 取消手势不触发)
触摸 / 滚动 / 捏合累计会话行为统计

页面点击由 FULL 模式自动采集,无需再手动重复上报;未启用自动追踪时也可手动 track(new PageClickEvent(...))。导航菜单行为调用 trackNavigation()。SDK 初始化、生命周期、网络及会话汇总事件继续自动处理。

如业务页面有特殊需求,可在 Fragment 的 onViewCreated() 或 onResume() 中手动上报页面展示:

java
// Fragment 手动页面追踪示例
AnalyticsSdk.getInstance().track(new AppPageViewEvent(
    "vip",          // userType
    "/home_tab",    // pageKey(建议用有语义的 key,而非 Activity 类名)
    "首页Tab",
    referrerPageKey, referrerPageName,
    "/home_tab", "首页Tab",
    0,              // pageLoadTime
    ""              // recommendTraceId
));

10. 播放器自动埋点(PlayerTracker) ​

PlayerTracker 是独立的播放器代理模块,支持 ExoPlayer、MediaPlayer、IjkPlayer 无侵入接入,自动上报 VideoEvent,不修改任何现有代码。

依赖声明 ​

播放器库依赖均为 compileOnly,AAR 不内置任何播放器库。使用哪个播放器就引入对应 Adapter:

groovy
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.aar'])

    // ExoPlayer(按需引入)
    implementation 'androidx.media3:media3-exoplayer:1.3.1'

    // IjkPlayer(按需引入;JCenter 已关闭,需添加 Aliyun Maven 镜像)
    implementation 'tv.danmaku.ijk.media:ijkplayer-java:0.8.8'
}

未引入的播放器库对应的 Adapter 类不会被加载,无需为未使用的播放器添加依赖。

ExoPlayer 接入(全自动) ​

play / pause / seek / complete / buffer / error / 视频切换 均自动触发,无需手动通知:

java
import com.datapluse.analyticssdk.player.*;
import com.datapluse.analyticssdk.player.adapters.ExoPlayerAdapter;
import com.datapluse.analyticssdk.enums.VideoContentTypeEnum;

PlayerVideoMeta meta = new PlayerVideoMeta.Builder()
    .videoId("v001").videoTitle("测试视频")
    .videoTypeId("1").videoTypeName("剧情")
    .videoTagKey("tag_romance").videoTagName("爱情")
    .mediaId("m001")
    .videoContentType(VideoContentTypeEnum.VIDEO)
    .recommendTraceId("")   // 非推荐场景传 ""
    .build();

PlayerTracker tracker = PlayerTracker.attach(new ExoPlayerAdapter(exoPlayer), meta);

// Activity/Fragment onDestroy 时释放
@Override
protected void onDestroy() {
    tracker.detach();
    super.onDestroy();
}

播放列表场景(视频切换自动处理):

java
// MetadataProvider 始终返回当前正在播的视频 meta
// ExoPlayer 切换视频时 SDK 自动:上报旧视频末尾事件 → 重置 playDuration → 拉取新 meta
PlayerTracker tracker = PlayerTracker.attach(
    new ExoPlayerAdapter(exoPlayer),
    () -> getCurrentVideoMeta()
);

MediaPlayer / IjkPlayer 接入 ​

MediaPlayer/IjkPlayer 无原生 play/pause 回调,需在 start()/pause() 后手动通知:

java
import com.datapluse.analyticssdk.player.adapters.MediaPlayerAdapter;

PlayerTracker tracker = PlayerTracker.attach(new MediaPlayerAdapter(mediaPlayer), meta);

mediaPlayer.start();
tracker.notifyPlay();   // 必须手动调

mediaPlayer.pause();
tracker.notifyPause();

// 切换视频时:SDK 自动上报旧视频末尾事件 + 重置 playDuration 计时 + 切换 meta
tracker.updateMeta(new PlayerVideoMeta.Builder()
    .videoId("v002").videoTitle("第二集")
    // ... 其余字段
    .build());

完整配置(Builder) ​

java
PlayerTracker tracker = new PlayerTracker.Builder()
    .adapter(new ExoPlayerAdapter(exoPlayer))
    .metadataProvider(() -> getCurrentVideoMeta())
    .config(PlayerEventConfig.only(
        VideoEventEnum.VIDEO_PLAY,
        VideoEventEnum.VIDEO_PAUSE,
        VideoEventEnum.VIDEO_COMPLETE))
    .playDurationProvider(() -> myPlayer.getPlayedSeconds())   // 可选:自定义计时
    .playProgressProvider(() -> myPlayer.getProgressPercent()) // 可选:自定义进度
    .build();

PlayerEventConfig 说明 ​

工厂方法开启的事件
PlayerEventConfig.defaults()VIDEO_PLAY / VIDEO_PAUSE / VIDEO_COMPLETE / VIDEO_FORWARD / VIDEO_REWIND
PlayerEventConfig.only(...)仅指定事件
PlayerEventConfig.all()defaults + BUFFER_START + BUFFER_END + VIDEO_ERROR

稳定性保障 ​

  • 全链路 try-catch,适配器内任何异常仅打 Log,不影响播放器正常运行
  • tracker.detach() 幂等,可安全多次调用,任意时机调用不抛异常
  • MetadataProvider.getMetadata() 返回 null 时使用空 meta 兜底,不崩溃
  • 播放器库依赖为 compileOnly,不打入 AAR,不干扰宿主 App 的播放器版本

11. 枚举值参考 ​

EventType — 事件类型 ​

SDK 提供预置事件类型常量(标准 Java enum),不支持自定义字符串。

java
import com.datapluse.analyticssdk.enums.EventType;

EventType.AD_IMPRESSION.getEvent();   // "ad_impression"
EventType.APP_PAGE_VIEW.getKey();     // "app_page_view"

// 查找预置类型
EventType t = EventType.fromEvent("ad_impression");  // 返回 EventType.AD_IMPRESSION
EventType.fromEvent("unknown");                       // 返回 null

VideoEventEnum — 视频行为 ​

支持预置常量,也可通过 of(String key) 传入自定义字符串(key 只允许字母、数字、_、-,不合法时抛 IllegalArgumentException)。

java
VideoEventEnum.VIDEO_PLAY;                  // 预置常量
VideoEventEnum.of("video_repost");          // 自定义
VideoEventEnum.fromKey("video_play");       // 查找预置常量,找不到返回 null
枚举值字符串值说明
VIDEO_PLAYvideo_play播放
VIDEO_PAUSEvideo_pause暂停
VIDEO_COMPLETEvideo_complete播放完成
VIDEO_FORWARDvideo_forward快进
VIDEO_REWINDvideo_rewind快退
VIDEO_SHAREvideo_share分享

VideoContentTypeEnum — 视频内容类型 ​

支持预置常量,也可通过 VideoContentTypeEnum.of("live_stream") 传入自定义字符串。

枚举值字符串值
VIDEOvideo
SHORT_VIDEOshort_video
POST_VIDEOpost_video

ReadBehaviorEnum — 阅读行为 ​

支持预置常量,也可通过 ReadBehaviorEnum.of("bookmark") 传入自定义字符串。

枚举值字符串值说明
VIEWview展示
PAGE_NEXTpage_next下一页
PAGE_PREVpage_prev上一页
COMPLETEcomplete读完

AdTypeEnum — 广告类型 ​

支持预置常量,也可通过 AdTypeEnum.of("interstitial") 传入自定义字符串(字段名为 label,对应 getLabel())。

枚举值字符串值
ICONicon
BANNERbanner
FEEDfeed
PLAYERplayer
SPLASHsplash
TEXTtext

RecommendContentTypeEnum — 推荐内容类型 ​

支持预置常量,也可通过 RecommendContentTypeEnum.of("live") 传入自定义字符串。

枚举值字符串值
VIDEOvideo
NOVELnovel
COMICcomic

ClickItemTypeEnum — 搜索点击内容类型 ​

支持预置常量,也可通过 ClickItemTypeEnum.of("audio") 传入自定义字符串。

枚举值字符串值
VIDEOvideo
NOVELnovel
COMICcomic
POSTpost
SHORT_DRAMAshort_drama

DramaPlayBehaviorEnum — 剧集播放行为 ​

枚举值字符串值说明
EP_VIEWep_view展示
EP_PLAYep_play播放
EP_PAUSEep_pause暂停
EP_FORWARDep_forward快进
EP_REWINDep_rewind快退
EP_COMPLETEep_complete播放完成
EP_SHAREep_share分享

UserTypeEnum — 用户类型 ​

支持预置常量,也可通过 UserTypeEnum.of("svip") 传入自定义字符串。

枚举值字符串值
NORMALnormal
VIPvip

AuthTypeEnum — 登录方式 ​

支持预置常量,也可通过 AuthTypeEnum.of("apple") 传入自定义字符串。

枚举值字符串值
PHONEphone
EMAILemail
WECHATwechat

OrderTypeEnum — 订单类型 ​

支持预置常量,也可通过 OrderTypeEnum.of("subscription") 传入自定义字符串。

枚举值字符串值
NORMALnormal
GIFTgift
RECHARGErecharge

PayTypeEnum — 支付方式 ​

支持预置常量,也可通过 PayTypeEnum.of("union_pay") 传入自定义字符串。

枚举值字符串值
ALIPAYalipay
WECHATwechat
APPLE_PAYapple_pay

CurrencyEnum — 货币类型 ​

支持预置常量,也可通过 CurrencyEnum.of("JPY") 传入自定义字符串。

枚举值字符串值
CNYCNY
USDUSD
EUREUR

ConsumeReasonEnum — 金币消耗原因 ​

支持预置常量,也可通过 ConsumeReasonEnum.of("unlock") 传入自定义字符串。

枚举值字符串值
PURCHASEpurchase
GIFTgift
REWARDreward

BannerEventEnum — Banner 行为 ​

支持预置常量,也可通过 BannerEventEnum.of("swipe") 传入自定义字符串。

枚举值字符串值
SHOWshow
CLICKclick
DISMISSdismiss

12. 调试 ​

业务方通过统一开关控制全部 SDK 日志(含完整请求/响应及警告、错误);初始化前设置,运行中也可修改。Release AAR 默认关闭。

java
AnalyticsSdk.setLoggingEnabled(true);   // 开启
AnalyticsSdk.setLoggingEnabled(false);  // 关闭

固定 tag AnalyticsSdkHttp 打印实际 POST URL、请求头、完整签名后 JSON 请求体以及响应状态/响应体(分段输出,不含签名密钥)。复现上报时导出日志交给后台:

bash
adb logcat -v raw 'AnalyticsSdkHttp:D' '*:S' > sdk-http.log

查看其他 SDK 状态日志:

bash
adb logcat | grep -E "AnalyticsSdk|SessionManager|ActivityLifecycleObserver|DomainManager"

关键 log tag:

tag内容
AnalyticsSdkHttp实际上报 HTTP 请求/响应(含 event_sig 的完整批次 JSON)
AnalyticsSdk上报成功/失败、配置解析、域名选择
SessionManagerSession 新建、超时
DomainManager测速结果、最快域名

配置参数汇总 ​

参数值
自动上报间隔5 秒
触发立即上报阈值队列满 10 条
阈值触发防抖1100ms(突发事件合并为单次请求)
单批最大上报条数500 条
队列最大容量5000 条
Session 超时30 分钟
域名测速超时5 秒
失败重试:基础延迟 / 最大延迟2s / 60s
单条事件最大体积300 KB
单批最大体积5 MB

13. 销毁与资源释放 ​

SDK 不会自动销毁。 如需主动释放资源(关闭线程池、注销监听),可在合适时机调用 dispose()。

java
AnalyticsSdk.getInstance().dispose();

dispose() 内部操作:

  1. 将队列中的剩余事件立即上报(flush())
  2. 取消定时上报和退避重试任务
  3. 关闭上报线程池和调度线程池
  4. 关闭域名测速线程池
  5. 注销 Activity 生命周期观察者等监听

注意: Application.onTerminate() 在真实 Android 设备上永远不会被调用(仅限模拟器进程环境),不要在此处调用 dispose()。大多数场景下无需手动调用,进程退出时 OS 会回收所有资源;如业务有明确的 SDK 关闭节点(如账号切换、动态卸载模块),再调用即可。

主线程调用安全: dispose() 在主线程调用时会直接 shutdownNow() 不阻塞,不会触发 ANR。


14. 版本更新说明 ​

v1.5.1(2026-09-18) ​

  • 同步 Flutter 1.5.1 业务增量;sdk_version = 1.5.1,fp_version = 4.0.0。
  • 帖子创建时间 payload 改为 post_create_time;Java 参数 createTime 保持兼容。
  • DramaPlayBehaviorEnum 新增 EP_COMPLETE / EP_SHARE;ClickItemTypeEnum 新增 POST / SHORT_DRAMA;关键词搜索支持 post / short_drama。
  • 约定:非空 uid ≥ 4;小说 page_no=0 仅有声小说(当前校验器仍会移除 0)。
  • 正式交付文件为 analytics-sdk-1.5.1.aar(与 AGP 4.2.2 命名 AAR 相同)。

完整变更与升级步骤见 更新日志。

v1.4.9(2026-09-16) ​

  • 指纹规则升级为 fp_version 4.0.0:去掉 language / timezone,首次生成并持久化后持续复用。
  • 修复重复初始化时指纹丢失 / 存储失败未重试的问题。
  • 事件 API 与初始化参数保持兼容;服务端需按 fp_version 区分 v3→v4。
  • 正式交付文件为 analytics-sdk-1.4.9.aar(AGP 4.2.2 旧工具链宿主可使用同一 AAR)。

完整变更与升级步骤见 更新日志。

v1.4.8(2026-09-08) ​

  • 新增帖子 / 剧集事件与 VideoEvent 的 post_video / play_speed 扩展。
  • 修复正式配置顶层 signKey 解析,补齐客户端事件签名。
  • 保留 FULL 模式自动页面点击及手动点击 API;移除全部 IM 事件。
  • Demo 测试台移除手动点击测试与 page_click 控制台回显,SDK 自动上报照常保留。
  • 支持完整上报请求/响应日志,由 AnalyticsSdk.setLoggingEnabled 统一控制。
  • Release AAR 内嵌 OAID / 华为 / 荣耀标识库,宿主无需重复引入。

完整变更与升级步骤见 更新日志。