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

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

[toc] > 由於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/ 文件就行了,不用折騰。 ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9naXRlZS5jb20veGlhbmd5dWVjbi9Eb2NzL3Jhdy9tYXN0ZXIvSDUvJUU5JTlEJTk5JUU2JTgwJTgxJUU5JTlCJTg2JUU2JTg4JTkwJUU4JTg1JUJFJUU4JUFFJUFGVEJTJTIwWDUlRTUlODYlODUlRTYlQTAlQjhXZWJWaWV3JUVGJUJDJThDJUU0JUJCJThFJUU1JUJFJUFFJUU0JUJGJUExJUU2JThGJTkwJUU1JThGJTk2JUU2JTk2JUIwJUU3JTg5JTg4MzBNJUU2JUI1JThGJUU4JUE3JTg4JUU1JTk5JUE4JUU1JTg2JTg1JUU2JUEwJUI4JUU2JTg5JTkzJUU1JThDJTg1JUU4JUJGJTlCYXBrX2ZpbGVzLzEucG5n?x-oss-process=image/format,png) # 第一步:下載老版本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,地址: ```html 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 ``` ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9naXRlZS5jb20veGlhbmd5dWVjbi9Eb2NzL3Jhdy9tYXN0ZXIvSDUvJUU5JTlEJTk5JUU2JTgwJTgxJUU5JTlCJTg2JUU2JTg4JTkwJUU4JTg1JUJFJUU4JUFFJUFGVEJTJTIwWDUlRTUlODYlODUlRTYlQTAlQjhXZWJWaWV3JUVGJUJDJThDJUU0JUJCJThFJUU1JUJFJUFFJUU0JUJGJUExJUU2JThGJTkwJUU1JThGJTk2JUU2JTk2JUIwJUU3JTg5JTg4MzBNJUU2JUI1JThGJUU4JUE3JTg4JUU1JTk5JUE4JUU1JTg2JTg1JUU2JUEwJUI4JUU2JTg5JTkzJUU1JThDJTg1JUU4JUJGJTlCYXBrX2ZpbGVzLzIucG5n?x-oss-process=image/format,png) ## 整合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的網路請求,得到下載地址;另外一個就是和微信裡面一樣,點選`拷貝核心`按鈕,參考上面微信的流程。 這裡提供我拿到的一個核心下載地址: ```html 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來個檔案。 ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9naXRlZS5jb20veGlhbmd5dWVjbi9Eb2NzL3Jhdy9tYXN0ZXIvSDUvJUU5JTlEJTk5JUU2JTgwJTgxJUU5JTlCJTg2JUU2JTg4JTkwJUU4JTg1JUJFJUU4JUFFJUFGVEJTJTIwWDUlRTUlODYlODUlRTYlQTAlQjhXZWJWaWV3JUVGJUJDJThDJUU0JUJCJThFJUU1JUJFJUFFJUU0JUJGJUExJUU2JThGJTkwJUU1JThGJTk2JUU2JTk2JUIwJUU3JTg5JTg4MzBNJUU2JUI1JThGJUU4JUE3JTg4JUU1JTk5JUE4JUU1JTg2JTg1JUU2JUEwJUI4JUU2JTg5JTkzJUU1JThDJTg1JUU4JUJGJTlCYXBrX2ZpbGVzLzMucG5n?x-oss-process=image/format,png) ## so改名 將剛才複製到一起的一堆檔案,檔名統統加上`libtbs.`字首 + `.so`字尾,比如`abc.so`檔案,改名後變成`libtbs.abc.so.so`,jar、conf檔案也不例外。 附:CMD命令列批量改名 ```bat ::直接在當前這堆檔案的目錄執行下面程式碼,批量改名 for /F %i in ('dir /A:-D /B') do move %i "libtbs.%i.so" ``` ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9naXRlZS5jb20veGlhbmd5dWVjbi9Eb2NzL3Jhdy9tYXN0ZXIvSDUvJUU5JTlEJTk5JUU2JTgwJTgxJUU5JTlCJTg2JUU2JTg4JTkwJUU4JTg1JUJFJUU4JUFFJUFGVEJTJTIwWDUlRTUlODYlODUlRTYlQTAlQjhXZWJWaWV3JUVGJUJDJThDJUU0JUJCJThFJUU1JUJFJUFFJUU0JUJGJUExJUU2JThGJTkwJUU1JThGJTk2JUU2JTk2JUIwJUU3JTg5JTg4MzBNJUU2JUI1JThGJUU4JUE3JTg4JUU1JTk5JUE4JUU1JTg2JTg1JUU2JUEwJUI4JUU2JTg5JTkzJUU1JThDJTg1JUU4JUJGJTlCYXBrX2ZpbGVzLzQucG5n?x-oss-process=image/format,png) ## 整合核心 將改好名的所有檔案,copy到專案的`src/main/jniLibs/armeabi`目錄中(如果是`arm64-v8a`的一樣copy),這樣核心就整合好了(見文末圖)。下面我們只需要在app執行時啟用這個核心就ok了。 記得build.gradle中配置上ndk,如 ```java defaultConfig { ... ndk {abiFilters "armeabi","x86"} //真機 + 模擬器,談效能?不如喂狗 } ``` ## 啟用X5核心 不要用QbSdk.initX5Enviroment方法,改用QbSdk.preinstallStaticTbs方法。 在顯示webview前,你要先把X5核心安裝好(我管他叫啟用)。程式碼就一句話,你可以在Application裡面,或者當前Activity(你得啟用完後再手動建立WebView)裡面執行: ```java //此方法非常耗時,應當開個執行緒 QbSdk.preinstallStaticTbs(getApplicationContext()); //這裡就可以安全的建立WebView了,只要你的ABI架構沒有問題,那麼這裡一定能載入到X5核心 ``` 簡單點就在Application裡面啟用就行,比如這樣子: ```java 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 ## 權