常见问题
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
}
12、同一设备在报表出现多个did
基调听云 SDK 自 2.14.2 版本不再采集 IMEI 等设备信息,在应用首次启动时由服务器下发 did,并在本地缓存。若测试时应用卸载重新安装,或对应用进行“清除数据”操作,都会使清除本地缓存的 did,再次启动应用会重新下发新的 did。
13、不可以对 AndroidMainfest.xml 文件的 application 添加 process 属性
基调听云 SDK 自 2.14.2 版本不再采集 IMEI 等设备信息,在应用首次启动时由服务器下发 did,并在本地缓存。为了防止多个进程并发初始化时,多个进程下发不同的 did,SDK 对多进程做了限制,即若本地不存在 did 缓存,则子进程不初始化。SDK 判断进程时,使用了包名和进程名比较,如果对 application 添加了 process 属性,SDK 可能会停止采集数据。
14、如何向 BPI 传自定义业务数据
通过「自定义操作」来定义⼀个【业务操作】用以了解其性能表现情况。本接口数据仅在 BPI 报表展示。
1、相关接口
注意:「自定义操作」接口需要成对调用,actionName 不可为空,支持跨方法、跨线程调用。
customActionStart(String actionName);
customActionEnd(String actionName, String tag, Map cust);
2、代码示例
private void login() {
NBSAppAgent.customActionStart(“login”);
………
Map cust = new HashMap();
cust.put("userName","abc");
NBSAppAgent.customActionEnd(“login”,"tag",cust);
}
15、初始化SDK使用HTTP无法连接服务器
SDK 默认以 HTTPS 上传数据,若服务端只支持 HTTP,需设置 「setHttpEnabled(true)」。Android 9.0 及以上版本会限制 HTTP 请求,可以通过添加 network_security_config.xml 配置解决。
在res下新建xml目录,然后新建network_security_config.xml 文件。
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
在清单文件的 application 中添加 networkSecurityConfig。
<application
...
android:networkSecurityConfig="@xml/network_security_config"
...
/>