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


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

    1).我测试环境集成了,但是打包正式的时候居然没有集成成功,还是启用系统内核。

         解决方案: 下面集成步骤1.3 混淆配置,因为正式签名混淆了,导致不成功的问题。

    1. -dontwarn dalvik.**
    2. -dontwarn com.tencent.smtt.**
    3. -keep class com.tencent.smtt.** {
    4. *;
    5. }
    6. -keep class com.tencent.tbs.** {
    7. *;
    8. }

    2).集成OK了,但是打包正式的,还是没办法一进入就启用X5

         解决方案:正如它官方文档介绍的集成成功了,不一定会使用内核X5,所以我在Application初始化的时候,添加判断下,是否需要重置化SDK,有可能没加载成功或者中途退出去导致的不成功。

    1. boolean need = TbsDownloader.needDownload(this, false);
    2. //是否需要下载内核,作用比较奇葩
    3. //该方法会在完全没下载的时候返回true,在
    4. //加载完成和存在缓存无法继续下载时返回flase
    5. //这个方法可以用来判断是否存在缓存需要重置
    6. if(need && Network.isAvailable(this)){// 判断网络是否可用
    7. Tip.toast("reset X5");
    8. //重置化sdk,这样就清除缓存继续下载了
    9. QbSdk.reset(this);
    10. //手动开始下载,此时需要先判定网络是否符合要求
    11. TbsDownloader.startDownload(this);
    12. }

    3).启用了,但是第一次会回调显示下载完成,第二次进入App才会回调显示成功

           解决方案:这个也是我搜索蛮多资料,别人问的最多的问题。可是解决方法都是说手动安装内核或者让它自动加载完再去让他加载h5页面。但是有没有办法让他自动下载呢?然后呢,我就在内核下载进度回调的方法,和监听预初始化方法里面做自动下载的操作。具体操作步骤如下

    1. QbSdk.initX5Environment(this, new QbSdk.PreInitCallback() {
    2. @Override
    3. public void onCoreInitFinished() {
    4. // 内核初始化完成,可能为系统内核,也可能为系统内核
    5. Log.e("app", " onCoreInitFinished");
    6. Tip.toast("onCoreInitFinished");
    7. }
    8. /**
    9. * 预初始化结束
    10. * 由于X5内核体积较大,需要依赖网络动态下发,所以当内核不存在的时候,默认会回调false,此时将会使用系统内核代替
    11. * @param isX5 是否使用X5内核
    12. */
    13. @Override
    14. public void onViewInitFinished(boolean isX5) {
    15. Log.e("app", " onViewInitFinished is isX5?" + isX5);
    16. Tip.toast("onViewInitFinished is isX5?" + isX5);
    17. if (!isX5 && Network.isAvailable(App.this.getApplicationContext())) {// 判断网络是否可用
    18. //重置化sdk,这样就清除缓存继续下载了
    19. QbSdk.reset(App.this.getApplicationContext());
    20. //手动开始下载,此时需要先判定网络是否符合要求
    21. TbsDownloader.startDownload(App.this.getApplicationContext());
    22. }
    23. }
    24. });

    但是我记得下载完有一个重启的提示框,有重启操作,于是我就在安装完成的时候走一下重置步骤

    1. QbSdk.setTbsListener(new TbsListener() {
    2. @Override
    3. public void onDownloadFinish(int i) {
    4. //tbs内核下载完成回调
    5. //但是只有i等于100才算完成,否则失败
    6. //此时大概率可能由于网络问题
    7. //如果失败可增加网络监听器
    8. Tip.toast("X5下载完成");
    9. }
    10. @Override
    11. public void onInstallFinish(int i) {
    12. //内核安装完成回调,通常到这里也算安装完成,但是在
    13. //极个别情况也会出现加载失败,比如笔者在公司内网下偶现,可以忽略
    14. Tip.toast("X5安装完成");
    15. if (i == 100) {
    16. QbSdk.reset(App.this.getApplicationContext());
    17. }
    18. }
    19. @Override
    20. public void onDownloadProgress(int i) {
    21. Tip.toast("X5下载进度" + i);
    22. //下载进度监听
    23. Log.e("setTbsListener", " setTbsListener 进度" + i);
    24. }
    25. });QbSdk.setTbsListener(new TbsListener() {
    26. @Override
    27. public void onDownloadFinish(int i) {
    28. //tbs内核下载完成回调
    29. //但是只有i等于100才算完成,否则失败
    30. //此时大概率可能由于网络问题
    31. //如果失败可增加网络监听器
    32. Tip.toast("X5下载完成");
    33. }
    34. @Override
    35. public void onInstallFinish(int i) {
    36. //内核安装完成回调,通常到这里也算安装完成,但是在
    37. //极个别情况也会出现加载失败,比如笔者在公司内网下偶现,可以忽略
    38. Tip.toast("X5安装完成");
    39. if (i == 100) {
    40. QbSdk.reset(App.this.getApplicationContext());
    41. }
    42. }
    43. @Override
    44. public void onDownloadProgress(int i) {
    45. Tip.toast("X5下载进度" + i);
    46. //下载进度监听
    47. Log.e("setTbsListener", " setTbsListener 进度" + i);
    48. }
    49. });

    4).wifi情况下是OK的,但是移动数据流量会没办法加载成功

        解决方案:在下面集成步骤的 1.4 SDK初始化 里的(可选)里面,添加下这行代码就可以了 QbSdk.setDownloadWithOutWifi(true);    我有去管理应用后台去查看,加载成功X5内核大小大概130m左右,跟官网的(40-50m)还是有点偏差的。不懂是文档没更新,还是解压后的大小。

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

    1.1 SDK接入

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

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

    前往官网下载SDK

    方式二:自动集成

    使用 mavenCentral 仓库

    在项目级别(通常是根目录下)的 build.gradle 中添加:

    1. repositories {
    2. google()
    3. // 增加这行
    4. mavenCentral()
    5. }

    在应用级别(通常是 app 模块下)的 build.gradle 中添加依赖:

    1. dependencies {
    2. ...
    3. // 增加这行
    4. api 'com.tencent.tbs:tbssdk:44216'
    5. }

    1.2 权限配置

    为了保障内核的动态下发和正常使用,您需要在您的AndroidManifest.xml增加如下权限:

    1. <uses-permission android:name="android.permission.INTERNET" />
    2. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    1.3 混淆配置

    为了保障X5功能的正常使用,您需要在您的proguard-rules.pro文件中添加如下配置:

    1. -dontwarn dalvik.**
    2. -dontwarn com.tencent.smtt.**
    3. -keep class com.tencent.smtt.** {
    4. *;
    5. }
    6. -keep class com.tencent.tbs.** {
    7. *;
    8. }

    1.4 SDK初始化

    初始化SDK环境,在App启动后尽可能早地调用初始化接口,进行内核预加载:

    1. QbSdk.initX5Environment(appContext, new new PreInitCallback() {
    2. @Override
    3. public void onCoreInitFinished() {
    4. // 内核初始化完成,可能为系统内核,也可能为系统内核
    5. }
    6. /**
    7. * 预初始化结束
    8. * 由于X5内核体积较大,需要依赖网络动态下发,所以当内核不存在的时候,默认会回调false,此时将会使用系统内核代替
    9. * @param isX5 是否使用X5内核
    10. */
    11. @Override
    12. public void onViewInitFinished(boolean isX5) {
    13. }
    14. });

    (可选)为了提高内核占比,在初始化前可配置允许移动网络下载内核(大小 40-50 MB)。默认移动网络不下载

    QbSdk.setDownloadWithOutWifi(true);

    1.5首次初始化冷启动优化

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

    (1). 设置开启优化方案

    1. // 在调用TBS初始化、创建WebView之前进行如下配置
    2. HashMap map = new HashMap();
    3. map.put(TbsCoreSettings.TBS_SETTINGS_USE_SPEEDY_CLASSLOADER, true);
    4. map.put(TbsCoreSettings.TBS_SETTINGS_USE_DEXLOADER_SERVICE, true);
    5. QbSdk.initTbsSettings(map);

    (2). 增加Service声明

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

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

    1. <service
    2. android:name="com.tencent.smtt.export.external.DexClassLoaderProviderService"
    3. android:label="dexopt"
    4. android:process=":dexopt" >
    5. </service>

    最后呢。分享下我之前有找过的帖子,主要是让大家少走一些弯路。祝君好运。以下是我搜索资料时查阅的链接,也分享一下吧

    腾讯浏览服务

    Android集成三方腾讯浏览器X5内核_小华2013的博客-CSDN博客_android 腾讯x5

    android 腾讯X5 首次安装App 无效问题 (webview报错TypeError)_许佳佳233的博客-CSDN博客_x5webview初始化失败

    安卓使用腾讯tbs查看pdf/word文件(解决x5内核下载问题)_只会helloworld的博客-CSDN博客_x5内核下载

  • 相关阅读:
    MySQL-1-SQL讲解
    flink中维表Join几种常见方式总结
    Java中的ThreadPoolExecutor
    Clion如何添加头文件?
    2024HW--->中间件漏洞!!!
    【面试题】C/C++ 中指针和引用的区别
    Unity之Hololens如何实现3D物体交互
    同花顺_代码解析_交易系统_J09_18
    BSV 上的 PLONK
    Java设计模式之适配器模式
  • 原文地址:https://blog.csdn.net/seven2729/article/details/126659559