You need to enable JavaScript to run this app.
文档中心
增长分析 DataFinder

增长分析 DataFinder

复制全文
下载 pdf
Android SDK
Android SDK 集成场景实践
复制全文
下载 pdf
Android SDK 集成场景实践

SDK 离线集成包说明

离线文件说明

请前往Android SDK包下载页面获取对应版本的SDK包。

说明

Android离线包名称为All-cn-Android_版本号.zip格式。例如:All-cn_Android_6.17.0.zip,其中6.17.0为SDK版本号。

必选依赖:
 - if_encryptor-xxx.aar(6.17.0 及之前) / encryptor-xxx-private.aar:加密库相关
 - RangersAppLog-All-cn-xxx.aar:增长营销主模块
 - RangersAppLog-Log-xxx.aar:增长营销 SDK 内部日志依赖
 - plugin-aggregation-xxx.aar:增长营销 SDK 内部信息聚合模块依赖

非必选依赖:
 - RangersAppLog-All-scheme-xxx.aar:实时埋点检测和圈选功能
 - RangersAppLog-All-plugin-xxx.jar:SDK plugin,主要提供全埋点 / h5 打通 / 黑名单过滤 / 移除部分隐私采集代码功能
 - RangersAppLog-DevTools-xxx.aar:可视化埋点调试工具,可用于埋点流程验证

集成说明

集成方式一,项目中已包含所有 libs 下 aar / jar:
// app 目录下 build.gradle
implementation fileTree(dir: 'libs', include: ['*.jar','*.aar'])
// 此时可以将以上必须依赖以及部分需要可选依赖添加到 libs 目录下

集成方式二,逐个集成:
// app 目录下 build.gradle
implementation files('libs/encryptor-xxx-private.aar')
// 6.17.1 及以上移除了 if_encryptor-xxx
implementation files('libs/if_encryptor-xxx.aar')
implementation files('libs/RangersAppLog-All-cn-xxx.aar')
implementation files('libs/RangersAppLog-Log-xxx.aar')
implementation files('libs/plugin-aggregation-xxx.aar')
// 剩余部分按需集成
// 注:调试工具建议仅 debug 模式即成
debugImplementation files('libs/RangersAppLog-DevTools-xxx.aar')

如果离线使用 plugin,请参考以下集成方式:
// 根目录下 build.gradle
buildscript {
  dependencies {
    // 增长营销所需的 gradle 插件
    // 如果放在 app/libs 目录下 xxxdir 可以替换为 app/libs
    classpath fileTree(include: ['*.jar'], dir: 'xxxdir/RangersAppLog-All-plugin-xxx.jar')
  }
}

离线包依赖混淆配置:
-keep class com.bytedance.applog.picker.DomSender { public *; }
-keep class com.bytedance.applog.tracker.WebViewUtil { public *; }
-keep class com.bytedance.applog.metasec.AppLogSecHelper { *; }

-keepclassmembers class * {
    public void loadUrl(java.lang.String);
    public void loadUrl(java.lang.String, java.util.Map);
    public void loadData(java.lang.String, java.lang.String, java.lang.String);
    public void loadDataWithBaseURL(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String);
}

user_unique_id 相关

用户登录态设置

说明

提示:用户登录态概念是站在业务角度的一个说法,SDK 本身是没有用户登录/登出概念的,SDK 只关心user_unique_id 是否有被主动设置。

比如业务有账号体系,并希望 SDK 同步用户状态。就可以考虑在用户登录后立即对 SDK 设置 user_unique_id,在用户登出后立即对 SDK 清除 user_unique_id。

// 用户登录后立即设置 user_unique_id
AppLog.setUserUniqueID("your_USER_UNIQUE_ID");

// 用户登出后立即清除 user_unique_id
AppLog.setUserUniqueID(null);

用户口径相关处理

如果要设置用户口径,需要在设置 user_unique_id 的同时设置 user_unique_id_type

// 用户登录后立即设置 user_unique_id, user_unique_id_type
AppLog.setUserUniqueID("your_USER_UNIQUE_ID", "your_USER_UNIQUE_ID_TYPE");

// 用户登出后立即清除 user_unique_id, user_unique_id_type
AppLog.setUserUniqueID(null, null);

说明

提示:user_unique_id_type 的值是提前预制好的,具体找您的项目经理或客户成功经理。

多用户口径类型处理

如果要进行多口径绑定,在设置 user_unique_id 的同时设置 user_unique_id_type 后,还需要调用 bind 方法处理。注意:仅在SAAS云原生、私有化支持。

