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里的声明也需要替换,例如:
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里加入权限声明:
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
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的相关操作只能影响系统内核。
第一次启动x5内核浏览器的缓慢的解决方案:
// 在调用TBS初始化、创建WebView之前进行如下配置,以开启优化方案
HashMap
map.put(TbsCoreSettings.TBS_SETTINGS_USE_SPEEDY_CLASSLOADER, true);
QbSdk.initTbsSettings(map);
android:name="com.tencent.smtt.export.external.DexClassLoaderProviderService"
android:label="dexopt"
android:process=":dexopt" >
无法加载x5内核的解决方案
补充说明:线上用户的手机98%都有安装微信(且微信已安装x5内核),您的App接入了TBS后会去共享使用微信的x5内核;往往开发人员的测试手机由于不经常使用微信或者调试原因导致微信没有安装x5内核;另外线上剩余2%的用户没有微信内核源的情况TBS也会在wifi条件下自己下载内核(不过这是小众场景了)。
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微信支付---这个不错