常见问题
1、应用启动数据未采 集或缺失生命周期方法。
-
若 AndroidMainfest.xml 文件中注册了自定义的 MyBaseActivity,请删除它,或对其配置过滤嵌码。过滤需要在 tingyun.properties 文件中添加以下内容:
#等号“=”后替换为需要过滤基调听云嵌码的类的路径,如有多个路径,使用英文逗号隔开
noInstrumentedClasses=com/nbs/ui/base/MyBaseActivity -
应用需实现自定义的 Application 类
2、用户操作数据采集少。
基调听云 SDK 编译时对点击事件(如 onClick、onItemClick、ItemSelected、PageSelected 等方法)嵌码,仅支持点击数据采集,暂不支持触摸、滑动等操作。
3、未采集到崩溃或采集的崩溃数量偏少。
- 基调听云 SDK 自 2.11.1 版本开始支持 Native Crash 异常采集,之前的版本仅采集 Java Crash。
- 基调听云 SDK 初始化前的崩溃无法采集。
- 检查报表的崩溃采集开关是否开启。
- 若应用中存在应用自身异常捕获或第三方崩溃采集逻辑,需放在基调听云 SDK 之前初始化。
4、TCP、SSL等指标数据为0。
- 基调听云 SDK 需在应用自身网络请求发起之前初始化
- Android 8.1 及以上版本只支持 OkHttp3 TCP、SSL等指标数据采集
- 使用 Http 代理时无法采集 TCP 数据。
- WebView 跨域资源响应头未配置 Timing-Allow-Origin: *
5、WebView数据未采集或只采集到 了网络错误、HTTP错误。
- 未在 WebChromeClient 的 onProgressChanged 方法中调用 NBSWebChromeClient.initJSMonitor(view, newProgress);
- 不支持 SPA 单页面应用数据采集。
- 不支持使用 loadDataWithBaseURL 加载HTML代码的数据采集。
6、URL过滤、错误过滤未生效。
检查报表上配置是否正确,可以通过在线正则工具检查,需注意报表配置正则的前后需要加斜杠“/”。
7、如项目使用MultiDex分包,安卓5.0以下设备可能会出现java.lang.NoClassDefFoundError异常。
需将报错的类分配至主 dex 中,可参考 Google 提供的解决方案。
8、Sophix补丁工具生成补丁失败。
基调听云 SDK 为了采集应用启动数据,会在编译时对 Application 类的 attachBaseContext() 及 onCreate() 方法嵌码。而阿里 Hotfix 补丁工具自 3.2.1 版本开始,要求在 initialize 之前,不能调用非 Android 官方 API,导致生成补丁失败。
【解决方案】
为了通过补丁工具的检查,基调听云不能在编译时 Application 类嵌码。可以在基调听云 tingyun.properties 配置文件中对 Application 类过滤。这样会影响基调听云采集应用启动数据,故需要对 Application 类手动嵌码。
1、在 tingyun.properties 配置文件(没有则新建,在项目根目录和主 module 下各一份)中,配置对 阿里 Application 类和项目自身 RealApplication 类过滤嵌码:
#等号后为完整类名,点用斜杠替换,多个类名用英文逗号隔开
#com/nbs/app/MyApp为示例,需替换为项目 real Application 类
noInstrumentedClasses=com/nbs/app/SophixStubApplication,com/nbs/app/MyApp
2、在项目的 Application 类的 onCreate() 方法中添加以下代码:
NBSAppInstrumentation.attachBaseContextBeginIns(this.getApplicationContext());
NBSAppInstrumentation.attachBaseContextEndIns();
NBSAppInstrumentation.applicationCreateBeginIns();
NBSAppInstrumentation.applicationCreateEndIns();
示例如下:
@Override
public void onCreate() {
//在 onCreate() 首行添加
com.networkbench.agent.impl.instrumentation.NBSAppInstrumentation.attachBaseContextBeginIns(this.getApplicationContext());
com.networkbench.agent.impl.instrumentation.NBSAppInstrumentation.attachBaseContextEndIns();
com.networkbench.agent.impl.instrumentation.NBSAppInstrumentation.applicationCreateBeginIns();
super.onCreate();
//...其他代码
//在 onCreate() 末行添加 com.networkbench.agent.impl.instrumentation.NBSAppInstrumentation.applicationCreateEndIns();
}
注意:
1.热修复后,需测试 Android 9 以上设备,基调听云能否正常启动。可以查看有没有打印 NBSAgent 的connect success 日志。如果没有正常启动,需要在阿里补丁工具中,将以下类添加到白名单中:
com.networkbench.agent.impl.NBSAgent
2.热修复后,需测试基调听云能否采集到崩溃。由于阿里在启动时和启动 3 秒后注册了两次 CrashHandler,但仅在启动时获取了defaultHandler,若应用在启动 3 秒后崩溃,阿里采集崩溃到后会跳过之前注册的第三方 CrashHandler 直接抛给系统,导致第三方无法采集到崩溃。需联系阿里修改其 CrashHandler 逻辑。
【参考资料】
Hotfix 补丁工具报错排查步骤请参见阿里云的介绍。
9、编译时出现java.util.zip.ZipEexeption异常。
SDK jar 包重复引用,检查 libs 目录及 build.gradle 文 件,确保只有一份 nbs.newlens.agent.jar 引用。
10、项目使用Lambda时编译失败。
将基调听云插件放在 lambda 后面:
apply plugin: 'me.tatarka.retrolambda'
apply plugin: 'newlens'
11、SDK编译耗时问题。
基调听云SDK的原理是字节码 插桩(使用 Transform API),在一定程度上会影响项目的编译耗时。我们提供了一个在开发期间基调听云 SDK 不参与编译的配置。若您的项目较大,在集成基调听云SDK后感觉到明显的编译时间增长,可按以下方法配置:
- 打开 app 目录下的 build.gradle 文件。
- 添加以下内容。
newlensExt {
newlensEnabled = false //设为flase时不对项目嵌码,提交测试及上线前需设置为true
}