1).我测试环境集成了,但是打包正式的时候居然没有集成成功,还是启用系统内核。
解决方案: 下面集成步骤1.3 混淆配置,因为正式签名混淆了,导致不成功的问题。
- -dontwarn dalvik.**
- -dontwarn com.tencent.smtt.**
-
- -keep class com.tencent.smtt.** {
- *;
- }
-
- -keep class com.tencent.tbs.** {
- *;
- }
2).集成OK了,但是打包正式的,还是没办法一进入就启用X5

解决方案:正如它官方文档介绍的集成成功了,不一定会使用内核X5,所以我在Application初始化的时候,添加判断下,是否需要重置化SDK,有可能没加载成功或者中途退出去导致的不成功。
- boolean need = TbsDownloader.needDownload(this, false);
- //是否需要下载内核,作用比较奇葩
- //该方法会在完全没下载的时候返回true,在
- //加载完成和存在缓存无法继续下载时返回flase
- //这个方法可以用来判断是否存在缓存需要重置
- if(need && Network.isAvailable(this)){// 判断网络是否可用
- Tip.toast("reset X5");
- //重置化sdk,这样就清除缓存继续下载了
- QbSdk.reset(this);
- //手动开始下载,此时需要先判定网络是否符合要求
- TbsDownloader.startDownload(this);
- }
3).启用了,但是第一次会回调显示下载完成,第二次进入App才会回调显示成功
解决方案:这个也是我搜索蛮多资料,别人问的最多的问题。可是解决方法都是说手动安装内核或者让它自动加载完再去让他加载h5页面。但是有没有办法让他自动下载呢?然后呢,我就在内核下载进度回调的方法,和监听预初始化方法里面做自动下载的操作。具体操作步骤如下
- QbSdk.initX5Environment(this, new QbSdk.PreInitCallback() {
- @Override
- public void onCoreInitFinished() {
- // 内核初始化完成,可能为系统内核,也可能为系统内核
- Log.e("app", " onCoreInitFinished");
- Tip.toast("onCoreInitFinished");
- }
-
- /**
- * 预初始化结束
- * 由于X5内核体积较大,需要依赖网络动态下发,所以当内核不存在的时候,默认会回调false,此时将会使用系统内核代替
- * @param isX5 是否使用X5内核
- */
- @Override
- public void onViewInitFinished(boolean isX5) {
- Log.e("app", " onViewInitFinished is isX5?" + isX5);
- Tip.toast("onViewInitFinished is isX5?" + isX5);
- if (!isX5 && Network.isAvailable(App.this.getApplicationContext())) {// 判断网络是否可用
- //重置化sdk,这样就清除缓存继续下载了
- QbSdk.reset(App.this.getApplicationContext());
- //手动开始下载,此时需要先判定网络是否符合要求
- TbsDownloader.startDownload(App.this.getApplicationContext());
- }
- }
- });
但是我记得下载完有一个重启的提示框,有重启操作,于是我就在安装完成的时候走一下重置步骤
- QbSdk.setTbsListener(new TbsListener() {
- @Override
- public void onDownloadFinish(int i) {
- //tbs内核下载完成回调
- //但是只有i等于100才算完成,否则失败
- //此时大概率可能由于网络问题
- //如果失败可增加网络监听器
- Tip.toast("X5下载完成");
- }
-
- @Override
- public void onInstallFinish(int i) {
- //内核安装完成回调,通常到这里也算安装完成,但是在
- //极个别情况也会出现加载失败,比如笔者在公司内网下偶现,可以忽略
- Tip.toast("X5安装完成");
- if (i == 100) {
- QbSdk.reset(App.this.getApplicationContext());
- }
- }
-
- @Override
- public void onDownloadProgress(int i) {
- Tip.toast("X5下载进度" + i);
- //下载进度监听
- Log.e("setTbsListener", " setTbsListener 进度" + i);
- }
- });QbSdk.setTbsListener(new TbsListener() {
- @Override
- public void onDownloadFinish(int i) {
- //tbs内核下载完成回调
- //但是只有i等于100才算完成,否则失败
- //此时大概率可能由于网络问题
- //如果失败可增加网络监听器
- Tip.toast("X5下载完成");
- }
-
- @Override
- public void onInstallFinish(int i) {
- //内核安装完成回调,通常到这里也算安装完成,但是在
- //极个别情况也会出现加载失败,比如笔者在公司内网下偶现,可以忽略
- Tip.toast("X5安装完成");
- if (i == 100) {
- QbSdk.reset(App.this.getApplicationContext());
- }
- }
-
- @Override
- public void onDownloadProgress(int i) {
- Tip.toast("X5下载进度" + i);
- //下载进度监听
- Log.e("setTbsListener", " setTbsListener 进度" + i);
- }
- });
4).wifi情况下是OK的,但是移动数据流量会没办法加载成功
解决方案:在下面集成步骤的 1.4 SDK初始化 里的(可选)里面,添加下这行代码就可以了 QbSdk.setDownloadWithOutWifi(true); 我有去管理应用后台去查看,加载成功X5内核大小大概130m左右,跟官网的(40-50m)还是有点偏差的。不懂是文档没更新,还是解压后的大小。
1.1 SDK接入
方式一:jar包方式集成(推荐)
您可将官网下载的jar包复制到您的App的libs目录,并且通过Add As Library的方式集成TBS SDK。
方式二:自动集成
使用 mavenCentral 仓库
在项目级别(通常是根目录下)的 build.gradle 中添加:
- repositories {
- google()
- // 增加这行
- mavenCentral()
- }
在应用级别(通常是 app 模块下)的 build.gradle 中添加依赖:
- dependencies {
- ...
- // 增加这行
- api 'com.tencent.tbs:tbssdk:44216'
- }
1.2 权限配置
为了保障内核的动态下发和正常使用,您需要在您的AndroidManifest.xml增加如下权限:
- <uses-permission android:name="android.permission.INTERNET" />
- <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
1.3 混淆配置
为了保障X5功能的正常使用,您需要在您的proguard-rules.pro文件中添加如下配置:
- -dontwarn dalvik.**
- -dontwarn com.tencent.smtt.**
-
- -keep class com.tencent.smtt.** {
- *;
- }
-
- -keep class com.tencent.tbs.** {
- *;
- }
1.4 SDK初始化
初始化SDK环境,在App启动后尽可能早地调用初始化接口,进行内核预加载:
- QbSdk.initX5Environment(appContext, new new PreInitCallback() {
- @Override
- public void onCoreInitFinished() {
- // 内核初始化完成,可能为系统内核,也可能为系统内核
- }
-
- /**
- * 预初始化结束
- * 由于X5内核体积较大,需要依赖网络动态下发,所以当内核不存在的时候,默认会回调false,此时将会使用系统内核代替
- * @param isX5 是否使用X5内核
- */
- @Override
- public void onViewInitFinished(boolean isX5) {
-
- }
- });
(可选)为了提高内核占比,在初始化前可配置允许移动网络下载内核(大小 40-50 MB)。默认移动网络不下载
QbSdk.setDownloadWithOutWifi(true);
1.5首次初始化冷启动优化
TBS内核首次使用和加载时,ART虚拟机会将Dex文件转为Oat,该过程由系统底层触发且耗时较长,很容易引起anr问题,解决方法是使用TBS的 ”dex2oat优化方案“。
(1). 设置开启优化方案
- // 在调用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);
(2). 增加Service声明
在AndroidManifest.xml中增加内核首次加载时优化Service声明。
该Service仅在TBS内核首次Dex加载时触发并执行dex2oat任务,任务完成后自动结束。
- <service
- android:name="com.tencent.smtt.export.external.DexClassLoaderProviderService"
- android:label="dexopt"
- android:process=":dexopt" >
- </service>
最后呢。分享下我之前有找过的帖子,主要是让大家少走一些弯路。祝君好运。以下是我搜索资料时查阅的链接,也分享一下吧
Android集成三方腾讯浏览器X5内核_小华2013的博客-CSDN博客_android 腾讯x5
android 腾讯X5 首次安装App 无效问题 (webview报错TypeError)_许佳佳233的博客-CSDN博客_x5webview初始化失败
安卓使用腾讯tbs查看pdf/word文件(解决x5内核下载问题)_只会helloworld的博客-CSDN博客_x5内核下载