| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> Android WebView性能分析与优化 -> 正文阅读 |
|
[移动开发]Android WebView性能分析与优化 |
一、简介一提到App内的WebView加载网页,大家的第一印象就是:慢、耗流量、体验比原生差。但WebView加载网页也有其天生的优势:动态,跨平台,开发周期短。 那能如何解决WebView加载网页慢和体验差的问题呢?可以思考下面两个问题:
二、整体思维导图三、衡量标准快慢是一个相对量,如何衡量WebView的快慢呢? 3.1 用户体验的时间尺度从用户角度来看,如下图是2018年份百度移动端的统计数据: 根据上面的统计折线图,得出如下表格: 可以发现:
3.2 加载时长标准
加载开始很好界定,当用户点击feed流里面的item开始,就开始计时。 加载结束呢?WebView有个WebViewClient#onPageFinished回调方法,这个方法是在页面完全加载结束时候回调的,但是页面DOM渲染完页面就已经有内容,对于用户来说算是页面已经展示出来了。统计加载时长以DOM渲染完更好些。 3.3 统计标准通过收集真正的用户使用数据,才能更好的根据用户的情况进行优化。那如何才能反应用户的真实情况呢? 通常有两种方式:
在们项目进行数据统计时候可以先采用80分位,检测下优化效果,后续再提高要求,使用更高分位如95分位等。 根据现网数据可知,当95分位的用户页面加载时长为1s以内时,80分位的用户页面加载时长为0.35s以内时,APP内网页的体验最佳。 具体最佳时间可以根据真实的上报数据的统计结果进行调整。 四、问题分析前端页展示一般分两种:
现在较多的采用前后端分离的方式,下面都以这种方式为例讲解。 4.1 WebView渲染过程WebView渲染大致需要如下几步:
4.2 WebView耗时统计方法统计可从两方面入手,一是网页层统计,二是App层统计。 4.2.1 网页层统计:WebView中网页耗时统计方法WebView加载url到完全展示出各个部分耗时情况,可以根据w3c标准中网页performance参数获取具体耗时统计参数信息,详细的页面加载过程见下图: 根据performance统计情况可以得出如下数据:
4.2.2 App层统计:App层统计WebView耗时Android可以通过WebViewClient#onPageFinished回调统计页面整个加载时长,开始时间以WebView创建开始算,严格一点可以从feed流中点击item开始算。这个统计只能算整个加载时长,加载到用户可见的时长以DOM渲染完页面为准,后者比前置时长更短一些。前置供参考,以后者为准。 根据上图可以获取的统计数据:
4.3 资讯统计数据测试资讯连接1:测试文章1 测试资讯连接2:测试文章2 五、优化方案从统计数据看,WebView首次加载耗时较多2s左右,二次加载耗时也有0.5s左右。 5.1 离线化同我们现有的离线包一样,将页面用的公共资源html,css,js等模板化,将模板打成压缩包形成离线包内置或动态下发到App端,在App中访问访问到具体的页面时候优先加载本地的模板资源。 通过WebViewClient#shouldInterceptRequest方法拦截WebView的资源加载,匹配到本地模板中的资源就直接加载本地资源,没有匹配本地模板资源再去加载线上资源。genWebResourceResponse用于实现具体的匹配策略。
模板注意事项:
5.2 数据与模板加载5.2.1 并行执行:数据请求与模板加并行虽然进行了本地化网页模板化,但整体的页面加载依然是串行执行的。为了进一步提高页面的加载速度,可以让数据请求由app端代理。使数据加载与模板加载并行执行,待数据加载完成时通过JsBridge回填到网页中。效果如下图: 5.2.2 数据预加载既然数据请求已经由app代理了,当然也可以通过一定的策略预加载数据,当页面打开时候直接使用缓存数据。这样整个网页加载过程完全离线化不受网络影响。 5.3 WebView预创建由上面统计数据可知,WebView创建与二次创建耗时相差甚远,如下图总结: 原因是Webview所有的逻辑处理都是通过WebViewProvider来实现的,它需要加载Webview内核,这是一个重量级的操作,内核是以apk的形式存在。而内核加载后在同一页面是共享的,因此后续的初始化时间就很少了。 可以通过预创建WebView来加速这一过程,预创建会消耗一定量的内存,如何平衡预创建和内存消耗问题还需实践把握衡量,具体方式: WebView池(或统一全局WebView):在app启动时候后台创建WebView池,当app需要展示网页的时候直接拿已创建的WebView,需要在页面销毁时候清除页面数据。池结构如下: 预创建WebView注意事项:
5.4 模板预热经过前面几步处理后,网页加载过程可以实现全部本地化后,但每次打开网页的时候还需要重复加载模板数据。DOM解析耗时,如下图: 为了避免重复加载模板,则需要在WebView池的基础上,让池中的WebView预先加载本地模板。当需要展示网页时候直接拿到已经加载过本地模板的WebView,并通过JsBridge注入数据。池中结构如下: 网页加载的整个过程如下: 5.5 图片加载WebView在加载大量图片时候表现不佳,重复进入时还会重复加载图片,体验不好且浪费浏览。 5.5.1 App代理图片加载该方式需要借助图片加载库如Glide,在WebViewClient#shouldInterceptRequest方法拦截WebView的资源加载,判断要加载的资源url是否为图片,是就走Glide加载并生成加载图片的WebResourceResponse,通过Glide来达到缓存图片目的,避免多次打开页面重复加载线上图片资源,genWebResourceResponse用于实现具体的匹配策略。这种方式有点是不需要前端配合,客户端完全自己处理即可。 在api>=21时,可以通过WebResourceRequest获取请求中的accept字段获取返回值类型,用于区分url类型。
在api<21时,只能通过url来判断来判断类型。
注:示例代码仅展示用,细节需要自己处理 5.5.2 hybrid使用网页和原生控件的混合开发模式,网页中文字部分让WebView渲染,网页中的图片视频等使用原生控件展示。优点即可以避免重复加载图,又能提升图片浏览体验;缺点实现成本高,需要前后端协调处理。今日头条8.0.3版本同样采用了这种方式加载展示图片。 具体思路:
六、总结我们Android项目中WebView还存在较大的优化空间,可以进一步提升资讯、活动页、开户、出入金等h5页面的浏览体验。本文涉及的优化方式仅是方向性的,为后续Android富途牛牛App的WebView优化提供方向性指引,实际操作会涉及到多端配合,细节较多,需要不断迭代优化。 参考文章: Does Page Load Time Really Affect Bounce Rate? |
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 | -2025/1/28 11:41:32- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |