接入TBS SDK 并不代表一定可以使用内核。内核由于包大小较大,需要依赖动态下发,故存在一定失败率。详细说明及优化方案可参考:关于官网X5内核SDK加载不稳定问题说明
webview的getX5WebViewExtension()
返回非null表示已加载了x5内核webviewQbSdk.getTbsVersion
获取内核版本号由于crosswalk及quic与x5存在相同的包名,会导致内核默认加载app classLoader中的类,导致内核加载失败或者出现crash,如果您需要解决该问题,可在初始化内核之前添加如下代码:
HashMap map = new HashMap();
map.put(TbsCoreSettings.TBS_SETTINGS_USE_PRIVATE_CLASSLOADER, true);
QbSdk.initTbsSettings(map);
使用独立ClassLoader进行加载
旧版本tbssdk 未支持 64位内核加载。您可以将您的sdk 版本更新到最新版,最新版本已支持64位内核下发和加载
QbSdk.initX5Enviroment
接口,有时回调返回为false?由于X5内核体积较大,需要依赖wifi网络静态下发,所以当内核不存在的时候,默认会回调false,此时将会使用系统内核代替
使用x5需要添加混淆配置,建议参考 接入文档 第十步,添加混淆规则
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);
在AndroidManifest.xml
中增加内核首次加载时优化Service声明。
该Service仅在TBS内核首次Dex加载时触发并执行dex2oat任务,任务完成后自动结束。
<service
android:name="com.tencent.smtt.export.external.DexClassLoaderProviderService"
android:label="dexopt"
android:process=":dexopt" >
</service>
为了减少您的apk包大小增量,及时动态发版解决安全隐患,TBS SDK采用了后台动态下发内核的方案。由于Google Play 禁止任何二进制代码的下发(包括so、dex、jar)和插件化技术的使用,故使用X5 内核的app不支持在海外Google Play上架。
如果您有多渠道打包能力,您可以在海外版本接入仅保留接口的SDK,保证编译通过,仅使用系统webview,在其他渠道使用标准SDK版本以便正常使用X5能力
为了避免消耗用户的流量,x5 内核限制只会在wifi下进行下载和更新。如果您需要在非wifi网络(移动网络、有线网络下)下载内核,可在初始化前调用参数QbSdk.setDownloadWithoutWifi(true)
支持,但需要在创建webview前使用WebView.setDataDirectorySuffix来设置区分不同进程使用不同数据目录,避免不同进程使用同一个目录出现无法获取文件锁引起的特定情况下耗时、卡白屏等问题。
若有文档方面诉求,请申请权限,查看该文档:TBS-文档接口 TbsReaderView接口问题说明
您可以尝试设置硬件加速解决该问题,比如在 AndroidManifest.xml
中
android:hardwareAccelerated="true"
由于默认情况下apache库已从 bootclasspath
中移除,只需要在AndroidManifest
的application
节点内添加以下配置即可:
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
context
是Activity
Activity
声明android:configChanges="orientation|screenSize|keyboardHidden"
X5内核作为webview,具备自动播放能力,但这能力的控制权交由TBS宿主控制(安卓微信、手机QQ、QQ浏览器及其它第三方接入),宿主可以通过IX5WebViewExtension
的invokeMiscMethod(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
X5内核自TBS3.8及以后在事件处理这块跟移动端标准对齐,只有用户点击视频或者用户点击操作的时间周期内js调用了video.play()才可以正常播放。 https://yongling8808.github.io/test/video_demo/video_gesture.html 注意:例子中的4.timer描述已经不适应最新版,最新版视频的首次播放可以在timer响应中触发。
目前X5内核的视频播放使用跟当前webview同级别的view来展示,视频播放时会抢占webview的焦点势必会导致页面内焦点丢失。
X5内核中的视频播放器是提供seek能力的,但seek的最终位置是前端传入的时间参数向已播放的方向的第一个关键帧。所以会出现seek位置不准,这个跟具体的视频源由一定关系。
这个是产品策略,需要用户点击全屏上的返回按钮后返回到竖屏。
使用X5内核打开A页面播放视频后暂停,再点击A页面跳转到B页面,再从B页面当用户发生点击行为时使用js的history.goback到A页面,A页面视频一定概率会自动播放。
这个是X5内核前进后退重新恢复A页面视频播放通路遗留问题,页面前端可以将js的history.goback 调用跟用户点击行为的时机错开,比如在用户click时间中延时100ms再去调用history.goback可以临时解决该问题。
支持
支持
A:X5内核视频播放使用X5内核视频sdk,视频资源通过sdk拉取,独立于X5webview,所以不会有onLoadResource通知,但可以通过webview接口注入js获取video标签的url属性。
X5内核基于安全策略,对获取摄像头数据后在canvas上的绘制做了限制。
不支持。
支持。
支持。
视频全屏参考: onShowCustomView onHideCustomView
为实现各类腾讯浏览服务SDK的特定业务功能,我们可能需要向开发者和/或终端用户收集相关个人信息。以下将详细列出腾讯浏览服务SDK的各项业务功能及为实现该功能所收集的个人信息情况:
TBS不获取,也无需使用IMSI、AndroidID、Mac信息,请及时更新最新sdk版本。
由于X5内核需要从后台静默下载,暂时不支持在局域网环境下使用
1.确认您的App为非X86架构,x86架构无法发起内核下载 2.确认您的APN为wifi。由于非wifi下内核下载可能会消耗用户流量,建议提示用户。如果在非wifi下仍需要下载内核,请使用QbSdk.setDownloadWithoutWifi(true)接口
方法一:在AndroidManifest.xml中设置
android:windowSoftInputMode="stateHidden|adjustResize"
方法二:在代码中动态设置
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE | WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
由于Android P系统在targetAPI为28时默认情况下apache库已从 bootclasspath 中移除,只需要在AndroidManifest的application节点内添加以下配置即可:
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
由于内核下载安装和查询是否可用需要向后台发送请求,目前还有部分请求为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>
如果其它平台提供的sdk也包含了tbs sdk 相同代码会导致打包冲突,可以试试不引入 tbs sdk,直接使用其它平台sdk里的相同类名,按照接入文档其他步骤接入
商用产品可以接入TBS,目前TBS对普通第三方开发者是完全免费的,可以自助接入
需 setWebViewCallbackClient
和 setWebViewClientExtension
参考代码示例 http://res.imtt.qq.com/tbs/BrowserActivity.zip
该so的作用是在64位手机上以32位环境加载x5内核,如果App自己有相关处理不使用该so也可以正常加载x5内核
SDK有部分写日志操作发生在主线程,App可以通过QbSdk的setTbsLogClient接管日志操作解决这个问题。接管后由App处理SDK日志输出的实现或者空实现不输出,该日志主要用途是分析无法加载x5内核的原因
由于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>
该问题为已知问题,仅为Logcat 打印,不会对功能产生影响。我们将在下个版本进行处理
为了避免调试能力被恶意使用,我们移除了debugx5.qq.com的部分调试能力,如果您对该能力有诉求,欢迎在x5.tencent.com 进行反馈