文章目錄
因爲X5內核打包後有30多M,x5官網文檔也着重提醒:「因爲內核體積較大,官網SDK默認爲靜默下載方案,首次使用須要在網絡中靜默下載約30M的內核,可能存在必定的加載失敗率,目前線上加載成功率約爲90%。若是您有業務須要強依賴X5內核相關功能,請使用靜態集成方式進行集成」。css
當某些特殊app必須可靠加載X5內核時(非普通用戶使用,沒有裝微信),等待網絡慢慢下載還不必定成功,那就太廢了;彷佛靜態集成給了一條活路。html
關鍵就在於這個「靜態集成」,整個x5官網,除了常見問題中有提到,其餘任何地方都找不到如何靜態集成,更找不到SDK;後面發現是早年有提供文檔和下載,不事後面就關閉了,文檔也刪了;也許是用的人多,又不掙錢,KPI下的產物吧,沒利誰給你免費維護。java
通過蒐羅歷史資料(GitHub搜代碼真穩的一比),結合下載到的老版本靜態集成SDK,通過一番摸索,實現了:用老版本的jar + 最新的TBS X5內核,進行靜態集成,將內核直接打包進APK。android
前情提要
本篇文章只針對X5內核的靜態集成,將30多M內核直接打包進Apk,TBS X5官網已經沒有相關資料了;若是你不是要把內核打包進Apk,請直接閱讀官網 https://x5.tencent.com/ 文檔就好了,不用折騰。git
第一步:下載老版本SDK獲得jar
獲取SDK
當前時間:2020-08-07,能找到的最新的一個靜態集成SDK,看裏面文件名時間是2017-10-11,雖然老了點,可是能用來加載最新的X5內核,沒有問題。github
老版本SDK下載地址:http://soft.tbs.imtt.qq.com/17421/tbs_res_imtt_tbs_release_integrateWithX5core_43500SDK_43656Core.zipweb
下載後,只須要提取裏面的tbs_sdk_thirdapp_v3.5.0.1063_43500_staticwithdownload_withoutGame_obfs_20171011_195714.jar
,另一個apk文件是內核(這個內核太老,就不要了)。sql
若是上面地址失效了,我在github裏面存了一份jar,地址:json
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
集成SDK
把獲得的這個tbs_sdk_*.jar copy到項目的libs目錄中(若是你已經導入了新版的tbs_sdk_*.jar
,把新版刪掉就行,它們沒有QbSdk.preinstallStaticTbs靜態內核加載方法)。瀏覽器
這樣SDK就集成好了(見文末圖),此時就算不集成靜態內核也能正常運行,就是x5加載不太穩定。
步驟2、下載提取最新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
步驟3、集成內核到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內核安裝好(我管他叫激活)。代碼就一句話,你最好在當前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(); } } */
其餘的一些配置,參考官網就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:
H五、Hybrid App錄音庫,支持mp三、wav、語音識別:https://github.com/xiangyuecn/Recorder
省市區鎮數據,提供座標、邊界,和shp、geojson、sql支持:https://github.com/xiangyuecn/AreaCity-JsSpider-StatsGov
若是本篇文章對你有幫助,您也能夠到上面倉庫中對做者進行打賞~