快速接入

1. 基础配置

1.1 SDK接入

方式一:jar包方式集成(推荐)

您可将官网下载的jar包复制到您的App的libs目录,并且通过Add As Library的方式集成TBS SDK。

前往官网下载SDK

方式二:自动集成

使用 mavenCentral 仓库

在项目级别(通常是根目录下)的 build.gradle 中添加:

repositories {
    google()
    // 增加这行
    mavenCentral()
}

在应用级别(通常是 app 模块下)的 build.gradle 中添加依赖:

dependencies {
    ...
    // 增加这行
    api 'com.tencent.tbs:tbssdk:44181'
}

1.2 权限配置

为了保障内核的动态下发和正常使用,您需要在您的AndroidManifest.xml增加如下权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

1.3 混淆配置

为了保障X5功能的正常使用,您需要在您的proguard-rules.pro文件中添加如下配置:

-dontwarn dalvik.**
-dontwarn com.tencent.smtt.**

-keep class com.tencent.smtt.** {
    *;
}

-keep class com.tencent.tbs.** {
    *;
}

1.4 SDK初始化

初始化SDK环境,在App启动后尽可能早地调用初始化接口,进行内核预加载:

QbSdk.initX5Environment(appContext, new new PreInitCallback() {
    @Override
    public void onCoreInitFinished() {
        // 内核初始化完成,可能为系统内核,也可能为系统内核
    }

    /**
    * 预初始化结束
    * 由于X5内核体积较大,需要依赖网络动态下发,所以当内核不存在的时候,默认会回调false,此时将会使用系统内核代替
    * @param isX5 是否使用X5内核
    */
    @Override
    public void onViewInitFinished(boolean isX5) {

    }
});

(可选)为了提高内核占比,在初始化前可配置允许移动网络下载内核(大小 40-50 MB)。默认移动网络不下载

QbSdk.setDownloadWithOutWifi(true);

1.5 异常上报配置

为了提高合作方的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);

1.6 首次初始化冷启动优化

TBS内核首次使用和加载时,ART虚拟机会将Dex文件转为Oat,该过程由系统底层触发且耗时较长,很容易引起anr问题,解决方法是使用TBS的 ”dex2oat优化方案“。

(1). 设置开启优化方案

// 在调用TBS初始化、创建WebView之前进行如下配置 
HashMap map = new HashMap(); 
map.put(TbsCoreSettings.TBS_SETTINGS_USE_SPEEDY_CLASSLOADER, true); 
map.put(TbsCoreSettings.TBS_SETTINGS_USE_DEXLOADER_SERVICE, true); 
QbSdk.initTbsSettings(map);

(2). 增加Service声明

  1. 在AndroidManifest.xml中增加内核首次加载时优化Service声明。

  2. 该Service仅在TBS内核首次Dex加载时触发并执行dex2oat任务,任务完成后自动结束。

    <service 
    android:name="com.tencent.smtt.export.external.DexClassLoaderProviderService"
    android:label="dexopt"
    android:process=":dexopt" >
    </service>

2. WebView接入

2.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" />

请确保将所有的相关class的包名均按照上述规则替换,以免造成类型强转crash、cookie 设置失败等问题发生。

Tips:您可使用工具进行批量扫描和替换,将脚本放置于根目录并执行脚本即可。下载地址: