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…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...
leetcode_69.x的平方根
题目如下 : 看到题 ,我们最原始的想法就是暴力解决: for(long long i 0;i<INT_MAX;i){if(i*ix){return i;}else if((i*i>x)&&((i-1)*(i-1)<x)){return i-1;}}我们直接开始遍历,我们是整数的平方根,所以我们分两…...
Java中HashMap底层原理深度解析:从数据结构到红黑树优化
一、HashMap概述与核心特性 HashMap作为Java集合框架中最常用的数据结构之一,是基于哈希表的Map接口非同步实现。它允许使用null键和null值(但只能有一个null键),并且不保证映射顺序的恒久不变。与Hashtable相比,Hash…...
