Android studio 接入騰訊TBSx5內核的解決方案
首頁我們查看一下騰訊瀏覽服務的官網: https://x5.tencent.com/tbs/guide/sdkInit.html
二、背景知識
1. TBS(騰訊瀏覽服務)的優勢
1) 速度快:相比系統webview的網頁打開速度有30+%的提升;
2) 省流量:使用雲端優化技術使流量節省20+%;
3) 更安全:安全問題可以在24小時內修復;
4) 更穩定:經過億級用戶的使用考驗,CRASH率低於0.15%;
5) 兼容好:無系統內核的碎片化問題,更少的兼容性問題;
6) 體驗優:支持夜間模式、適屏排版、字體設置等瀏覽增強功能;
7) 功能全:在Html5、ES6上有更完整支持;
8) 更強大:集成強大的視頻播放器,支持視頻格式遠多於系統webview;
9) 視頻和文件格式的支持x5內核多於系統內核
10) 防劫持是x5內核的一大亮點
2. 運行環境
1)手機ROM版本高於或等於2.2版本
2)手機RAM大於500M,該RAM值通過手機 /proc/meminfo 文件的MemTotal動態獲取
注:如果不滿足上述條件,SDK會自動切換到系統WebView,SDK使用者不用關心該切換過程。
3. SDK尺寸指標
1)SDK提供的JAR包約250K
三、SDK集成步驟
1. 第一步
下載 SDK jar 包放到工程的libs目錄下,將源碼和XML裏的系統包和類替換爲SDK裏的包和類,具體對應如下:
系統內核 |
SDK內核 |
android.webkit.ConsoleMessage |
com.tencent.smtt.export.external.interfaces.ConsoleMessage |
android.webkit.CacheManager |
com.tencent.smtt.sdk.CacheManager(deprecated) |
android.webkit.CookieManager |
com.tencent.smtt.sdk.CookieManager |
android.webkit.CookieSyncManager |
com.tencent.smtt.sdk.CookieSyncManager |
android.webkit.CustomViewCallback |
com.tencent.smtt.export.external.interfaces.IX5WebChromeClient.CustomViewCallback |
android.webkit.DownloadListener |
com.tencent.smtt.sdk.DownloadListener |
android.webkit.GeolocationPermissions |
com.tencent.smtt.export.external.interfaces.GeolocationPermissionsCallback |
android.webkit.HttpAuthHandler |
com.tencent.smtt.export.external.interfaces.HttpAuthHandler |
android.webkit.JsPromptResult |
com.tencent.smtt.export.external.interfaces.JsPromptResult |
android.webkit.JsResult |
com.tencent.smtt.export.external.interfaces.JsResult |
android.webkit.SslErrorHandler |
com.tencent.smtt.export.external.interfaces.SslErrorHandler |
android.webkit.ValueCallback |
com.tencent.smtt.sdk.ValueCallback |
android.webkit.WebBackForwardList |
com.tencent.smtt.sdk.WebBackForwardList |
android.webkit.WebChromeClient |
com.tencent.smtt.sdk.WebChromeClient |
android.webkit.WebHistoryItem |
com.tencent.smtt.sdk.WebHistoryItem |
android.webkit.WebIconDatabase |
com.tencent.smtt.sdk.WebIconDatabase |
android.webkit.WebResourceResponse |
com.tencent.smtt.export.external.interfaces.WebResourceResponse |
android.webkit.WebSettings |
com.tencent.smtt.sdk.WebSettings |
android.webkit.WebSettings.LayoutAlgorithm |
com.tencent.smtt.sdk.WebSettings.LayoutAlgorithm |
android.webkit.WebStorage |
com.tencent.smtt.sdk.WebStorage |
android.webkit.WebView |
com.tencent.smtt.sdk.WebView |
android.webkit.WebViewClient |
com.tencent.smtt.sdk.WebViewClient |
需要注意的是:
1)請不要在代碼裏使用下述寫法:
import android.*;
import android.webkit.*;
import android.webkit.WebStorage.*;
import android.net.*;
import android.net.http.*;
2)除了源碼裏需要把相關的包名和類名進行替換,佈局xml裏的聲明也需要替換,例如:
<com.tencent.smtt.sdk.WebView
android:id="@+id/forum_context"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingLeft="5dp"
android:paddingRight="5dp" />
爲了確保替換的完整,可以使用腳本checkqbsdk.sh 點擊下載 進行掃描,windows 上使用TBSSdk接入掃描工具.exe 點擊下載 進行掃描。腳本放在所有源碼的頂級目錄下運行即可。後續的版本發佈前儘量都運行一遍掃描,以免上次掃描後新提交的代碼有未替換的情況發生。替換不完全時,可能發生的問題是關於cookie的身份錯誤、類轉換時的crash等。cookie問題產生的原理是:一段代碼把cookie塞給了系統內核,另外一段代碼嘗試從x5的內核裏讀取cookie就失敗了。類轉換的錯誤產生的原理是:比如xml裏指定的是系統的webview,java的代碼裏把它當作x5的webview使用。
2. 第二步
x5暫時不提供64位so文件,爲了保證64位手機能正常加載x5內核,請參照如下鏈接修改相關配置https://x5.tencent.com/tbs/technical.html#/detail/sdk/1/34cf1488-7dc2-41ca-a77f-0014112bcab7
3. 第三步
AndroidManifest.xml里加入權限聲明:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
4. 第四步
優化異常上報:
爲了提高合作方的webview場景穩定性,及時發現並解決x5相關問題,當客戶端發生crash等異常情況並上報給服務器時請務必帶上x5內核相關信息。x5內核異常信息獲取接口爲:com.tencent.smtt.sdk.WebView.getCrashExtraMessage(context)。以bugly日誌上報爲例:
UserStrategy strategy = new UserStrategy(appContext);
strategy.setCrashHandleCallback(new CrashReport.CrashHandleCallback() {
public Map<String, String> onCrashHandleStart(int crashType, String errorType, String errorMessage, String errorStack) {
LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
String x5CrashInfo = com.tencent.smtt.sdk.WebView.getCrashExtraMessage(appContext);
map.put("x5crashInfo", x5CrashInfo);
return map;
}
@Override
public byte[] onCrashHandleStart2GetExtraDatas(int crashType, String errorType, String errorMessage, String errorStack) {
try {
return "Extra data.".getBytes("UTF-8");
} catch (Exception e) {
return null;
}
}
});
CrashReport.initCrashReport(appContext, APPID, true, strategy);
5. 第五步
適配修改:
1) App 首次就可以加載 x5 內核
App 在啓動後(例如在 Application 的 onCreate 中)立刻調用 QbSdk 的預加載接口 initX5Environment ,可參考接入示例,第一個參數傳入 context,第二個參數傳入 callback,不需要 callback 的可以傳入 null,initX5Environment 內部會創建一個線程向後臺查詢當前可用內核版本號,這個函數內是異步執行所以不會阻塞 App 主線程,這個函數內是輕量級執行所以對 App 啓動性能沒有影響,當 App 後續創建 webview 時就可以首次加載 x5 內核了
2) 目前,由於SDK WebView所提供的WebView類,是對系統WebView的聚合包裝,所以:獲取系統內核的WebView或者 x5內核的WebView的寬高
android.webkit.WebView webView = new android.webkit.WebView(this);
int width = webView.getWidth();
需要採用下面的方式進行
com.tencent.smtt.sdk.WebView webView = new com.tencent.smtt.sdk.WebView(this);
int width = webView.getView().getWidth();
6. 第六步
調整cookie的使用:
com.tencent.smtt.sdk.CookieManager和com.tencent.smtt.sdk.CookieSyncManager的相關接口的調用,在接入SDK後,需要放到創建X5的WebView之後(也就是X5內核加載完成)進行;否則,cookie的相關操作只能影響系統內核。
第一次啓動x5內核瀏覽器的緩慢的解決方案:
1.
a) 設置開啓優化方案
// 在調用TBS初始化、創建WebView之前進行如下配置,以開啓優化方案
HashMap<String, Object> map = new HashMap<String, Object>();
map.put(TbsCoreSettings.TBS_SETTINGS_USE_SPEEDY_CLASSLOADER, true);
QbSdk.initTbsSettings(map);
b) 增加Service聲明
<!-- 在AndroidManifest.xml中增加內核首次加載時優化Service聲明; 該Service僅在TBS內核首次Dex加載時觸發並執行dex2oat任務,任務完成後自動結束。 --><service
android:name="com.tencent.smtt.export.external.DexClassLoaderProviderService"
android:label="dexopt"
android:process=":dexopt" ></service>
無法加載x5內核的解決方案
- 如何判斷已加載了x5內核?
1. webview的getX5WebViewExtension()返回非null表示已加載了x5內核webview
2. 您的app打開網頁http://soft.imtt.qq.com/browser/tes/feedback.html,顯示000000表示加載的是系統內核,顯示大於零的數字表示加載了x5內核(該數字是x5內核版本號)
如果您的App接入TBS後無法加載x5內核,請繼續往下閱讀 - TBS主要通過共享使用微信手Q的內核而加載x5內核,您的手機是否沒有內核源?
1. 手機安裝微信,微信掃下面的二維碼打開網頁,如果顯示的數字是00000說明您的手機微信沒有安裝內核,下面我們來給微信安裝一個內核
2. 您的手機微信掃下面的二維碼安裝內核43906版本,安裝完成後把您的App卸載重裝下,看看是否可以加載x5內核了
補充說明:線上用戶的手機98%都有安裝微信(且微信已安裝x5內核),您的App接入了TBS後會去共享使用微信的x5內核;往往開發人員的測試手機由於不經常使用微信或者調試原因導致微信沒有安裝x5內核;另外線上剩餘2%的用戶沒有微信內核源的情況TBS也會在wifi條件下自己下載內核(不過這是小衆場景了)。
64位手機無法加載x5(libmttwebview.so is 32-bit instead of 64-bit)
x5內核暫時不提供64位的so文件,在64位手機上需要讓AP以32位模式運行。具體操作如下:
1.如果使用是Eclipse則需要將所有的.so文件都放置在so加載目錄:lib/armeabi文件夾下(沒有該目錄則新建一個,AP中沒有使用到.so文件則需要拷貝任意一個32位的so文件到該目錄下,如果沒有合適的so可以到官網http://x5.tencent.com/tbs/sdk.html下載官網“SDK接入示例“,拷貝對應目錄下的liblbs.so文件),lib文件夾下不要有其他以”armeabi“開頭的文件夾。
2.如果使用的是 Android studio則需要進行兩項配置,
(1)打開對應module中的build.gradle文件,在文件的android{}中的defaultConfig{}裏(如果沒有defaultConfig{}則手動添加)添加如下配置: ndk{abiFilters "armeabi"},如果配置後編譯報錯,那麼需要在gradle.properties文件中加上Android.useDeprecatedNdk=true;
(2)找出build.gradle中配置的so加載目錄:jniLibs.srcDir:customerDir,如果沒有該項配置則so加載目錄默認爲:src/main/jniLibs,需要將.so文件都放置在so加載目錄的armeabi文件夾下(沒有該目錄則新建一個,AP中沒有使用到.so文件則需要拷貝任意一個32位的so文件到該目錄下,如果沒有合適的so可以到官網http://x5.tencent.com/tbs/sdk.html下載官網“SDK接入示例“,拷貝對應目錄下的liblbs.so文件),so加載目錄下不要有其他以”armeabi“開頭的文件夾。如果仍未能解決您的問題,請直接在論壇回覆並描述您的問題
如圖所示:
例外還有一些測試的地址:
result = "http://so
result = "http://soft.imtt.qq.com/browser/tes/feedback.html"; //測試x5內核的運行情況---運行測試結果是04408 result = "https://wxpay.wxutil.com/mch/pay/h5.v2.php";//測試html5微信支付
ft.imtt.qq.com/browser/tes/feedback.html"; //測試x5內核的運行情況---運行測試結果是04408
result = "https://wxpay.wxutil.com/mch/pay/h5.v2.php";//測試html5微信支付
騰訊X5 兼容之後,支持html5微信支付---這個不錯