Android H5页面性能分析策略
文章目录
- 引言
- 一、拦截资源加载请求以优化性能
- 二、通过JavaScript代码监控资源下载速度
- 三、使用vConsole进行前端性能调试
- 四、使用Chrome DevTools调试Android端
- 五、通过抓包分析优化网络性能
- 六、总结
引言
在移动应用开发中,H5页面的性能直接影响到用户体验。本文将详细介绍如何在Android环境下,通过拦截资源加载请求、注入JavaScript代码、使用vConsole工具以及抓包分析等方法,对H5页面的性能进行分析和优化。
一、拦截资源加载请求以优化性能
在Android的WebView中,可以通过覆盖WebViewClient的shouldInterceptRequest方法来拦截每个资源的加载请求。然后,我们可以自己处理这个请求,例如通过HttpURLConnection或者OkHttp来下载资源,并计算下载速度。
以下是基本示例:
webView.setWebViewClient(new WebViewClient() {@Nullable@Overridepublic WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {// 获取请求的URLString url = request.getUrl().toString();try {// 使用HttpURLConnection或者OkHttp来处理请求HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();// 记录开始时间long startTime = System.currentTimeMillis();// 连接并获取响应connection.connect();InputStream inputStream = connection.getInputStream();// 计算下载速度long endTime = System.currentTimeMillis();long duration = endTime - startTime;int contentLength = connection.getContentLength();double speed = (double) contentLength / duration; // 这是字节/毫秒,可能需要转换为更合适的单位// 创建并返回WebResourceResponsereturn new WebResourceResponse(connection.getContentType(), connection.getContentEncoding(), inputStream);} catch (IOException e) {// 处理错误return null;}}
});
上面代码只是基本示例,需要根据实际需求来修改和优化这个代码。例如,可能需要处理各种网络错误,或者在一个单独的线程中处理网络请求以避免阻塞UI线程。
二、通过JavaScript代码监控资源下载速度
我们可以通过注入JavaScript代码来监控H5页面的资源下载速度,但这可能会比较复杂,并且可能不适用于所有情况。
在HTML5中,有一个叫做Navigation Timing API的接口,它可以提供关于页面加载性能的详细信息,包括每个资源的加载时间。可以通过注入JavaScript代码来获取这些信息。
在JavaScript中,window.performance.timing和window.performance.getEntriesByType('resource')返回的对象包含了许多有用的属性。
window.performance.timing返回一个PerformanceTiming对象,它包含了与页面加载相关的各个阶段的时间戳。例如:
navigationStart: 导航开始的时间。domLoading: 开始解析DOM树的时间。domInteractive: 完成解析DOM树的时间,此时所有的脚本都被执行完,但资源(如图片)可能还没有加载完成。domContentLoadedEventEnd:DOMContentLoaded事件结束的时间。loadEventEnd:load事件结束的时间,此时页面及所有依赖的资源都已完成加载。
window.performance.getEntriesByType('resource')返回一个数组,每个元素是一个PerformanceResourceTiming对象,它包含了与一个特定资源加载相关的信息。例如:
name: 资源的URL。initiatorType: 资源的类型(例如"script"、“link”、"img"等)。duration: 资源加载的总时间。responseEnd: 从请求开始到接收到响应的最后一个字节的时间。
我们可以在JavaScript代码中处理这些数据,例如计算平均加载时间,找出加载时间最长的资源,等等。然后,可以将这些数据转换为JSON格式,通过WebView.evaluateJavascript的回调函数返回给Java代码。
以下是基本示例:
webView.setWebViewClient(new WebViewClient() {@Overridepublic void onPageFinished(WebView view, String url) {// 页面加载完成后,注入JavaScript代码来获取性能数据view.evaluateJavascript("(function() {" +"var performance = window.performance;" +"var timing = performance.timing;" +"var resources = performance.getEntriesByType('resource');" +"var data = {" +"'timing': timing," +"'resources': resources.map(function(resource) {" +"return {" +"'name': resource.name," +"'type': resource.initiatorType," +"'duration': resource.duration," +"'responseEnd': resource.responseEnd" +"};" +"})" +"};" +"return JSON.stringify(data);" +"})()",new ValueCallback<String>() {@Overridepublic void onReceiveValue(String value) {// 在这里处理返回的JSON数据}});}
});
在这个示例中,JavaScript代码首先获取PerformanceTiming和PerformanceResourceTiming的数据,然后将这些数据转换为一个JSON字符串。然后,这个JSON字符串被返回给Java代码,我们可以在ValueCallback.onReceiveValue方法中处理这个字符串。
三、使用vConsole进行前端性能调试
vConsole是一个轻量级、可扩展的前端开发者工具,可以用它在移动端web页面上模拟类似Chrome开发者工具的功能,包括监控网络请求、查看console日志、查看元素属性等。
要在Android的WebView中使用vConsole,需要先将vConsole的脚本文件添加到项目中,然后在页面加载完成后注入这个脚本。
以下是基本示例:
webView.setWebViewClient(new WebViewClient() {@Overridepublic void onPageFinished(WebView view, String url) {// 页面加载完成后,注入vConsole的脚本injectScriptFile(view, "vconsole.min.js");}private void injectScriptFile(WebView view, String scriptFile) {InputStream input;try {input = getAssets().open(scriptFile);byte[] buffer = new byte[input.available()];input.read(buffer);input.close();// 字符串编码为UTF-8String encoded = Base64.encodeToString(buffer, Base64.NO_WRAP);view.evaluateJavascript("(function() {" +"var parent = document.getElementsByTagName('head').item(0);" +"var script = document.createElement('script');" +"script.type = 'text/javascript';" +"script.innerHTML = window.atob('" + encoded + "');" +"parent.appendChild(script)" +"})()", null);} catch (IOException e) {// 处理异常}}
});
在这个示例中,injectScriptFile方法读取vConsole的脚本文件,然后将其编码为Base64格式,然后通过evaluateJavascript方法将其注入到页面中。
然后,我们就可以在页面上看到vConsole的控制台,可以用它来查看console日志、网络请求、元素属性等信息,帮助我们监控和调试页面的性能。
注意,需要确保vConsole的脚本文件已经添加到项目的assets目录中,而且WebView的JavaScript功能已经开启(通过webView.getSettings().setJavaScriptEnabled(true))。
四、使用Chrome DevTools调试Android端
使用Chrome DevTools调试Android端的H5页面是一个相对直接的过程。以下是具体步骤:
-
在Android设备上安装并打开Chrome浏览器:在Android设备上安装最新版本的Chrome浏览器,并确保它是打开状态。
-
在Android设备上启用开发者选项和USB调试:首先,需要在设备的"设置"中找到"关于手机"或"关于设备",然后连续点击"版本号"或"构建号"七次,这样就可以启用"开发者选项"。然后,可以在"开发者选项"中启用"USB调试"。
-
使用USB线连接Android设备和开发机:需要使用USB线将Android设备连接到开发机。
-
在开发机上打开Chrome DevTools:可以在Chrome浏览器的地址栏输入
chrome://inspect,然后按回车键打开Chrome DevTools。 -
在Chrome DevTools中选择你的设备:在"chrome://inspect/#devices"页面,应该能看到你的Android设备和设备上打开的Chrome标签页。可以点击"inspect"链接来打开一个DevTools窗口,用来调试选中的标签页。
-
在DevTools窗口中调试H5页面:现在可以像在桌面浏览器中一样,使用DevTools窗口中的各种工具来调试H5页面。例如,可以使用"Elements"面板来查看和修改DOM,使用"Network"面板来查看网络请求,使用"Console"面板来查看和执行JavaScript代码,等等。
注意,如果在DevTools窗口中修改了H5页面,这些修改只会影响当前的标签页,不会影响Android设备上的其他标签页。如果刷新页面或关闭标签页,这些修改就会丢失。
五、通过抓包分析优化网络性能
抓包分析是一种常用的网络性能分析方法,可以帮助我们了解H5页面的加载过程和性能瓶颈。以下是使用抓包工具(如Wireshark或Charles)来分析Android H5页面性能的基本步骤:
-
设置代理:首先,我们需要在Android设备或模拟器上设置一个HTTP代理。代理的地址和端口应该设置为抓包工具的地址和端口。
-
开始抓包:然后,在抓包工具上开始抓包。我们应该能够看到Android设备或模拟器上的所有HTTP和HTTPS请求。
-
加载H5页面:在Android设备或模拟器上加载H5页面。我们应该能够在抓包工具上看到所有的网络请求。
-
分析数据:我们可以分析抓包数据来了解H5页面的加载过程。例如,可以查看每个请求的时间,找出加载时间最长的请求,查看HTTP状态码等。
注意,如果需要抓取HTTPS请求,可能需要在Android设备或模拟器上安装抓包工具的证书。
此外,抓包只能提供网络层面的性能数据,如果需要更详细的性能数据(例如JavaScript执行时间,DOM渲染时间等),可能需要使用其他工具或方法,例如Chrome DevTools,Performance API等。
六、总结
通过以上方法,我们可以从多个角度对Android H5页面的性能进行分析和优化,从而提高用户体验。
相关文章:
Android H5页面性能分析策略
文章目录 引言一、拦截资源加载请求以优化性能二、通过JavaScript代码监控资源下载速度三、使用vConsole进行前端性能调试四、使用Chrome DevTools调试Android端五、通过抓包分析优化网络性能六、总结 引言 在移动应用开发中,H5页面的性能直接影响到用户体验。本文…...
【前端面试】Typescript
Typescript面试题目回答 Typescript有哪些常用类型? Typescript的常用类型包括: 基本类型:boolean(布尔类型)、number(数字类型)、string(字符串类型)。特殊类型:nul…...
程序语言的内存管理:垃圾回收GC(Java)、手动管理(C语言)与所有权机制(Rust)(手动内存管理、手动管理内存)
文章目录 程序语言的内存管理:垃圾回收、手动管理与所有权机制引言一、垃圾回收机制(GC)(Java)1. 什么是垃圾回收机制2. 垃圾回收的工作原理3. 优点与缺点4. 示例代码 二、手动管理内存的分配和释放(C语言&…...
研究生论文学习记录
文献检索 检索论文的网站 知网:找论文,寻找创新点paperswithcode :这个网站可以直接找到源代码 直接再谷歌学术搜索 格式:”期刊名称“ 关键词 在谷歌学术搜索特定期刊的关键词相关论文,可以使用以下几种方法&#…...
毕业设计选题:基于Django+Vue的图书馆管理系统
开发语言:Python框架:djangoPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 系统首页 图书馆界面 图书信息界面 个人中心界面 后台登录界面 管理员功能界面 用户…...
#网络安全#NGSOC与传统SOC的区别
NGSOC是Next Generation Security Operation Center(下一代安全运营中心)的缩写。 NGSOC安全运营服务基于态势感知与安全运营平台来开展监测分析等一系列的服务工作,旨在通过专业、高效的运营服务工作,帮助用户尽可能发挥NGSOC作…...
GCN+BiLSTM多特征输入时间序列预测(Pytorch)
目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 GCNBiLSTM多特征输入时间序列预测(Pytorch) 可以做风电预测,光伏预测,寿命预测,浓度预测等。 Python代码,基于Pytorch编写 1.多特征输入单步预测…...
LinkedList和链表之刷题课(下)
1. 给定x根据x把链表分割,大的结点放在x后面,小的结点放在x前面 题目解析: 注意此时的pHead就是head(头节点的意思) 基本上就是给定一个链表,我们根据x的值来把这个链表分成俩部分,大的那部分放在x后面,小的那部分放在x前面,并且我们不能改变链表本来的顺序,比如下面的链表,我…...
ollama 在 Linux 环境的安装
ollama 在 Linux 环境的安装 介绍 他的存在在我看来跟 docker 的很是相似,他把市面上已经存在的大语言模型集合在一个仓库中,然后通过 ollama 的方式来管理这些大语言模型 下载 # 可以直接通过 http 的方式吧对应的 shell 脚本下载下来,然…...
C语言二刷指针篇
&取得变量的地址 printf("%p\n", &a); printf("%p\n", a); printf("%p\n", &a[0]); printf("%p\n", &a[1]); 前三个输出相同,a[0]和a[1]之间相差4 指针就是保存地址的变量,指针里放的是别的…...
LeetCode题练习与总结:回文对--336
一、题目描述 给定一个由唯一字符串构成的 0 索引 数组 words 。 回文对 是一对整数 (i, j) ,满足以下条件: 0 < i, j < words.length,i ! j ,并且words[i] words[j](两个字符串的连接)是一个回文…...
CesiumJS 案例 P7:添加指定长宽的图片图层(原点分别为图片图层的中心点、左上角顶点、右上角顶点、左下角顶点、右下角顶点)
CesiumJS CesiumJS API:https://cesium.com/learn/cesiumjs/ref-doc/index.html CesiumJS 是一个开源的 JavaScript 库,它用于在网页中创建和控制 3D 地球仪(地图) 一、添加指定长宽的图片图层(原点为图片图层的中心…...
Redis 主从同步 问题
前言 相关系列 《Redis & 目录》(持续更新)《Redis & 主从同步 & 源码》(学习过程/多有漏误/仅作参考/不再更新)《Redis & 主从同步 & 总结》(学习总结/最新最准/持续更新)《Redis &a…...
【SQL Server】探讨 IN 和 EXISTS之间的区别
前言 在使用 SQL 查询相关表数据时,通常需要根据另一个表中的值来筛选数据。而 IN 与 EXISTS 子句都是用于此场景的常用方式,但使用时两者存在工作方式不同。它们使用上的选择会显著影响查询的性能,尤其是在大型数据集中。本文我们一起探讨 IN 和 EXISTS 之间的区别、使用与…...
清理pip和conda缓存
当用户目录没有空间时,可清理pip和conda缓存 清理conda缓存: conda clean --all清理pip缓存: pip cache purgeNote: 可以利用软链接,将用户目录下的文件链接到其他位置 首先移动文件或文件夹到其他位置 mv ~/test /…...
git rebase和merge的区别
Git merge和Git rebase是两种不同的合并策略,它们在处理分支合并时有各自的优点和缺点。 Git fetch git fetch 命令用于从远程仓库获取最新的更改,但不会自动合并这些更改到你的本地分支。它会下载远程仓库的所有分支和标签,并更新你的本地…...
【elkb】linux麒麟v10安装ELKB 8.8.X版本(ARM架构)
下载软件 相关版本信息 elasticsearch:8.8.1kibana:8.8.1logstash:8.8.1filebeat:8.8.1 下载地址 https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.8.1-linux-aarch64.tar.gzhttps://artifacts.elastic…...
bluez hid host介绍,连接键盘/鼠标/手柄不是梦,安排
零. 前言 由于Bluez的介绍文档有限,以及对Linux 系统/驱动概念、D-Bus 通信和蓝牙协议都有要求,加上网络上其实没有一个完整的介绍Bluez系列的文档,所以不管是蓝牙初学者还是蓝牙从业人员,都有不小的难度,学习曲线也相对较陡,所以我有了这个想法,专门对Bluez做一个系统…...
GPT打数模——电商品类货量预测及品类分仓规划
背景 电商企业在各区域的商品存储主要由多个仓库组成的仓群承担。其中存储的商品主要按照属性(品类、件型等)进行划分和打标,便于进行库存管理。图 1 是一个简化的示意图,商品品类各异,件数众多,必须将这些…...
华为OD机试 - 螺旋数字矩阵 - 矩阵(Python/JS/C/C++ 2024 D卷 100分)
华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Python/JS/C/C)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...
毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...
