常见问题


1 接入相关

1.1 我接入了TBS SDK一定可以使用X5内核吗?

接入TBS SDK 并不代表一定可以使用内核。内核由于包大小较大,需要依赖动态下发,故存在一定失败率。大多数情况下,App 可以共享微信手Q 或者其他app 已经下载完成的内核

1.2 如何判断我已经成功加载起X5内核?

  • webview的getX5WebViewExtension()返回非null表示已加载了x5内核webview
  • 在没有自定义UA的情况下,使用您的app打开网页 http://soft.imtt.qq.com/browser/tes/feedback.html,显示000000表示加载的是系统内核,显示大于零的数字表示加载了x5内核(该数字是x5内核版本号)

1.3 集成X5内核后无法成功加载怎么办?

  • 请先仔细阅读接入指南,确保接入步骤正确
  • 接入后如果遇到加载问题请先按照X5内核接入检查进行接入检查并按照提示排查问题,如果仍无法解决您的问题,请提单反馈

1.4 如何查看当前的内核版本号?

1.5 集成Crosswalk或者Quic方案后出现必现Crash或者内核加载失败

由于crosswalk及quic与x5存在相同的包名,会导致内核默认加载app classLoader中的类,导致内核加载失败或者出现crash,如果您需要解决该问题,可在初始化内核之前添加如下代码:

HashMap map = new HashMap();
map.put(TbsCoreSettings.TBS_SETTINGS_USE_PRIVATE_CLASSLOADER, true);
QbSdk.initTbsSettings(map);

使用独立ClassLoader进行加载

1.6 64位手机无法加载x5(libmttwebview.so is 32-bit instead of 64-bit)

旧版本tbssdk 未支持 64位内核加载。您可以将您的sdk 版本更新到最新版,最新版本已支持64位内核下发和加载

1.7 调用QbSdk.initX5Enviroment接口,有时回调返回为false?

由于X5内核体积较大,需要依赖wifi网络静态下发,所以当内核不存在的时候,默认会回调false,此时将会使用系统内核代替

1.8 微信无法打开debugtbs.qq.com

我们灰度了一小部分微信用户强制使用系统内核对比效果,如果您的微信无法打开网页 debugtbs.qq.com 那么您就命中了我们灰度的这一小部分用户,可以把您的微信号和需要使用x5内核的原因发给 cameralu@tencent.com 后我们会配置您的微信号继续使用x5内核

1.9 为什么我本地Debug包可以正常加载内核,但是release包不可以?

使用x5需要添加混淆配置,建议参考 接入文档 第十步,添加混淆规则

1.10 TBS内核首次使用时加载卡顿ANR如何解决?

TBS内核首次使用和加载时,ART虚拟机会将Dex文件转为Oat,该过程由系统底层触发且耗时较长,很容易引起anr问题,解决方法是使用TBS的 ”dex2oat优化方案“。

  • 设置开启优化方案
   // 在调用TBS初始化、创建WebView之前进行如下配置 
   HashMap map = new HashMap();
   map.put(TbsCoreSettings.TBS_SETTINGS_USE_SPEEDY_CLASSLOADER, true); 
   map.put(TbsCoreSettings.TBS_SETTINGS_USE_DEXLOADER_SERVICE, true); 
   QbSdk.initTbsSettings(map);
  • 增加Service声明

AndroidManifest.xml中增加内核首次加载时优化Service声明。

该Service仅在TBS内核首次Dex加载时触发并执行dex2oat任务,任务完成后自动结束。

<service 
     android:name="com.tencent.smtt.export.external.DexClassLoaderProviderService"
     android:label="dexopt"
     android:process=":dexopt" >
</service>

1.11 TBS 是否支持海外版本app 使用?

为了减少您的apk包大小增量,及时动态发版解决安全隐患,TBS SDK采用了后台动态下发内核的方案。由于Google Play 禁止任何二进制代码的下发(包括so、dex、jar)和插件化技术的使用,故使用X5 内核的app不支持在海外Google Play上架。

如果您有多渠道打包能力,您可以在海外版本接入仅保留接口的SDK,保证编译通过,仅使用系统webview,在其他渠道使用标准SDK版本以便正常使用X5能力

1.12 如何在非Wifi 环境下下载内核

为了避免消耗用户的流量,x5 内核限制只会在wifi下进行下载和更新。如果您需要在非wifi网络(移动网络、有线网络下)下载内核,可在初始化前调用参数QbSdk.setDownloadWithoutWifi(true)

1.13 TBS 支持app内多进程使用吗?

支持,但需要在创建webview前使用WebView.setDataDirectorySuffix来设置区分不同进程使用不同数据目录,避免不同进程使用同一个目录出现无法获取文件锁引起的特定情况下耗时、卡白屏等问题。

2 文档相关

2.1 如何打开在线文档

目前TSB还不支持在线预览功能,只支持本地文件打开,打开方法请参考官网文件版本sdk内的使用说明

2.2 提示插件加载失败

不同文件格式tbs会下载对应的插件去解析格式,当前插件加载成功率98%左右,如果重启应用还不正常的话,请官网反馈,我们会跟踪调查

3 视频相关

3.1 视频播放无图像,该如何设置?

您可以尝试设置硬件加速解决该问题,比如在 AndroidManifest.xml

android:hardwareAccelerated="true"

3.2 App targetAPI升级到Android P,出现视频无法播放,提示视频播放源找不到?

由于默认情况下apache库已从 bootclasspath 中移除,只需要在AndroidManifestapplication节点内添加以下配置即可:

<uses-library android:name="org.apache.http.legacy" android:required="false"/>

3.3 为什么页面内视频全屏无反应?

  1. 确认构造WebView时传入的contextActivity

  2. 确认Activity声明android:configChanges="orientation|screenSize|keyboardHidden"

  3. 参考3.17

3.4 X5内核视频可以实现自动播放吗?

X5内核作为webview,具备自动播放能力,但这能力的控制权交由TBS宿主控制(安卓微信、手机QQ、QQ浏览器及其它第三方接入),宿主可以通过IX5WebViewExtensioninvokeMiscMethod(String method, Bundle bundle)来决定是否允许前端页面实现自动播放。

method = "setVideoPlaybackRequiresUserGesture";
//val为true或false。
bundle = new Bundle(); bundle.setBoolean("require", val);  
yourWebView.getX5WebViewExtension().invokeMiscMethod(method, bundle);

目前安卓QQ浏览器允许wifi下自动播放、手机QQ允许自动播放、微信不允许自动播放。

https://yongling8808.github.io/test/video/video_autoplay.html

3.5 X5内核视频为什么有时使用js调用video.play() 无法播放?

X5内核自TBS3.8及以后在事件处理这块跟移动端标准对齐,只有用户点击视频或者用户点击操作的时间周期内js调用了video.play()才可以正常播放。 https://yongling8808.github.io/test/video_demo/video_gesture.html 注意:例子中的4.timer描述已经不适应最新版,最新版视频的首次播放可以在timer响应中触发。

3.6 X5内核视频播放会触发页面元素的onblur吗?

目前X5内核的视频播放使用跟当前webview同级别的view来展示,视频播放时会抢占webview的焦点势必会导致页面内焦点丢失。

3.7 在X5内核上使用js调用video的seek方法怎么会出现seek位置跟传入的参数不符?

X5内核中的视频播放器是提供seek能力的,但seek的最终位置是前端传入的时间参数向已播放的方向的第一个关键帧。所以会出现seek位置不准,这个跟具体的视频源由一定关系。

3.8 X5内核竖屏播放视频时,横置手机会自动切到横屏全屏播放,但再竖屏时,视频为什么无法切回来?

这个是产品策略,需要用户点击全屏上的返回按钮后返回到竖屏。

3.9 使用history.goback返回视频播放页面,原来暂停的视频有一定概率会自动播放。

使用X5内核打开A页面播放视频后暂停,再点击A页面跳转到B页面,再从B页面当用户发生点击行为时使用js的history.goback到A页面,A页面视频一定概率会自动播放。

这个是X5内核前进后退重新恢复A页面视频播放通路遗留问题,页面前端可以将js的history.goback 调用跟用户点击行为的时机错开,比如在用户click时间中延时100ms再去调用history.goback可以临时解决该问题。

3.10 X5内核支持多个视频同时播放吗?

支持

3.11 X5内核支持MSE吗?

支持

3.12 接入X5内核后,webview的onLoadResource为什么接收不到H5页面video标签的视频url地址?如何获取视频链接?

A:X5内核视频播放使用X5内核视频sdk,视频资源通过sdk拉取,独立于X5webview,所以不会有onLoadResource通知,但可以通过webview接口注入js获取video标签的url属性。

3.13 Video标签转Canvas会有卡顿。

X5内核基于安全策略,对获取摄像头数据后在canvas上的绘制做了限制。

3.14 X5内核视频播放支持自签ssl证书的视频吗?

不支持。

3.15 X5内核视频支持playbackRate倍速播放吗?

支持。

3.16 X5内核视频支持与音频同时播放吗?

支持。

3.17 视频播放:45600以后的内核,H5 Video 按照Web标准实现

视频全屏参考: onShowCustomView onHideCustomView

4 其他问题

4.1 接入TBS后会收集用户的哪些信息

为了能够更好的为您提供服务,TBS会默认收集用户的国际设备识别码(IMEI)、国际移动用户识别码(IMSI)、网卡地址(MAC Address)、用户机型、屏幕尺寸、操作系统版本号、目标API(targetAPI)、网络类型(ApnType)、网络变化监听广播以及 Wifi的mac地址。由于在初始化过程中可能会收集这些信息,建议您在获得用户授权后再初始化和使用TBS 相关能力。

4.2 如何合规收集相关信息?

Q:为实现各类腾讯浏览服务SDK的特定业务功能,我们可能需要向开发者和/或终端用户收集相关信息,如调用电话,内存卡等权限相关的api。如何合规收集?

A:请尽快更新至43993以上的版本。开发者判断在用户未点击同意隐私政策的前提下,在内核初始化之前(包括X5 WebView 及预加载)之前调用QbSdk.disableSensitiveApi() ,可以禁用隐私API的获取。用户授权的情况下不建议调用该API,否则可能会导致无法针对app进行灰度、无法使用x5内核等问题。后续获取具体设备权限的授权,在用户明确同意向开发者应用授权后方可开启。

4.3 局域网是否无法使用X5内核

由于X5内核需要从后台静默下载,暂时不支持在局域网环境下使用

4.4 内核无法下载?

1.确认您的App为非X86架构,x86架构无法发起内核下载 2.确认您的APN为wifi。由于非wifi下内核下载可能会消耗用户流量,建议提示用户。如果在非wifi下仍需要下载内核,请使用QbSdk.setDownloadWithoutWifi(true)接口

4.5 如何避免输入法界面弹出后遮挡输入光标?

方法一:在AndroidManifest.xml中设置

android:windowSoftInputMode="stateHidden|adjustResize"

方法二:在代码中动态设置

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE | WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

4.6 在Android P机型遇到org.apache包名找不到的crash

由于Android P系统在targetAPI为28时默认情况下apache库已从 bootclasspath 中移除,只需要在AndroidManifest的application节点内添加以下配置即可:

<uses-library android:name="org.apache.http.legacy" android:required="false"/>

4.7 targetAPI为Android P时无法下载内核?

由于内核下载安装和查询是否可用需要向后台发送请求,目前还有部分请求为http格式,当targetAPI为28时非Https请求将会被block,会导致部分内核功能异常。您可以手动降低targetAPi到27及以下或者在您的AndroidManifst.xml中的Application标签中添加

android:networkSecurityConfig="@xml/network_security_config"

并在app的res/xml目录中添加network_security_config.xml文件,文件内容为

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>

4.8 接入x5 sdk后,和其它sdk一起打包遇到冲突怎么办?

如果其它平台提供的sdk也包含了tbs sdk 相同代码会导致打包冲突,可以试试不引入 tbs sdk,直接使用其它平台sdk里的相同类名,按照接入文档其他步骤接入

4.9 商用产品可以接入TBS吗,是否付费,以及有何限制?

商用产品可以接入TBS,目前TBS对普通第三方开发者是完全免费的,可以自助接入

4.10 如何重写TBS WebView 的屏幕事件(例如 overScrollBy)

setWebViewCallbackClientsetWebViewClientExtension 参考代码示例 http://res.imtt.qq.com/tbs/BrowserActivity.zip

4.11 接入X5 SDK时,liblbs.so文件有什么作用,不使用该so文件能否接入成功

该so的作用是在64位手机上以32位环境加载x5内核,如果App自己有相关处理不使用该so也可以正常加载x5内核

4.12 SDK中LogFileUtils或writeDataToStorage类ANR

SDK有部分写日志操作发生在主线程,App可以通过QbSdk的setTbsLogClient接管日志操作解决这个问题。接管后由App处理SDK日志输出的实现或者空实现不输出,该日志主要用途是分析无法加载x5内核的原因

4.13 Android 9.0访问debugtbs.qq.com提示网络错误?

由于debugtbs.qq.com访问需要依赖http请求,当targetAPI为28时非Https请求将会被block,会导致部分内核功能异常。您可以手动降低targetAPi到27及以下或者在您的AndroidManifst.xml中的Application标签中添加

android:networkSecurityConfig="@xml/network_security_config"

并在app的res/xml目录中添加network_security_config.xml文件,文件内容为

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>

4.14 打开网页时不停打印java.lang.NoSuchMethodError

该问题为已知问题,仅为Logcat 打印,不会对功能产生影响。我们将在下个版本进行处理

4.15 debugx5.qq.com 找不到代理相关Tab/无法打开vConsole

为了避免调试能力被恶意使用,我们移除了debugx5.qq.com的部分调试能力,如果您对该能力有诉求,欢迎在x5.tencent.com 进行反馈