三、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内核