当前位置: 首页 > news >正文

Android集成腾讯TBS_X5内核的一些解决方法

关于我开发中遇到的问题,主要还是不够细心导致的,官方文档写的也没很清楚,但是还是分享出来一下,让新手可以少走弯路,也防止自己忘记了。主要有下面几个问题:

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);

下面是关于接入SDK的步骤流程,你可以仔细检查下是否一致。如果集成步骤没漏掉的话,基本上是OK的

1.1 SDK接入

方式一:jar包方式集成(推荐)

您可将官网下载的jar包复制到您的App的libs目录,并且通过Add As Library的方式集成TBS SDK。

前往官网下载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声明

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

  2. 该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内核下载

相关文章:

  • spring cloud
  • 【MySQL】必知必会知识点
  • 复盘模型总结
  • Spring5学习笔记03--Bean的生命周期
  • 在小熊派BearPi-HM_Micro_small开发板上安装HAP
  • 基数排序(学习)
  • hive窗口函数最全总结
  • Vulnhub靶场 ICA: 1
  • Tomcat部署
  • 大数据如何进行测试
  • python基础专栏13-python基础篇-控制结构
  • 3.4 创建共用模块-供其它模块使用
  • 通用Excel表格导出(Map类型数据导出为表格)
  • leetcode刷题 (9.1) 动态规划
  • 【C++】如何理解函数调用中的传值和传址
  • [case10]使用RSQL实现端到端的动态查询
  • Codepen 每日精选(2018-3-25)
  • ES学习笔记(12)--Symbol
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • Linux Process Manage
  • Logstash 参考指南(目录)
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • passportjs 源码分析
  • vue-cli在webpack的配置文件探究
  • vuex 学习笔记 01
  • 对象引论
  • 工程优化暨babel升级小记
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 微信开放平台全网发布【失败】的几点排查方法
  • 一天一个设计模式之JS实现——适配器模式
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • ​ArcGIS Pro 如何批量删除字段
  • ​secrets --- 生成管理密码的安全随机数​
  • #{}和${}的区别?
  • #pragma 指令
  • #传输# #传输数据判断#
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (二)springcloud实战之config配置中心
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (十)c52学习之旅-定时器实验
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • *1 计算机基础和操作系统基础及几大协议
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .equals()到底是什么意思?
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .NET 设计模式初探
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .Net程序帮助文档制作
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth