Flutter 与 Android 原生 WebView 对比

前言

自从 google 推出 flutter 跨平台开发框架以来,flutter 在各个技术论坛里被炒得如日中天。

说到跨平台开发,就不得不提 WebView,WebView 可以说是最廉价的跨平台开发方案。我们知道,flutter 可以和 native 混合开发,它们可以互相调用。那么当我们进行混合开发的时候,如果需要使用 WebView,我们应该调用原生的 WebView 还是使用 flutter 自己实现 WebView 呢?如果用 flutter 自己实现 WebView,它的性能与 native 相比如何呢?今天我们就以 android 为例从几个不同的维度来实际测试一下!

Flutter 实现 WebView

flutter 官方是没有 WebView 组件的,不过强大的 flutter-community 论坛考虑到广大开发者的需求,开发了 flutter_webview_plugin 插件,方便在 flutter 中使用使用 WebView。

集成方式很简单,在 pubspec.yaml 文件中:

dependencies:
  flutter:
    sdk: flutter
  flutter_webview_plugin: ^0.3.0+2

接下来所有的对比都是基于 Android 原生的 WebView 和 flutter_webview_plugin 插件,为了严谨,并未对第三方 WebView 作对比。

测试手机:小米8SE
系统:Android 8.1.0

加载速度对比

测试网页打开的速度,只需要获取 WebView 在开始加载网页和网页加载完成时的时间戳,时间戳的差即为打开网页的时间,我们分别在 Android 原生和 flutter 中的相应位置打印 log:

webView?.webViewClient = object : WebViewClient() {
    override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
        Log.d(TAG, "onPageStarted:" + System.currentTimeMillis())
        super.onPageStarted(view, url, favicon)
    }

    override fun onPageFinished(view: WebView?, url: String?) {
        Log.d(TAG, "onPageFinished:" + System.currentTimeMillis())
        super.onPageFinished(view, url)
    }
}
flutterWebViewPlugin.onStateChanged.listen((state) {
  if (state.type == WebViewState.finishLoad) {
    print('finishLoad:' + DateTime.now().millisecondsSinceEpoch.toString());
    setState(() {
      isLoad = false;
    });
  } else if (state.type == WebViewState.startLoad) {
    print('startLoad:' + DateTime.now().millisecondsSinceEpoch.toString());
    setState(() {
      isLoad = true;
    });
  }
});

为了使差异更明显,我们选择较为复杂的 新浪首页 进行加载的对比,为了减小网络对加载速度的影响,我们让手机连接同一个网络,分别进行 10 次测试然后取平均值,另外,我们需要关闭 WebView 的缓存,防止缓存对加载速度产生影响:

webView?.settings?.cacheMode = WebSettings.LOAD_NO_CACHE
WebviewScaffold(
  key: _scaffoldKey,
  url: widget.url,
  clearCache: true,
  appCacheEnabled: false,
  .
  .
  .
);

下面使笔者进行 10 次测试所得到的数据:

Android WebView flutter_webview_plugin
0 2731 2442
1 2502 2623
2 2747 2422
3 2652 2323
4 2553 2596
5 2645 2379
6 2670 2342
7 2691 2218
8 3773 2429
9 2631 2453
avg 2759.5 2421.7

可以发现,相同环境下 flutter_webview_plugin 的加载速度比 native WebView 略快,但是差异不明显,基本可以忽略。

结论:flutter_webview_plugin 的加载速度比 native WebView 略快。

内存占用对比

可以使用 AndroidStudio 自带的 profiler 工具来进行占用内存的测试,我们在 flutter 程序中同时集成调用 native WebView 和 flutter_webview_plugin 来打开淘宝首页和新浪首页的方法,在程序刚运行的时候内存占用如下图:

然后用 WebView 打开淘宝首页:

用 flutter_webview_plugin 打开淘宝首页:

可以发现,用 WebView 打开淘宝首页内存基本无变化,但是用 flutter_webview_plugin 打开淘宝首页内存有明显的增加,且波动较大。

结论:flutter_webview_plugin 相对 native WebView 而言,占用内存较大。

HTML5 兼容性对比

可以在 html5test 中对浏览器的兼容性进行评分,通过测试发现 native WebView 和 flutter_webview_plugin 的得分分别如下:

|

|

发现在小米8SE手机上,native WebView 和 flutter_webview_plugin 的 html5 兼容性得分都是 501。

结论:native WebView 和 flutter_webview_plugin 的 html5 兼容性无明显差异。

总结

我们对 native WebView 和 flutter_webview_plugin 分别进行了网页加载速度、占用内存和 html5 兼容性作了对比,发现 native WebView 占用内存更小,网页加载速度和 html5 的兼容性无明显差异。

在实际使用中,由于 flutter_webview_plugin 并不存在于 widget 树中,所以不能在 flutter_webview_plugin 中使用如 snackbars, dialogs...这些通知交互 widget。但是 flutter_webview_plugin 具有跨平台的优势,如果需要同时 flutter 项目中同时在 Android 和 iOS 端使用 WebView,建议使用 flutter_webview_plugin,否则,建议使用 native WebView。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270