// 示例中 phone 和 cust_num 只是举例,具体传啥由业务决定
Map<String, String> ids = new HashMap<String, String>
ids.put("phone", "1230000000"); // 第一个参数 phone 为 id 类型枚举值,同 id 设计方案
ids.put("cust_num", "12345656788888"); //第一个参数 cust_num 为 id 类型枚举值,同 id 设计方案
AppLog.bind(ids, new IDBindCallback() {
    void onSuccess(IDBindResult result) {
        // 请求成功并设置登录状态
        AppLog.setUserUniqueID("12345656788888" ,"cust_num");
    }
    void onFail(int code) {
        // 绑定请求失败
    }
});

SDK 插件(全埋点、H5 打通、敏感字段采集代码移除)

说明

如需开启全埋点、webview 自动注入、隐私字段代码移除等功能。

插件依赖

插件仓库配置

Gradle 7.0 以下

// 在 project 级别的 build.gradle 的 buildscript 的 repositories 中添加 maven 仓库、引入 SDK plugin
buildscript {
    repositories {
        maven{
            url 'https://artifact.bytedance.com/repository/Volcengine/'
        }
        // 省略其他
    }
}

Gradle 7.0 及以上

// setting.gradle 中
pluginManagement {
    repositories {
        maven{
            url 'https://artifact.bytedance.com/repository/Volcengine/'
        }
        // 省略其他
    }
}

插件依赖

Gradle 7.0 以下

// 在project 级别的 build.gradle 的 buildscript的repositories中添加maven仓库、引入SDK plugin
buildscript {
    // 省略其他
    dependencies {
        classpath 'com.bytedance.applog:RangersAppLog-All-plugin:6.17.4'
    }
}

// 在 app module 级别的 build.gradle 
// 默认放到插件列表最后一个声明,如遇到冲突,
// 可以将其调整到 application / kotlin 等官方插件后的第一个
apply plugin: 'com.bytedance.std.tracker'

Gradle 7.0 及以上~8.0 以下

// project 级别的 build.gradle 中
buildscript {
    // 省略其他
    dependencies {
        classpath 'com.bytedance.applog:RangersAppLog-All-plugin:6.17.4'
    }
}

// 在 app module 级别的 build.gradle 
// 默认放到插件列表最后一个声明,如遇到冲突,
// 可以将其调整到 application / kotlin 等官方插件后的第一个
plugins {
    // 省略其他插件
    id 'com.bytedance.std.tracker'
}

Gradle 8.0 及以上

// project 级别的 build.gradle 中
buildscript {
    dependencies {
        // agp8 版本使用新版本插件
        classpath 'com.bytedance.applog:RangersAppLog-All-plugin-agp8:6.17.1'
    }
}

// 在 app module 级别的 build.gradle 
// 默认放到插件列表最后一个声明,如遇到冲突,
// 可以将其调整到 application / kotlin 等官方插件后的第一个
plugins {
    // 省略其他插件
    id 'com.bytedance.std.tracker'
}

插件使用示例

在 app module 级别的 build.gradle文件中应用 plugin。
Gradle 8.0 以下

teaExtension {
    // 自动注入webview的对接bridge
    autoInjectWebViewBridge = true

    // 插装黑名单,包路径前缀,针对某些不希望进行插桩的包进行配置
    // 需要将包名中的 . 替换成 /,可配置多个,通过 , 分割
    // 示例:blackList = ['dji/upgrade/internal','org/bouncycastle/jcajce']
    blackList = []

    // 埋点黑名单配置
    // 仅支持以下配置:
    // 'MAC_ADDRESS': mac地址
    // 'IMEI_MEID': imei和meid
    // 'OAID': oaid
    // 'ANDROIDID': android id
     // 'OPERATOR': carrier、mcc_mnc
    // 'CLIPBOARD':剪切板相关代码
    // 示例:trackBlackList = ['MAC_ADDRESS', 'IMEI_MEID', 'OPERATOR']
    trackBlackList = []
  
    // 6.14.3 新功能
    // 关闭接口/类自动跟踪功能
    // 使用场景举例:当您使用 lite 包时,但又需要 trackBlackList 来移除部分采集代码时,可以使用该功能
    disableAutoTrack = false
}

Gradle 8.0 及以上

// 新版插件使用调整为 appLog 
appLog {
    // 自动注入webview的对接bridge
    // agp8 的打通功能需要使用 6.16.7 及以上版本
    autoInjectWebViewBridge = true

    // 插装黑名单,包路径前缀,针对某些不希望进行插桩的包进行配置,对标老版插件 blackList
    // 示例:ignoredInstrumentationPaths = ['dji.upgrade.internal','org.bouncycastle.jcajce']
    // 写法从 ['dji/upgrade/internal','org/bouncycastle/jcajce'] 调整为 ['dji.upgrade.internal','org.bouncycastle.jcajce']
    ignoredInstrumentationPaths = []

    // 埋点黑名单配置,对标老版插件 trackBlackList
    // 仅支持以下配置:
    // 'MAC_ADDRESS': mac地址
    // 'IMEI_MEID': imei和meid
    // 'OAID': oaid
    // 'ANDROIDID': android id
    // 'OPERATOR': carrier、mcc_mnc
    // 'CLIPBOARD':剪切板相关代码
    // 示例:sensitiveFieldsBlocklist = ['MAC_ADDRESS', 'IMEI_MEID', 'OPERATOR']
    sensitiveFieldsBlocklist = []
  
    // 6.14.3 新功能
    // 关闭接口/类自动跟踪功能
    // 使用场景举例:当您使用 lite 包时,但又需要 trackBlackList 来移除部分采集代码时,可以使用该功能
    disableAutoTrack = false
}

H5 打通介绍

说明

如果您的应用同时集成 Web/JS SDK 以及 Android SDK,默认情况下,所有 H5 事件会通过 Web/JS SDK 上报,如果您希望 H5 事件由 Android SDK 接管上报,可以使用打通内嵌 H5 功能,此时 H5 页上产生的事件将通过 Android SDK 上报,而不在 Web/JS SDK 上报,这种接管上报场景下会复用 Android 端设置的user_unique_id和公共属性,但是也支持打通时 web 侧设置 / 更新端上的 uuid / 公共属性,请在打通时注意采用哪边数据,如果完全以端上为准可以去掉 web sdk 侧的 uuid(如需支持打通从 web 侧更新多口径,需使用新版本 SDK)/ 公共属性操作。

注意

打通功能需要 Web/JS SDK 与 Android SDK 同时集成并彼此配合,且当前版本 Web/JS SDK 打通后默认屏蔽 H5 全埋点功能,因为此时上报都由 Android SDK 接管,如果还想采集 H5 全埋点,需要查看 5.7 小节:原生端采集 H5 全埋点 。 Web/JS SDK 集成请参考《Web/JS SDK 集成》 以及 3.4 小节。
Lite 不支持打包打通功能,如果需要打通请集成 All。

// 注:该功能仅支持原生 WebView 与腾讯 X5
// 以下配置需要同时开启,如果以下两个没有同时满足,H5 事件就会继续保持 Web/JS SDK 上报:
// Android SDK 开启内嵌H5打通开关
config.setH5BridgeEnable(true);
// Web/JS SDK 设置 H5 内嵌到原生端并打通
window.collectEvent('init', {
    // ...... 其他初始化配置
    enable_native: true 
    // 5.1.3以下版本参数为Native,
    // 5.1.3以上版本修改为enable_native,但仍然兼容了Native的设置
})

// 补充:开启打通后老版本原本 web sdk 的全埋点配置会失效
// 5.1.10 之前的老版本打通后 Web/JS SDK 屏蔽了 H5 的全埋点功能,所以 Web/JS SDK 的全埋点设置开关会失效,
// 老版本 web sdk 想要依然保持 H5 全埋点功能,请查看 4.7 小节或者建议升级到新版本
window.collectEvent('init', {
    // 全埋点设置开关 
    autotrack: 打通后老版本失效(web sdk 5.1.10 之前版本失效,5.1.10 及之后版本正常采集)
})

打通内嵌 H5 页的白名单前置工作

开关开启后,必须配置打通白名单。仅白名单内配置的域名生效打通,白名单可用通配符方式添加,*表示通配符。

// 内嵌H5页白名单配置
// 示例:如需打通 www.volcengine.com 和 www.bytedance.com 两个H5页
config.setH5BridgeAllowlist(Arrays.asList("www.volcengine.com", "*.bytedance.*"));
// 适配 www.bytedance.com 的白名单有多种,请根据业务场景配置白名单,例如:
// www.bytedance.com 或 *.bytedance.* 或 *.*.* 均可实现。

如果不过滤任何域名和本地资源文件,可以配置允许所有H5页面打通。该配置优先级高于setH5BridgeAllowlist

// 允许所有h5打通
// 本功能仅支持6.9.7及以上版本
config.setH5BridgeAllowAll(true);

打通内嵌 H5 页的插件注入注意项

说明

一般情况下,H5 打通需要您先集成 AppLog plugin 插件,此时注入 Bridge 由 Plugin 插桩完成,但部分场景下,插桩可能不生效(插装失效的场景可能是混淆、被覆盖等等情况),您可以选择手动关闭 SDK 的自动注入 Bridge 能力,然后手动调用注入,此时可以在全埋点插件 Plugin 中增加配置autoInjectWebViewBridge = false,然后在需要打通的 WebView 加载H5之前手动注入 Bridge。

  • Gradle 8.0 以下关闭插件自动注入

    // 通过插件关闭自动注入
    teaExtension {
        // 关闭自动注入webview的对接bridge
        autoInjectWebViewBridge = false
        // 省略插件的其他使用
    }
    
  • Gradle 8.0 及以上关闭插件自动注入

    // AGP8 版本插件 6.16.3 支持
    appLog {
        // 关闭自动注入webview的对接bridge
        autoInjectWebViewBridge = false
        // 省略插件的其他使用
    }
    
// 本功能仅支持6.13.0及以上版本
WebView myWebView = findViewById(R.id.webview);
// 在loadUrl之前注入Bridge
AppLog.initWebViewBridge(myWebView, url);
myWebView.loadUrl(url);

打通内嵌 H5 页时禁止 H5 更新 App 内用户信息(uuid)

打通时默认用的是端内 SDK 用户信息,但也支持 H5 侧通过 Web SDK 更新端内 SDK 用户信息。
Android 6.17.0 版本新增禁止打通内嵌 H5 页时禁止 H5 更新 App 内用户信息,以避免 H5 多处使用时更新用户信息相关代码不好移除,从而打通时破坏端内 SDK 原本的用户信息。

// 默认开启,支持关闭
config.setUseBridgeUpdateUUIDEnabled(true);

Finder SDK 实例相关

SDK 默认实例介绍

Android SDK 提供了默认全局实例,通过 AppLog.xxx 相当于调用默认全局实例。

AppLog.xxx 等效于 AppLog.getInstance().xxx

多实例介绍

多实例初始化,指 SDK 支持在同包名的 App 中向多个应用(多个 appid)开启埋点,且埋点数据相互隔离,每一个 appid 对应一个单独的实例。

说明

多实例场景下,SDK中配置的 appid 为 DataFinder 中创建各个应用时生成的应用标识ID,您需要在 DataFinder 中创建对应的多个应用,并获取应用标识ID,再将应用标识ID配置到 SDK 中,详情请参见步骤2:获取 APPID

使用场景例如:

  • 第三方 SDK 依赖增长营销套件 SDK 做 SDK 内部产生的埋点时;
  • 同一个 App 或系统中,关联多个埋点应用(多个 appid),共用增长营销套件 SDK 时;
核心 API,使用后返回 IAppLogInstance 对象,需要开发者做好实例保存,确保数据发送到正确实例
AppLog.newInstance()
/* 多实例初始化SDK 实例1*/
final InitConfig config1 = new InitConfig("yourAPPID1", "yourCHANNEL1");
// 创建实例
IAppLogInstance appLogInst1 = AppLog.newInstance();
// 设置数据上送地址
config1.setUriConfig(UriConstants.DEFAULT);
// 是否 init 后自动 start 可改为 false,并请在用户授权后调用 start 开启采集
config1.setAutoStart(false);
// 开启全埋点事件的上送
config1.setAutoTrackEnabled(true); // 全埋点开关,true:开启,false:关闭
config1.setLogEnable(true); // true:开启日志,设置 logger,false:关闭日志
appLogInst1.setEncryptAndCompress(true); // 加密开关,true开启,false关闭
// 初始化一次即可
// Applition 中初始化建议使用该方法
appLogInst1.init(this, config1);
// Activity 中初始化建议使用该方法
appLogInst1.init(this, config1, activity);

//实例2
final InitConfig config2 = new InitConfig("yourAPPID2", "yourCHANNEL2");
IAppLogInstance appLogInst2 = AppLog.newInstance();
config2.setUriConfig(UriConstants.DEFAULT);
// 是否 init 后自动 start 可改为 false,并请在用户授权后调用 start 开启采集
config2.setAutoStart(false);
config2.setAutoTrackEnabled(true);
config2.setLogEnable(true); // true:开启日志,参考4.3节设置logger,false:关闭日志
appLogInst2.setEncryptAndCompress(true); // 加密开关,true开启,false关闭
// 初始化一次即可
// Applition 中初始化建议使用该方法
appLogInst2.init(this, config2);
// Activity 中初始化建议使用该方法
appLogInst2.init(this, config2, activity);

// 请在用户授权后调用如下方法,start 开始实际采集用户信息+上报:
appLogInst1.start();
appLogInst2.start();

说明

提示:不同实例的app_id要求不能相同。

隐私合规相关

SDK 可关闭采集的敏感字段

说明

开关应对 App 运行期间动态执行代码时是否会走到敏感字段采集逻辑。

  1. 关闭 MAC 地址采集
// 开关关闭后相关代码不运行,属性不采集,是否上送取决于客户是否外界传入过 MAC 
config.setMacEnable(false);
  1. 关闭设备 IMEI/MEID 采集

注意

OAID 是重要设备追踪信息,若关闭 OAID 会影响 Tracer 归因,使用 Tracer 请谨慎考虑。

