由于X5内核打包后有30多M,x5官网文档也着重提醒:“由于内核体积较大,官网SDK默认为静默下载方案,首次使用需要在网络中静默下载约30M的内核,可能存在一定的加载失败率,目前线上加载成功率约为90%。如果您有业务需要强依赖X5内核相关功能,请使用静态集成方式进行集成”。

当某些特殊app必须可靠加载X5内核时(非普通用户使用,没有装微信),等待网络慢慢下载还不一定成功,那就太废了;似乎静态集成给了一条活路。

关键就在于这个“静态集成”,整个x5官网,除了常见问题中有提到,其他任何地方都找不到如何静态集成,更找不到SDK;后面发现是早年有提供文档和下载,不过后面就关闭了,文档也删了;也许是用的人多,又不挣钱,KPI下的产物吧,没利谁给你免费维护。

经过搜罗历史资料(GitHub搜代码真稳的一比),结合下载到的老版本静态集成SDK,经过一番摸索,实现了:用老版本的jar + 最新的TBS X5内核,进行静态集成,将内核直接打包进APK。

前情提要

本篇文章只针对X5内核的静态集成,将30多M内核直接打包进Apk,TBS X5官网已经没有相关资料了;如果你不是要把内核打包进Apk,请直接阅读官网 https://x5.tencent.com/ 文档就行了,不用折腾。

第一步:下载老版本SDK得到jar

获取SDK

当前时间:2020-08-07,能找到的最新的一个静态集成SDK,看里面文件名时间是2017-10-11,虽然老了点,但是能用来加载最新的X5内核,没有问题。

老版本SDK下载地址:http://soft.tbs.imtt.qq.com/17421/tbs_res_imtt_tbs_release_integrateWithX5core_43500SDK_43656Core.zip

下载后,只需要提取里面的tbs_sdk_thirdapp_v3.5.0.1063_43500_staticwithdownload_withoutGame_obfs_20171011_195714.jar,另外一个apk文件是内核(这个内核太老,就不要了)。

如果上面地址失效了,我在github里面存了一份jar,地址:

https://github.com/xiangyuecn/Docs/blob/master/H5/静态集成腾讯TBS X5内核WebView,从微信提取新版30M浏览器内核打包进apk_files/tbs_sdk_thirdapp_v3.5.0.1063_43500_staticwithdownload_withoutGame_obfs_20171011_195714.jar

集成SDK

把得到的这个tbs_sdk_*.jar copy到项目的libs目录中(如果你已经导入了新版的tbs_sdk_*.jar,把新版删掉就行,它们没有QbSdk.preinstallStaticTbs静态内核加载方法)。

这样SDK就集成好了(见文末图),此时就算不集成静态内核也能正常运行,就是x5加载不太稳定。

步骤二、下载提取最新TBS X5内核

有两种方法,一个是从微信里面提取;另外一个就是app内访问tbs调试页面,然后安装新内核,再提取。

方法1:从微信中提取

微信中打开http://debugtbs.qq.com,进入界面后点击拷贝内核按钮,会弹出保存的路径(参考顶上【图3】),打开这个路径后提取里面的core_private/x5.debug.tbs这个文件,其实这个是一个apk/zip文件,30多M,解压后得到一堆so和jar等文件,先复制出来再说,文件名加一个zip后缀。

X5官网中 关于TBS -> 平台适配 中已经写明了只支持armeabi、armeabi-v7a、arm64-v8a 这3种架构,因此对于x86等架构是不支持的(AS模拟器),抛开模拟器,大部分似乎只需提供armeabi架构就ok了。

微信中提取出来的这个内核的架构可能是arm64-v8a,如果你要armeabi架构,请用下面方法2来获取内核。

方法2:App内内访问tbs调试页安装新内核

集成了上面的老版本SDK后,你的App就可以通过访问http://debugtbs.qq.com页面来手动下载最新

X5内核(如果下载不了,尝试改回新版本SDK下载,然后再改回来)。点击安装线上内核(参考顶上【图1】),它会自动识别App的架构,下载到armeabi或者arm64-v8a架构的TBS内核包,下载完后重启App就可以进行内核提取操作了。

这就有两种途径获取到内核包了,一个是在安装时监控App的网络请求,得到下载地址;另外一个就是和微信里面一样,点击拷贝内核按钮,参考上面微信的流程。

这里提供我拿到的一个内核下载地址:

http://soft.tbs.imtt.qq.com/17421/tbs_res_imtt_tbs_release_integrateWithX5core_43500SDK_43656Core.zip

30多M,内核版本:45318(20200714112122),Chrome 77

步骤三、集成内核到App中

解压内核得到so

你提取到内核文件就是一个apk文件,直接zip解压就行了,里面有lib + assets 两个目录,我们要把这两个目录内的所有文件合到一起放到一个目录再操作:

lib目录内可能是armeabi 或者 arm64-v8a,不同架构是因为是根据你App架构(或微信) + 手机支持的架构由TBS自动下载的,如果你需要的架构类型和lib里面的不同,那么请参考上面重新提取内核。

将lib/arm*内的so文件复制出来,和assets/webkit内的文件放到一起,总共一起共40来个文件。

so改名

将刚才复制到一起的一堆文件,文件名统统加上libtbs.前缀 + .so后缀,比如abc.so文件,改名后变成libtbs.abc.so.so,jar、conf文件也不例外。

附:CMD命令行批量改名

::直接在当前这堆文件的目录执行下面代码,批量改名
for /F %i in ('dir /A:-D /B') do move %i "libtbs.%i.so"

集成内核

将改好名的所有文件,copy到项目的src/main/jniLibs/armeabi目录中(如果是arm64-v8a的一样copy),这样内核就集成好了(见文末图)。下面我们只需要在app运行时激活这个内核就ok了。

记得build.gradle中配置上ndk,如

defaultConfig {
...
ndk {abiFilters "armeabi","x86"} //真机 + 模拟器,谈性能?不如喂狗
}

激活X5内核

不要用QbSdk.initX5Enviroment方法,改用QbSdk.preinstallStaticTbs方法。

在显示webview前,你要先把X5内核安装好(我管他叫激活)。代码就一句话,你可以在Application里面,或者当前Activity(你得激活完后再手动创建WebView)里面执行:

//此方法非常耗时,应当开个线程
QbSdk.preinstallStaticTbs(getApplicationContext()); //这里就可以安全的创建WebView了,只要你的ABI架构没有问题,那么这里一定能加载到X5内核

简单点就在Application里面激活就行,比如这样子:

public class MyApp extends Application{
public static Boolean X5Ok=null; @Override
public void onCreate(){
super.onCreate(); new Thread(new Runnable() {
@Override
public void run() {
X5Ok=QbSdk.preinstallStaticTbs(getApplicationContext());
}
}).start();
}
} /*使用的时候就在Activity里面来点暴力吧:
onCreate(...) {
while(MyApp.X5Ok==null){ System.currentTimeMillis(); } super.onCreate(...);
setContentView(...); if(!MyApp.X5Ok){
throw new RuntimeException("什么垃圾玩意");
}
}
*/

其他的一些配置,参考官网就OK

权限

<uses-permission ....
抱歉,先毛权限也不给。你App本来需要什么权限,就给什么权限(网络、录音、摄像头),不用管X5官网的那一坨。
等他崩溃再一个个给,似乎只要INTERNET、ACCESS_NETWORK_STATE权限就够了。

包名替换

Java文件中:android.webkit.WebView -> com.tencent.smtt.sdk.WebView

布局文件中:<WebView /> -> <com.tencent.smtt.sdk.WebView />

详细的包名替换阅读X5官网。

WebView网页权限

当网页访问摄像头、麦克风时,X5默认会弹一个确认对话框,自己的App网页就没有这么多条条框框了,可以静默授权:

//webkit是 WebChromeClient.onPermissionRequest 处理网页授权
//x5是 IX5WebChromeClientExtension.onPermissionRequest 处理网页授权 webView.setWebChromeClientExtension(new IX5WebChromeClientExtension() {
...
@Override
public boolean onPermissionRequest(String s, long l, MediaAccessPermissionsCallback callback) {
你的App摄像头、录音权限申请( 申请成功回调{
long allowed = 0;
allowed = allowed | MediaAccessPermissionsCallback.ALLOW_AUDIO_CAPTURE | MediaAccessPermissionsCallback.ALLOW_VIDEO_CAPTURE;
boolean retain = true;
callback.invoke(s, allowed,retain);
});
return true;
}
...
});

首次初始化冷启动优化

用不着,QbSdk.initX5Enviroment方法也用不着。

混淆、文件、视频

阅读X5官网文档。

结束语

欢迎关注我的GitHub:

H5、Hybrid App录音库,支持mp3、wav、语音识别:https://github.com/xiangyuecn/Recorder

省市区镇数据,提供坐标、边界,和shp、geojson、sql支持:https://github.com/xiangyuecn/AreaCity-JsSpider-StatsGov

如果本篇文章对你有帮助,您也可以到上面仓库中对作者进行打赏~

