由於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核心,沒有問題。
下載後,只需要提取裡面的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
如果本篇文章對你有幫助,您也可以到上面倉庫中對作者進行打賞~