目录
  1. 1. 引言
  2. 2. 复现步骤
  3. 3. 瞎分析
  4. 4. 解决方案
AndroidQ与tencentX5的恩怨情仇

引言

新项目,用了AndroidX然后需要用到webview,纠结于AgentWeb和TencentX5,然后觉得AgentWeb东西有点多,放在项目里面有点重然后选择了TencentX5, 然后放在了AndroidQ的测试机上测试,第一次打开网页正常,然后放一会重启App再打开就抛异常了。本来一直以为是包的问题,因为有打开正常的情况,后来发现没有这么简单

1
No super method setFrame(IIII)Z in class Lcom/tencent/tbs/core/webkit/AbsoluteLayout; or its super classes (declaration of 'com.tencent.tbs.core.webkit.AbsoluteLayout' appears in /data/user/0/packageName/app_tbs/core_share/tbs_jars_fusion_dex.jar)

复现步骤

卸载原有App然后重写打包安装,第一次打开网页正常,然后过一会打开App Crash了,必现然后开始了断点,打日志的调试之路

瞎分析

打了一堆日志后发现,未崩的状态和一蹦的状态下发现唯一区别就是X5初始化的时候

1
2
3
4
5
6
7
8
9
10
11
12
13
//搜集本地tbs内核信息并上报服务器,服务器返回结果决定使用哪个内核。
QbSdk.PreInitCallback cb = new QbSdk.PreInitCallback() {
@Override
public void onViewInitFinished(boolean arg0) {
//x5內核初始化完成的回调,为true表示x5内核加载成功,否则表示x5内核加载失败,会自动切换到系统内核。
Logger.d("app", " onViewInitFinished is " + arg0);
}

@Override
public void onCoreInitFinished() {
// 初始化结束通知
}
};

两次的区别就是onViewInitFinished的回调,未崩溃的状态下是false, 已崩溃的情况下是true,说明奔溃的核心问题就是加载了X5的内核导致的。

然后就在考虑X5是不是不支持AndroidQ,去官网查看相关内容,然后翻了半天找到于AndroidQ相关的内容TBS 5.0全面支持AndroidQ,然后又去找所谓的TBS5.0因为下载的SDK版本号是43697,找来找去发现最新的版本就是43697也就说43697是支持AndroidQ的(这里不得不说一句,这个文档写的很怪异啊,入口难找,版本不明确),然后就自闭了。然后开始下载demo调试(这里又要不得不说一句这个demo写的也是比较一言难尽啊)发现demo能运行的。这时突然想到了以前的一个项目自己无聊重构了一个版本里面用的也是X5,印象里是在AndroidQ上测试过的没问题,把代码拿出来溜了一圈确实能正常运行。

demo和老项目都正常然后就开始怀疑是不是AndroidX的问题了。 建立AndroidX的新工程,就加入简单的TencentX5,然后一切正常,不管是加载系统的内核还是X5的内核还是正常。再次自闭

解决方案

对比了一下两个AndroidX的代码版本,源码都是一样,调用方式也是一样,然后突然意识到就AndroidQ上报错。突然想到前几天刚把编译的targetSdkVersion改成了29,然后特意看了一下AndroidX的Demo上用的是targetSdkVersion是28。然后把项目里面的targetSdkVersion改回了28就正常了。

个人觉得targetSdkVersion升级到29后关停了一些非SDK接口的限制可能是这个问题。

目前已提交工单让X5的大哥们了解一下这个问题。

文章作者: sovwcwsfm
文章链接: http://sovwcwsfm.com/2019/11/15/AndroidQ%E4%B8%8EtencentX5%E7%9A%84%E6%81%A9%E6%80%A8%E6%83%85%E4%BB%87/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 _L