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

因爲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

若是本篇文章對你有幫助,您也能夠到上面倉庫中對做者進行打賞~

相關文章
相關標籤/搜索