// 开关关闭后相关代码不运行,属性不采集,是否上送取决于客户是否外界传入过 AppImei 
config.setImeiEnable(false);
  1. 关闭 OAID 采集
// 开关关闭后相关代码不运行,属性不采集不上送
config.setOaidEnabled(false);
  1. 关闭 Android ID 采集

注意

关闭 Android ID 会影响 device_id 生成逻辑,导致 device_id 卸载重装不一致,请谨慎关闭。
后续文档中会简称 device_id 为 did。

// 开关关闭后相关代码不运行,属性不采集,关闭后会随机生成并保存在本地缓存,卸载重装会丢失缓存
config.setAndroidIdEnabled(false);
  1. 关闭 ICCID 采集
// 开关关闭后相关代码不运行,属性不采集不上送
// 本功能仅支持 6.14.3 及以上版本
config.setIccIdEnabled(false);
  1. 关闭 SN(硬件序列号) 采集
// 开关关闭后相关代码不运行,属性不采集不上送
// 本功能仅支持 6.15.0 及以上版本
config.setSerialNumberEnable(false);
  1. 关闭 GAID 采集
    • 6.15.0 之前 cn(国内版)与 global(海外版)都默认采集
    • 6.15.0 及之后 cn 默认关闭,global 默认打开
// 开关关闭后相关代码不运行,属性不采集,是否上送取决于客户是否外界传入过 Gaid 
config.setGaidEnabled(false);
  1. 关闭运营商信息采集
// 开关关闭后相关代码不运行,属性不采集不上送
config.setOperatorInfoEnabled(false);
  1. 关闭剪切板访问
// 开关关闭后不会访问客户剪切板内容
// 通过对应 applog 实例关闭
AppLog.setClipboardEnabled(false);
  1. 关闭 CPU 架构采集
// 开关关闭后相关代码不运行,属性不采集不上送
// 本功能仅支持 6.17.1 及以上版本
config.setCPUAbiEnabled(false);
  1. 关闭屏幕分辨率 / 屏幕密度采集
// 开关关闭后相关代码不运行,属性不采集不上送
// 本功能仅支持 6.17.1 及以上版本
config.setDisplayDensityAndDpiEnabled(false);

静态检测移除相关代码

说明

如果您的 App 对于部分敏感字段允许存在 Apk 中产物中,比如合规静态扫描 Apk 时就不需要使用特点部分敏感字段采集的 API,那么通过插件,在编译期间移除是能满足您的诉求的。
如果集成插件请参考本文<SDK 插件(全埋点、H5 打通、敏感字段采集代码移除)>。

  1. 移除 MAC 地址相关代码
  • Gradle 8.0 以下
// 本功能仅支持 6.9.0 及以上版本
teaExtension {
    // ... 其他配置
    trackBlackList = ["MAC_ADDRESS"]

    // 您使用的是 Lite 包,需要移除采集相关代码,
    // 需要在新版本中添加该此配置,避免 Lite 包内容不齐导致运行闪退,6.14.3 起提供
    disableAutoTrack = true
}
  • Gradle 8.0 及以上
// 本功能仅支持 6.9.0 及以上版本
// AGP8 版本插件 6.16.3 支持
appLog {
    // ... 其他配置
    sensitiveFieldsBlocklist = ["MAC_ADDRESS"]
  
    // 您使用的是 Lite 包,需要移除采集相关代码,
    // 需要在新版本中添加该此配置,避免 Lite 包内容不齐导致运行闪退,6.14.3 起提供
    disableAutoTrack = true
}
  1. 移除 IMEI / MEID 相关代码
  • Gradle 8.0 以下
// 本功能仅支持 6.9.0 及以上版本
teaExtension {
    // ... 其他配置
    trackBlackList = ["IMEI_MEID"]

    // 您使用的是 Lite 包,需要移除采集相关代码,
    // 需要在新版本中添加该此配置,避免 Lite 包内容不齐导致运行闪退,6.14.3 起提供
    disableAutoTrack = true
}
  • Gradle 8.0 及以上
// 本功能仅支持 6.9.0 及以上版本
// AGP8 版本插件 6.16.3 支持
appLog {
    // ... 其他配置
    sensitiveFieldsBlocklist = ["IMEI_MEID"]
  
    // 您使用的是 Lite 包,需要移除采集相关代码,
    // 需要在新版本中添加该此配置,避免 Lite 包内容不齐导致运行闪退,6.14.3 起提供
    disableAutoTrack = true
}
  1. 移除 OAID 相关代码
  • Gradle 8.0 以下
// 本功能仅支持 6.9.0 及以上版本
teaExtension {
    // ... 其他配置
    trackBlackList = ["OAID"]

    // 您使用的是 Lite 包,需要移除采集相关代码,
    // 需要在新版本中添加该此配置,避免 Lite 包内容不齐导致运行闪退,6.14.3 起提供
    disableAutoTrack = true
}
  • Gradle 8.0 及以上
