因为X5内核打包后有30多M,x5官网文档也着重提醒:“因为内核体积较大,官网SDK默认为静默下载方案,首次使用须要在网络中静默下载约30M的内核,可能存在必定的加载失败率,目前线上加载成功率约为90%。若是您有业务须要强依赖X5内核相关功能,请使用静态集成方式进行集成”。当某些特殊app必须可靠加载X5内核时(非普通用户使用,没有装微信),等待网络慢慢下载还不必定成功,那就太废了;彷佛静态集成给了一条活路。css
关键就在于这个“静态集成”,整个x5官网,除了常见问题中有提到,其余任何地方都找不到如何静态集成,更找不到SDK;后面发现是早年有提供文档和下载,不事后面就关闭了,文档也删了;也许是用的人多,又不挣钱,KPI下的产物吧,没利谁给你免费维护。html
通过搜罗历史资料(GitHub搜代码真稳的一比),结合下载到的老版本静态集成SDK,通过一番摸索,实现了:用老版本的jar + 最新的TBS X5内核,进行静态集成,将内核直接打包进APK。java
本篇文章只针对X5内核的静态集成,将30多M内核直接打包进Apk,TBS X5官网已经没有相关资料了;若是你不是要把内核打包进Apk,请直接阅读官网 https://x5.tencent.com/ 文档就好了,不用折腾。android
当前时间:2020-08-07,能找到的最新的一个静态集成SDK,看里面文件名时间是2017-10-11,虽然老了点,可是能用来加载最新的X5内核,没有问题。git
老版本SDK下载地址:http://soft.tbs.imtt.qq.com/1...github
下载后,只须要提取里面的tbs_sdk_thirdapp_v3.5.0.1063_43500_staticwithdownload_withoutGame_obfs_20171011_195714.jar
,另一个apk文件是内核(这个内核太老,就不要了)。web
若是上面地址失效了,我在github里面存了一份jar,地址:sql
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 SHA1: BB40F495C4CC39F41DBE34124F443B3EC43073EC
把获得的这个tbs_sdk_*.jar copy到项目的libs目录中(若是你已经导入了新版的tbs_sdk_*.jar
,把新版删掉就行,它们没有QbSdk.preinstallStaticTbs静态内核加载方法)。json
这样SDK就集成好了(见文末图),此时就算不集成静态内核也能正常运行,就是x5加载不太稳定。浏览器
有两种方法,一个是从微信里面提取;另一个就是app内访问tbs调试页面,而后安装新内核,再提取。
微信中打开http://debugtbs.qq.com
,进入界面后点击拷贝内核
按钮,会弹出保存的路径(参考顶上【图3】),打开这个路径后提取里面的core_private/x5.debug.tbs
这个文件(若是没有这个文件,就把弹出的路径中全部文件都copy出来,把30M以上文件都改为zip,能打开的就是了),其实这个是一个apk/zip文件,30多M,解压后获得一堆so和jar等文件,先复制出来再说,文件名加一个zip后缀。
X5官网中 关于TBS
-> 平台适配
中已经写明了只支持armeabi、armeabi-v7a、arm64-v8a
这3种架构,所以对于x86
等架构是不支持的(AS模拟器),抛开模拟器,大部分彷佛只需提供armeabi
架构就ok了。
微信中提取出来的这个内核的架构多是arm64-v8a
,若是你要armeabi
架构,请用下面方法2来获取内核。
集成了上面的老版本SDK后,你的App就能够经过访问http://debugtbs.qq.com
页面来手动下载最新
X5内核(若是下载不了,尝试改回新版本SDK下载,而后再改回来)。点击安装线上内核
(参考顶上【图1】),它会自动识别App的架构,下载到armeabi
或者arm64-v8a
架构的TBS内核包,下载完后重启App就能够进行内核提取操做了。
这就有两种途径获取到内核包了,一个是在安装时监控App的网络请求,获得下载地址;另一个就是和微信里面同样,点击拷贝内核
按钮,参考上面微信的流程。
这里提供我拿到的一个内核下载地址:
http://tbs.imtt.qq.com/release/tbs_core_045318_20200714112122_nolog_fs_obfs.tbs 30多M,内核版本:45318(20200714112122),Chrome 77
你提取到内核文件就是一个apk文件,直接zip解压就好了,里面有lib
+ assets
两个目录,咱们要把这两个目录内的全部文件合到一块儿放到一个目录再操做:
lib
目录内多是armeabi
或者 arm64-v8a
,不一样架构是由于是根据你App架构(或微信) + 手机支持的架构由TBS自动下载的,若是你须要的架构类型和lib
里面的不一样,那么请参考上面从新提取内核。
将lib/arm*内的so文件复制出来,和assets/webkit
内的文件放到一块儿,总共一块儿共40来个文件。
将刚才复制到一块儿的一堆文件,文件名通通加上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"} //真机 + 模拟器,谈性能?不如喂狗 }
不要用QbSdk.initX5Enviroment方法,改用QbSdk.preinstallStaticTbs方法。
在显示webview前,你要先把X5内核安装好(我管他叫激活)。代码就一句话,你最好在当前Activity(你得激活完后再手动建立WebView)里面,或者在Application(彷佛没有Activity里面激活来的稳定)里面执行:
//此方法很是耗时,应当开个线程 QbSdk.preinstallStaticTbs(getApplicationContext()); //这里就能够安全的建立WebView了,只要你的ABI架构没有问题,那么这里必定能加载到X5内核
简单点就在Activity里面激活就行,免得死活加载不了,好比这样子:
public class MyActivity extends Activity { @Override protected void onCreate(Bundle state) { super.onCreate(state); /*注意,你的布局里面不要有任何X5相关的东西,只留一个来容器放X5的WebView便可 <LinearLayout android:id="@+id/webviewBox" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" /> */ setContentView(R.layout.mylayout); //X5的WebView用动态建立,当内核准备好时,在建立,多是异步也多是同步操做 if(QbSdk.canLoadX5(getApplicationContext())){ Log.i("TBS_X5","已安装好,直接显示"); createWebview(); }else{ Log.i("TBS_X5","新安装"); new Thread(new Runnable() { @Override public void run() { boolean ok=QbSdk.preinstallStaticTbs(getApplicationContext()); Log.i("TBS_X5","安装成功:"+ok); runOnUiThread(new Runnable() { @Override public void run() { createWebview(); }}); } }).start(); } } private void createWebview(){ //手动建立WebView,显示到容器中,这样就能保证WebView必定是在X5内核准备好后建立的 WebView webView = new WebView(getApplicationContext()); LinearLayout.LayoutParams css=new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT); ((LinearLayout)findViewById(R.id.webviewBox)).addView(webView, css); //...其余代码 } } /*若是放到Application.onCreate里面激活,彷佛会有点问题,测试中发现后面Activity没有加载到X5内核,移到Activity就瞬间好了。这里仍是放一个例子吧 public class MyApp extends Application{ public static Boolean X5Ok=null; @Override public void onCreate(){ super.onCreate(); new Thread(new Runnable() { @Override public void run() { //Application里安装就算OK了也不保证必定能用 X5Ok=QbSdk.preinstallStaticTbs(getApplicationContext()); } }).start(); } } */
<uses-permission .... 抱歉,先毛权限也不给。你App原本须要什么权限,就给什么权限(网络、录音、摄像头),不用管X5官网的那一坨。 等他崩溃再一个个给,彷佛只要INTERNET、ACCESS_NETWORK_STATE权限就够了。
Java文件中:android.webkit.WebView
-> com.tencent.smtt.sdk.WebView
。
布局文件中:<WebView />
-> <com.tencent.smtt.sdk.WebView />
详细的包名替换阅读X5官网。
当网页访问摄像头、麦克风时,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:
H五、Hybrid App录音库,支持mp三、wav、语音识别:https://github.com/xiangyuecn...
省市区镇数据,提供坐标、边界,和shp、geojson、sql支持:https://github.com/xiangyuecn...
若是本篇文章对你有帮助,您也能够到上面仓库中对做者进行打赏~