三、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里的聲明也需要替換,例如:
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. 第二步
3. 第三步
AndroidManifest.xml里加入權限聲明:
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 onCrashHandleStart(int crashType, String errorType, String errorMessage, String errorStack) {
LinkedHashMap map = new LinkedHashMap();
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的相關操作只能影響系統內核。
7. 第七步
兼容視頻播放:
1)享受頁面視頻的完整播放體驗需要做如下聲明:
頁面的Activity需要聲明android:configChanges="orientation|screenSize|keyboardHidden"
2)視頻為了避免閃屏和透明問題,需要如下設置
a)網頁中的視頻,上屏幕的時候,可能出現閃爍的情況,需要如下設置:Activity在onCreate時需要設置:
getWindow().setFormat(PixelFormat.TRANSLUCENT);(這個對宿主沒什么影響,建議聲明)
b)在非硬繪手機和聲明需要controller的網頁上,視頻切換全屏和全屏切換回頁面內會出現視頻窗口透明問題,需要如下設置
聲明當前false為不透明。
特別說明:這個視各app情況所需,不強制需求,如果聲明了,對體驗更有利
c)以下接口禁止(直接或反射)調用,避免視頻畫面無法顯示:
webview.setLayerType()
webview.setDrawingCacheEnabled(true);
8. 第八步
輸入法設置
避免輸入法界面彈出后遮擋輸入光標的問題
方法一:在AndroidManifest.xml中設置
android:windowSoftInputMode="stateHidden|adjustResize"
方法二:在代碼中動態設置:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE | WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
9. 第九步
app 自定義 UA 的說明
如果 app 需要自定義 UA,建議采取在 SDK 默認UA 后追加 app UA 的方式示例:
webSetting.setUserAgentString(webSetting.getUserAgentString() + APP_NAME_UA);
其中 APP_NAME_UA 是 app 自定義 UA
10. 第十步
app混淆時的處理
由于我們提供的 TBS jar 已經混淆過,所以 App 混淆時可以不再混淆我們的 TBS jar,或者也可以把我們的混淆策略 proguard 點擊下載 加入 App 的混淆策略里注意:如果 App沒有按照該規則混淆了 TBS jar,可能導致無法使用 x5內核