静态集成腾讯TBS X5内核WebView,从微信提取新版30M浏览器内核打包进apk的更多相关文章

  1. 腾讯TBS X5 WebView的简单使用

    工作中经常涉及H5网页的加载工作,最多使用的就是安卓系统控件WebView,但是当网页内容比较多的时候,需要等待很久才能加载完,加载完后用户才能看到网页中的内容,这样用户需要等很久,体验很差. 那能不 ...

  2. 记一次腾讯TBS浏览服务集成实践

    这次的分享源于最近的实际开发工作. 项目需求是 在原生Android应用中嵌入WebView,放置用于支撑音视频直播业务的Web页: 另外还需提供Word.Excel.PowerPoint.PDF等常 ...

  3. 第一天·浏览器内核及Web标准

    一·浏览器及浏览器内核 1.常见的浏览器 (1)IE浏览器 IE是微软公司旗下浏览器,是目国内用户量最多的浏览器.IE诞生于1994年,当时微软为了对抗市场份额占据将近百分之九十的网景Netscape ...

  4. 由Chromium内核引起的微信内置浏览器rce漏洞复现

    背景 chrome浏览器爆出漏洞,github上公开了poc:https://github.com/r4j0x00/exploits/tree/master/chrome-0day,在关闭chrome ...

  5. 安卓开发笔记(二十四):手把手教你一步步集成腾讯X5内核(Tencent TBS X5)

    1.为什么要集成腾讯X5内核? X5内核相对于系统webview,具有下述明显优势: 1) 速度快:相比系统webview的网页打开速度有30+%的提升: 2) 省流量:使用云端优化技术使流量节省20 ...

  6. Android 开发学习进程0.28 腾讯TBS接入和相关问题

    TBS 的接入和使用 TBS 的接入 腾讯TBS是X5内核的升级版,可以当作webview 来打开 网页,可以以用来打开docx doc pdf 等文件,这里主要使用的是文件功能. 依赖接入 api ...

  7. Ionic2中集成腾讯Bugly之自定义插件

    Ionic2混合开发,入坑系列:Ionic2中集成腾讯Bugly之自定义插件 1.编写Bugly.js代码 var exec = require('cordova/exec'); module.exp ...

  8. Unity3D集成腾讯语音GVoice SDK

    友情提示:最近发现腾讯GVoice有另一个官网,叫做腾讯游戏服务,经过对比发现这个网站才是最新的,下面我介绍的那个估计是已经废弃的,但不知道为啥老的网站没有直接链接到新网址而是仍然保留了.不过新官网的 ...

  9. 微信小程序集成腾讯云 IM SDK

    微信小程序集成腾讯云 IM SDK 1.背景 因业务功能需求需要接入IM(即时聊天)功能,一开始想到的是使用 WebSocket 来实现这个功能,然天意捉弄(哈哈)服务器版本太低不支持 wx 协议(也 ...

随机推荐

  1. It's time for Django

    本节内容 Django流程介绍 Django url Django view Django models Django template Django form Django admin Django ...

  2. 在spyder中无法import module

    如果在anaconda中下载安装了模块,但是在spyder中无法import,可能是因为两个python环境并不一致,在promote重新conda install spyder即可

  3. Git 推送到远程仓库

    github:https://github.com/ 国内的:https://gitee.com/ (和Github非常相似的) 一.Http方式进行推送 右击同步,配置远端,将URL替换成远程仓库的 ...

  4. 高阶Pandas知识图谱-《利用Python进行数据分析》

    所有内容整理自<利用Python进行数据分析>,使用MindMaster Pro 7.3制作,emmx格式,源文件已经上传Github,需要的同学转左上角自行下载或者右击保存图片. 其他章 ...

  5. 一起聊聊PHP的几个设计模式

    工厂模式 1.简单工厂模式 目的 简单工厂模式是一个精简版的工厂模式.   它与静态工厂模式最大的区别是它不是『静态』的.因为非静态,所以你可以拥有多个不同参数的工厂,你可以为其创建子类.甚至可以模拟 ...

  6. Java中的锁机制

    1.在Java中锁的分类 其实就是按照锁的特性分类的 公平锁,非公平锁 可重入锁 独享锁,共享锁 互斥锁,读写锁 乐观锁,悲观锁 分段锁 偏向锁,轻量级锁,重量级锁 自旋锁 相关资料:思维导图 使用场 ...

  7. html层重叠 相同尺寸透明flash重叠的解决办法

    <EMBED style="z-index:1; position:absolute; top:110px;" src="http://www.jintaisd.c ...

  8. android studio 部分问题及解决方案

    1 启动多个虚拟机后开启指定端口的虚拟机     https://blog.csdn.net/chuyouyinghe/article/details/72958004       adb devic ...

  9. pandas_时间序列和常用操作

    # 时间序列和常用操作 import pandas as pd # 每隔五天--5D pd.date_range(start = '',end = '',freq = '5D') ''' Dateti ...

  10. PHP is_float()、 is_double()、is_real()函数

    is_float() 函数用于检测变量是否是浮点型. 别名函数:is_double(),is_real().高佣联盟 www.cgewang.com 注意: 若想测试一个变量是否是数字或数字字符串(如 ...