// 本功能仅支持 6.9.0 及以上版本
// AGP8 版本插件 6.16.3 支持
appLog {
    // ... 其他配置
    sensitiveFieldsBlocklist = ["OAID"]
  
    // 您使用的是 Lite 包,需要移除采集相关代码,
    // 需要在新版本中添加该此配置,避免 Lite 包内容不齐导致运行闪退,6.14.3 起提供
    disableAutoTrack = true
}
  1. 移除 AndroidId 相关代码
  • Gradle 8.0 以下
// 本功能仅支持 6.10.1 及以上版本
teaExtension {
    // ... 其他配置
    trackBlackList = ["ANDROIDID"]

    // 您使用的是 Lite 包,需要移除采集相关代码,
    // 需要在新版本中添加该此配置,避免 Lite 包内容不齐导致运行闪退,6.14.3 起提供
    disableAutoTrack = true
}
  • Gradle 8.0 及以上
// 本功能仅支持 6.10.1 及以上版本
// AGP8 版本插件 6.16.3 支持
appLog {
    // ... 其他配置
    sensitiveFieldsBlocklist = ["ANDROIDID"]
  
    // 您使用的是 Lite 包,需要移除采集相关代码,
    // 需要在新版本中添加该此配置,避免 Lite 包内容不齐导致运行闪退,6.14.3 起提供
    disableAutoTrack = true
}
  1. 移除运营商信息相关代码
  • Gradle 8.0 以下
// 本功能仅支持 6.10.1 及以上版本
teaExtension {
    // ... 其他配置
    trackBlackList = ["OPERATOR"]

    // 您使用的是 Lite 包,需要移除采集相关代码,
    // 需要在新版本中添加该此配置,避免 Lite 包内容不齐导致运行闪退,6.14.3 起提供
    disableAutoTrack = true
}
  • Gradle 8.0 及以上
// 本功能仅支持 6.10.1 及以上版本
// AGP8 版本插件 6.16.3 支持
appLog {
    // ... 其他配置
    sensitiveFieldsBlocklist = ["OPERATOR"]
  
    // 您使用的是 Lite 包,需要移除采集相关代码,
    // 需要在新版本中添加该此配置,避免 Lite 包内容不齐导致运行闪退,6.14.3 起提供
    disableAutoTrack = true
}
  1. 移除剪切板相关代码
  • Gradle 8.0 以下
// 本功能仅支持 6.16.3 及以上版本
teaExtension {
    // ... 其他配置
    trackBlackList = ["CLIPBOARD"]

    // 您使用的是 Lite 包,需要移除采集相关代码,
    // 需要在新版本中添加该此配置,避免 Lite 包内容不齐导致运行闪退,6.14.3 起提供
    disableAutoTrack = true
}
  • Gradle 8.0 及以上
// 本功能仅支持 6.16.3 及以上版本
// AGP8 版本插件 6.16.3 支持
appLog {
    // ... 其他配置
    sensitiveFieldsBlocklist = ["CLIPBOARD"]
  
    // 您使用的是 Lite 包,需要移除采集相关代码,
    // 需要在新版本中添加该此配置,避免 Lite 包内容不齐导致运行闪退,6.14.3 起提供
    disableAutoTrack = true
}

全埋点场景

自定义页面事件属性

IPageMeta接口类支持自定义标题、路径和属性。在 Activity 或 Fragment 上实现该接口和对应的函数,例如:

public class MyActivity extends Activity implements IPageMeta {
    @Override
    public String title() {
        return "自定义页面";
    }
    
    @Override
    public String path() {
        return "/mypath";
    }
    
    @Override
    public JSONObject pageProperties() {
        JSONObject params = new JSONObject();
        try {
            params.put("key", "value");
        } catch (JSONException e) {
            
        }
        return params;
    }
}

自定义 View 点击事件属性

除各预置事件的预置属性外,DataFinder 还支持设置点击事件(bav2b_click)的自定义属性。

设置 View 的元素 ID

支持对指定的 View 对象设置一个元素 ID,字符串即可,示例:

AppLog.setViewId(view, "myElementId");

设置 View 的属性

支持对指定的 View 对象设置属性值,示例:

JSONObject props = new JSONObject();
try {
    props.put("key", "value");
} catch (Exception e) {
}
AppLog.setViewProperties(view, props);

忽略全埋点事件

忽略特定的页面访问事件

支持忽略特定的 Activity 或 Fragment 的全埋点事件,示例:

AppLog.ignoreAutoTrackPage(MyActivity.class, MyFragment.class);

忽略特定 View 的点击事件

  • 忽略指定 View 对象的点击事件,示例:
AppLog.ignoreAutoTrackClick(findViewById(R.id.button1));
  • 忽略指定 View 类型的点击事件,示例:
// 忽略所有 Switch 组件的点击事件
AppLog.ignoreAutoTrackClickByViewType(Switch.class);

手动采集全埋点

手动采集页面事件

支持手动采集特定的 Activity 和 Fragment 对象的页面事件以及属性,示例:

JSONObject params = new JSONObject();
try {
    params.put("param1", "test");
} catch (JSONException e) {
}
AppLog.trackPage(MyActivity.this, params);

手动采集 View 点击事件

支持手动采集特定 View 的点击事件以及属性,示例:

JSONObject params = new JSONObject();
try {
    params.put("param1", "test");
} catch (JSONException e) {
}
AppLog.trackClick(myView, params);

其他场景实践

原生端采集 H5 全埋点

原生端内嵌 H5 页时,通过打开以下开关,可从原生端全埋点事件采集 H5 页全埋点事件。
使用场景一般有两个:

  • 由于当前版本 Web/JS SDK 打通后默认屏蔽 H5 全埋点功能,为确保打通后依然可以保留 H5 页全埋点功能。
  • 独立使用,在 H5 未集成 Web/JS SDK 的情况下想对应用中的 H5 页开启全埋点功能。

注意

  • 可以独立使用该功能,无需集成 Web/JS SDK。
  • 该功能 6.14.4 版本后提供,且目前的 H5 全埋点仅支持进入页面事件与点击事件。
// 注:该功能仅支持原生 WebView 与腾讯 X5

// 内嵌H5页面的全埋点事件
config.setH5CollectEnable(true); // true:开启h5全埋点事件,false:关闭h5全埋点事件
// 补充,该功能默认也通过插件方式注入,当插件失效或者想要自己手动注入时

如何正确获取 DID 等参数

由于 did / ssid 是通过设备服务请求返回,所以获取可能存在一定延迟性,Applog.getDid() 等方法可能第一时间无法获取到对应参数,所以建议通过回调的方式获取,以及回调后,再通过 Applog.getDid() 等方法就可以确保一定获取。

// step1:添加数据集观察回调,this 指代实现了 IDataObserver 的类
AppLog.addDataObserver(this);
// step2:通过 IDataObserver 的 onIdLoaded 或 onRemoteIdGet 到数据后使用或者使用以下方式获取: 
默认实例:Applog.getDid() / 使用多实例:IAppLogInstance.getDid()


// IDataObserver 主要功能介绍与参数介绍:
//  - did、iid、ssid 获取都可以通过该回调获取
//  - 服务端配置获取
//  - ab 实验配置获取
public interface IDataObserver {
    /**
     * 本地的id数据加载结果通知
     * @param did device id
     * @param iid install id
     * @param ssid 数说id
     */
    void onIdLoaded(@NonNull String did, @NonNull String iid, @NonNull String ssid);

    /**
     * 通知注册结果,以及id变化情况
     * 仅主进程会被调用
     * @param changed 是否和本地缓存有所不同
     * @param oldDid 本地老的 oldDid,可能为空
     * @param newDid server返回新的 device id
     * @param newIid server返回新 install id
     * @param newSsid server返回新数说 id
     */
    void onRemoteIdGet(boolean changed, @Nullable String oldDid, @NonNull String newDid,
                       @NonNull String oldIid, @NonNull String newIid, 
                       @NonNull String oldSsid, @NonNull String newSsid);

    /**
     * Config拉取数据,和本地数据对比有变化的通知
     * 仅主进程会被调用
     * @param changed 是否和本地缓存有所不同
     * @param config server返回新config内容
     */
    void onRemoteConfigGet(boolean changed, @Nullable JSONObject config);

    /**
     * server拉取AbConfig数据,和本地数据对比有变化的通知
     * 仅主进程会被调用
     * @param changed 是否和本地缓存有所不同
     * @param abConfig server返回新abConfig内容
     */
    void onRemoteAbConfigGet(boolean changed, @NonNull JSONObject abConfig);

    /**
     * 客户端ab实验曝光vid集合发生变化的通知
     * @param vids 客户端ab实验曝光vid集合
     * @param extVids 外部设置的external vid集合
     */
    void onAbVidsChange(@NonNull String vids, @NonNull String extVids);
}

事件过滤以及自定义参数补齐

针对事件过滤或事件自定义参数补齐,可以使用以下回调:

  • 6.16.1 及以上版本
