最近公司做活动界面,一直强调网页的加载速度,没办法只能看看能不能有其他办法,这个x5内核网上说挺好用就拿来试试。 SDK是通过共享使用用户手机上微信、手机QQ、空间等软件已经下载好的X5内核,低成本实现对系统webview的替代。该SDK大小只有200+K,接入时仅需修改几行代码。仅仅只需要200的jar包就能提速30%真的是非常的划算的 说下优势吧:
1) 速度快:相比系统webview的网页打开速度有30+%的提升;
2) 省流量:使用云端优化技术使流量节省20+%;
3) 更安全:安全问题可以在24小时内修复;
4) 更稳定:经过亿级用户的使用考验,CRASH率低于0.15%;
5) 兼容好:无系统内核的碎片化问题,更少的兼容性问题;
6) 体验优:支持夜间模式、适屏排版、字体设置等浏览增强功能;
7) 功能全:在Html5、ES6上有更完整支持;
8) 更强大:集成强大的视频播放器,支持视频格式远多于系统webview;
9) 视频和文件格式的支持x5内核多于系统内核
10) 防劫持是x5内核的一大亮点
其中,X5云端服务包括云加速、云安全、云转换三大功能。云加速是通过首屏加速、智能路由、图片压缩等技术保障网页浏览的快、省、悦;云安全是通过代理加密、URL安全检测、JS黑名单管理、负载监控等防范网页被劫持插入广告、保障网页浏览的安全稳定;云转换是使用URL聚合+XPATH的解决方案,解决移动阅读难题。
第一步,下载jar包,并加载到项目中,下载地址
第二步,在xml布局中加入腾讯自定义的WebView。
<com.tencent.smtt.sdk.WebView
android:id="@+id/tbsContent"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
第三步,申请腾讯X5所需权限。
<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" />
第四步,在Activity代码文件中使用:
public class MainActivity extends ActionBarActivity {
com.tencent.smtt.sdk.WebView tbsContent;
private String url = "http://www.91suke.com/s/b9271044";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getWindow().setFormat(PixelFormat.TRANSLUCENT);
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE | WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
initView();
}
private void initView() {
tbsContent = (com.tencent.smtt.sdk.WebView)findViewById(R.id.tbsContent);
tbsContent.loadUrl(url);
WebSettings webSettings = tbsContent.getSettings();
webSettings.setJavaScriptEnabled(true);
tbsContent.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
});
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && tbsContent.canGoBack()) {
tbsContent.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
}
好了,到这一步,连接真机,运行你的Android程序,就可以了。
这里要说下这里有个坑: x5内核暂时不提供64位的so文件,在64位手机上需要让AP以32位模式运行。 所以呢
(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“开头的文件夹。
可参考论坛回复:http://bbs.mb.qq.com/thread-1473368-1-1.html .如果仍未能解决您的问题,请直接在论坛回复并描述您的问题
然后我小小的封装了一下带进度条的webview
/**
* Created by ls on 2017/6/25.
*/
public class ProgressWebview extends WebView {
private ProgressBar progressbar; //进度条
private int progressHeight = 10; //进度条的高度,默认10px
public ProgressWebview(Context context) {
super(context);
initView(context);
}
public ProgressWebview(Context context, AttributeSet attributeSet) {
super(context, attributeSet);
initView(context);
}
private void initView(Context context) {
//开启js脚本支持
getSettings().setJavaScriptEnabled(true);
//创建进度条
progressbar = new ProgressBar(context, null,
android.R.attr.progressBarStyleHorizontal);
//设置加载进度条的高度
progressbar.setLayoutParams(new AbsoluteLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, progressHeight, 0, 0));
Drawable drawable = context.getResources().getDrawable(R.drawable.progressbar_loading);
progressbar.setProgressDrawable(drawable);
//添加进度到WebView
addView(progressbar);
//适配手机大小
getSettings().setUseWideViewPort(true);
getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
getSettings().setLoadWithOverviewMode(true);
getSettings().setSupportZoom(true);
getSettings().setBuiltInZoomControls(true);
getSettings().setDisplayZoomControls(false);
setWebChromeClient(new WVChromeClient());
setWebViewClient(new WVClient());
}
//进度显示
private class WVChromeClient extends WebChromeClient {
@Override
public void onProgressChanged(WebView view, int newProgress) {
if (newProgress == 100) {
progressbar.setProgress(100);
new Handler().postDelayed(new Runnable(){
public void run() {
progressbar.setVisibility(View.GONE);
progressbar.setProgress(0);
}
}, 300);
} else {
if (progressbar.getVisibility() == GONE)
progressbar.setVisibility(VISIBLE);
progressbar.setProgress(newProgress);
}
if (mListener != null) {
mListener.onProgressChange(view, newProgress);
}
super.onProgressChanged(view, newProgress);
}
}
private class WVClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
//在当前Activity打开
view.loadUrl(url);
return true;
}
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
//https忽略证书问题
handler.proceed();
}
@Override
public void onPageFinished(WebView view, String url) {
// progressbar.setVisibility(GONE);
if (mListener != null) {
mListener.onPageFinish(view);
}
super.onPageFinished(view, url);
}
}
private onWebViewListener mListener;
public void setOnWebViewListener(onWebViewListener listener) {
this.mListener = listener;
}
//进度回调接口
public interface onWebViewListener {
void onProgressChange(WebView view, int newProgress);
void onPageFinish(WebView view);
}
}
这里进度条的背景progressbar_loading.xml
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@android:id/background">
<shape>
<gradient
android:angle="0" />
</shape>
</item>
<item android:id="@android:id/secondaryProgress">
<clip>
<shape>
<gradient
android:angle="0"
/>
</shape>
</clip>
</item>
<item android:id="@android:id/progress">
<clip>
<shape>
<gradient
android:angle="0"
android:startColor="#00ccff"
android:endColor="#00ccff" />
</shape>
</clip>
</item>
</layer-list>
然后直接调用
public class MainActivity extends AppCompatActivity {
ProgressWebview tbsContent;
// private String url = "http://www.91suke.com/s/b9271044";
private String url = "http://139.196.208.240:801/wap/about/agreement.aspx";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getWindow().setFormat(PixelFormat.TRANSLUCENT);
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE | WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
initView();
}
private void initView() {
tbsContent = (ProgressWebview) findViewById(R.id.tbsContent);
tbsContent.loadUrl(url);
WebSettings webSettings = tbsContent.getSettings();
webSettings.setJavaScriptEnabled(true);
// tbsContent.setWebViewClient(new WebViewClient() {
// @Override
// public boolean shouldOverrideUrlLoading(WebView view, String url) {
// view.loadUrl(url);
// return true;
// }
// });
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && tbsContent.canGoBack()) {
tbsContent.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
}
当然还有其他的用处,但是我觉得并不是很稳定就没有用了。不过普通的使用还是很稳定的,总体来说增加了200k的大小提高30%的速度还是很划算的。