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

因爲X5內核打包後有30多M,x5官網文檔也着重提醒:「因爲內核體積較大,官網SDK默認爲靜默下載方案,首次使用須要在網絡中靜默下載約30M的內核,可能存在必定的加載失敗率,目前線上加載成功率約爲90%。若是您有業務須要強依賴X5內核相關功能,請使用靜態集成方式進行集成」。

當某些特殊app必須可靠加載X5內核時(非普通用戶使用,沒有裝微信),等待網絡慢慢下載還不必定成功,那就太廢了;彷佛靜態集成給了一條活路。css

關鍵就在於這個「靜態集成」,整個x5官網,除了常見問題中有提到,其餘任何地方都找不到如何靜態集成,更找不到SDK;後面發現是早年有提供文檔和下載,不事後面就關閉了,文檔也刪了;也許是用的人多,又不掙錢,KPI下的產物吧,沒利誰給你免費維護。html

通過蒐羅歷史資料(GitHub搜代碼真穩的一比),結合下載到的老版本靜態集成SDK,通過一番摸索,實現了:用老版本的jar + 最新的TBS X5內核,進行靜態集成,將內核直接打包進APK。java

前情提要

本篇文章只針對X5內核的靜態集成,將30多M內核直接打包進Apk,TBS X5官網已經沒有相關資料了;若是你不是要把內核打包進Apk,請直接閱讀官網 https://x5.tencent.com/ 文檔就好了,不用折騰。android

第一步:下載老版本SDK獲得jar

獲取SDK

當前時間:2020-08-07,能找到的最新的一個靜態集成SDK,看裏面文件名時間是2017-10-11,雖然老了點,可是能用來加載最新的X5內核,沒有問題。git

老版本SDK下載地址:http://soft.tbs.imtt.qq.com/1...github

下載後,只須要提取裏面的tbs_sdk_thirdapp_v3.5.0.1063_43500_staticwithdownload_withoutGame_obfs_20171011_195714.jar,另一個apk文件是內核(這個內核太老,就不要了)。web

若是上面地址失效了,我在github裏面存了一份jar,地址:sql

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靜態內核加載方法)。json

這樣SDK就集成好了(見文末圖),此時就算不集成靜態內核也能正常運行,就是x5加載不太穩定。瀏覽器

步驟2、下載提取最新TBS X5內核

有兩種方法,一個是從微信裏面提取;另一個就是app內訪問tbs調試頁面,而後安裝新內核,再提取。

方法1:從微信中提取

微信中打開http://debugtbs.qq.com,進入界面後點擊拷貝內核按鈕,會彈出保存的路徑(參考頂上【圖3】),打開這個路徑後提取裏面的core_private/x5.debug.tbs這個文件(若是沒有這個文件,就把彈出的路徑中全部文件都copy出來,把30M以上文件都改爲zip,能打開的就是了),其實這個是一個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://tbs.imtt.qq.com/release/tbs_core_045318_20200714112122_nolog_fs_obfs.tbs

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...

省市區鎮數據,提供座標、邊界,和shp、geojson、sql支持:https://github.com/xiangyuecn...

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

相關文章
相關標籤/搜索