AppLog.setEventHandler(new IEventHandler() {
    // 返回可接受的事件类型
    @Override
    public int acceptType() {
        return EventType.EVENT_ALL;
    }

    // 针对单事件做事件过滤 或 自定义参数额外处理
    @Override
    public EventPolicy onReceive(
            int eventType,
            @NonNull String eventName,
            @NonNull JSONObject properties,
            // 新增事件基本信息
            @NonNull EventBasicData basicData) {
        //  用户属性不处理
        if (eventName.startsWith("__profile_")) {
            return EventPolicy.ACCEPT;
        }
        // 过滤 xx 事件
        if ("xx".equals(eventName)) {
            return EventPolicy.DENY;
        }
        // 添加自定义属性
        try {
            properties.put("eventHandlerProps", "12345");
        } catch (JSONException ignored) {

        }
        // 其他事件正常上报
        return EventPolicy.ACCEPT;
    }
});
  • 6.16.1 以下版本
// 设置事件处理回调
AppLog.setEventHandler(new IEventHandler() {
    // 返回可接受的事件类型
    @Override
    public int acceptType() {
        return EventType.EVENT_ALL;
    }

    // 针对单事件做事件过滤 或 自定义参数额外处理
    @Override
    public EventPolicy onReceive(
            int eventType,
            @NonNull String eventName,
            @NonNull JSONObject properties) {
        //  用户属性不处理
        if (eventName.startsWith("__profile_")) {
            return EventPolicy.ACCEPT;
        }
        // 过滤 xx 事件
        if ("xx".equals(eventName)) {
            return EventPolicy.DENY;
        }
        // 添加自定义属性
        try {
            properties.put("eventHandlerProps", "12345");
        } catch (JSONException ignored) {

        }
        // 其他事件正常上报
        return EventPolicy.ACCEPT;
    }
});

事件公共属性

如需在每个事件中都包括某属性,可通过公共属性设置,无需在每个事件中重复设置。公共属性只需设置一次,即可包括在所有代码埋点事件、预置事件和全埋点事件中。

设置公共属性

/*
 * 示例:设置自定义的公共属性,属性名为 key_public,属性值为 value_public
 * 关于自定义 “公共属性” 请注意:
 * 1. 上报机制是随着每一次日志发送进行提交,默认的日志发送频率是 1 分钟,
 *    所以如果在一分钟内连续修改自定义公共属性,按照日志发送前的最后一次修改为准;
 * 2. 不推荐高频次修改,如每秒修改一次。
 */
 Map<String,Object> headerMap = new HashMap<String, Object>();
 headerMap.put("key_public", "value_public");
 AppLog.setHeaderInfo((HashMap<String, Object>)headerMap);

移除公共属性

// 示例:移除属性名为 key_public 的公共属性
AppLog.removeHeaderInfo("key_public");

// 通过传入 null 移除所有设置过的公共属性
AppLog.setHeaderInfo(null);

获取平台 ID 与通知

获取平台生成 ID

// 正确获取时机建议参考《如何获取 DID 等参数》
String ssid = AppLog.getSsid(); // 获取 SSID
String did = AppLog.getDid(); // 获取设备 bddid

获取 SDK 版本号

// SDK 版本号格式为 X.X.X
String sdkVersion = AppLog.getSdkVersion();

采集时长事件

本小节功能在 6.10.1+ 后开始支持。

带有时间属性的事件可以使用时长事件采集接口,例如采集视频播放时长事件等。示例:

// 在视频开始播放时调用
AppLog.startDurationEvent("play");

// 在视频暂停播放时调用
AppLog.pauseDurationEvent("play");

// 在视频继续播放时调用
AppLog.resumeDurationEvent("play");

// 在结束播放时调用,此时会上报一个 play 事件,且带有 $event_duration 属性(记录了播放时长,单位毫秒) 
JsonObject params = new JsonObject() 
// 可以在 params 填入自己的自定义参数
AppLog.stopDurationEvent("play", params);
// 6.16.10 后自持自定义时长事件事件名,默认情况事件名为方法第一个参数
AppLog.stopDurationEvent("play", params, "custom_play");

配置Scheme(可选)

如需使用实时埋点检测圈选事件,请配置 Scheme,因为需要扫码后 H5 需要通过 Scheme 来唤醒 App,如果您发现扫码成功但是应用未跳转可手动切换回去,在少部分场景下存在无法自动跳转的情况。

注意

请务必确保在正式上线前移除 scheme 包,仅在 debug 期间使用,避免合规风险。

获取URL Scheme

「应用列表」-> 接入应用的「详情」->「URL Scheme」中可查看您的 scheme,一般为rangersapplog.xxxxx的形式。
Image

添加URL Scheme

在 app module 级别的 build.gradle 中添加 URL Scheme。

// 在android的defaultConfig中添加
manifestPlaceholders.put("APPLOG_SCHEME", "yourURL_SCHEME".toLowerCase())
最近更新时间:2026.01.04 14:20:00
这个页面对您有帮助吗?
有用
有用
无用
无用