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…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...

无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...

c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...
vue3 daterange正则踩坑
<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...

jdbc查询mysql数据库时,出现id顺序错误的情况
我在repository中的查询语句如下所示,即传入一个List<intager>的数据,返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致,会导致返回的id是从小到大排列的,但我不希望这样。 Query("SELECT NEW com…...