靜態整合騰訊TBS X5核心WebView,從微信提取新版30M瀏覽器核心打包進apk

xiangyuecn發表於2020-08-07

由於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

如果本篇文章對你有幫助,您也可以到上面倉庫中對作者進行打賞~

相關文章