App模拟下载场景的demo

news2024/12/26 14:23:59

摘要

目的:提供一个稳定的下载场景,可以手动触发和定时触发下载,每次下载相同大小文件,研究下载场景的功耗影响

原理:把电脑当做服务器,手机测试App固定下载电脑存放的某个XXXMB的大文件,基于PowerMonitor进行电流监测和架构侧建立日志与埋点监控下载场景用来研究功耗影响

日志结果:方便以后我们量化某个固定大小的下载文件所需的时长、耗电量大小和平均电流大小,即为量化下载场景功耗提供稳定的测试环境

test.apk,download progress: 100%Download completed. Total time: 41s964ms ms, File size: 315.23 MB, Download speed: 7876810.0 KB/s

实现方法:

1. 测试环境

手机和电脑连接相同的wif 热点

2. 电脑端配置

2.1 电脑端放置用于下载的测试文件

新建文件夹和下载文件 C:\Users\xxx\Desktop\test\test.apk

0

2.2 将电脑变成服务器,让手机通过 WiFi 从电脑下载文件

在C:\Users\xxx\Desktop\test目录下执行:python -m http.server 即可

0

2.2 cmd 窗口下使用:ipconfig,记录下ip地址

将Ip 地址填到:http://10.170.16.162:8000/test.apk

0

2.3 电脑浏览器http://10.170.16.xxx:8000/test.apk输入查看是否可以下载

如果可以下载,则表示电脑已经变成服务器了,接下来实现客户端App的代码就行

0

如果是浏览器下载的cmd窗口会如下打印

0

3. App的下载demo参考用例

3.1 下载代码

基于okhttp3的SDK

implementation("com.squareup.okhttp3:okhttp:4.9.0")import android.content.Contextimport okhttp3.OkHttpClientimport okhttp3.Requestimport okhttp3.ResponseBodyimport java.io.BufferedReaderimport java.io.Fileimport java.io.FileOutputStreamimport java.io.IOExceptionimport java.io.InputStreamimport java.io.InputStreamReaderimport java.net.HttpURLConnectionimport java.net.URL    fun downloadTestFile(context: Context) {        val url = "http://10.170.16.162:8000/test.apk"        val file = File(context.getExternalFilesDir(null), "test.apk")        downloadFile(url, file)    }    fun downloadFile(url: String, file: File) {        val client = OkHttpClient()        val request = Request.Builder().url(url).build()        val startTime = System.currentTimeMillis()        val response = client.newCall(request).execute()        if (!response.isSuccessful) throw IOException("Unexpected code $response")        val responseBody: ResponseBody? = response.body        val inputStream: InputStream? = responseBody?.byteStream()        val outputStream = FileOutputStream(file)        val buffer = ByteArray(4096)        var totalBytesRead: Long = 0        var bytesRead: Int        val fileSize: Long = responseBody?.contentLength() ?: 0        while (inputStream?.read(buffer).also { bytesRead = it ?: -1 } != -1) {            outputStream.write(buffer, 0, bytesRead)            totalBytesRead += bytesRead.toLong()            val progress = (totalBytesRead * 100 / fileSize).toInt()            println(file.name + ",download progress: $progress%")        }        inputStream?.close()        outputStream.close()        val endTime = System.currentTimeMillis()        val totalTime = endTime - startTime        val fileSizeInKB = fileSize        val downloadSpeed = fileSizeInKB / (totalTime / 1000f)        println("Download completed. Total time: ${TimeUtils.formatDuration(totalTime)} ms, " +                "File size: ${ByteUtils.formatBytes(fileSizeInKB)}, Download speed: $downloadSpeed KB/s")    }

3.2 App的下载日志

系统侧如果要监测下载行为,可以另行添加插桩和埋点进行监控,以下主要是app内自行打印

cmd窗口的触发打印

0

App logcat触发打印

从日志可以看出:方便以后我们量化某个固定大小的下载文件所需的时长、耗电量大小和平均电流大小,即为量化下载场景功耗提供稳定的测试环境

0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2181371.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何使用ssm实现校园体育赛事管理系统的设计与实现+vue

TOC ssm713校园体育赛事管理系统的设计与实现vue 绪论 课题背景 身处网络时代,随着网络系统体系发展的不断成熟和完善,人们的生活也随之发生了很大的变化。目前,人们在追求较高物质生活的同时,也在想着如何使自身的精神内涵得…

PE节表中是否存在misc.VirtualSize 比SizeofRawData还要大的情况

确实是存在的,这是win10自带记事本,可以看到 确实是大.所以在申请imagebuffer的时候,还是需要比较大小.但是在还原的时候.只考虑sizeofRawData即可>

【Android 14源码分析】WMS-窗口显示-第一步:addWindow

忽然有一天,我想要做一件事:去代码中去验证那些曾经被“灌输”的理论。                                                                                  – 服装…

项目管理专业资质认证ICB 3中关于项目经理素质的标准

项目管理专业资质认证ICB 3中关于项目经理素质的标准,的确很全面,下面摘录之:

三款专业的英文文献翻译工具,翻译论文不在话下

阅读英文论文文献时免不了要借用一些翻译软件来帮助理解,但因为论文文献的特殊性,普通的翻译软件不能很好的翻译一些专业名词和术语,所以这里给大家分享三款可以胜任文献翻译的专业翻译工具,可以快速准确的完成英文文献翻译工作。…

CDGA|2024年数据治理的六个关键建议

随着数字经济的快速发展,数据已成为企业运营和决策的核心资产。在2024年,做好数据治理对于提升企业的竞争力和运营效率至关重要。以下是六个关键建议,帮助企业有效应对数据治理的挑战。 1. 制定明确的数据治理策略 首先,企业需要…

遥感影像-实例分割数据集:iSAID 从切图到YOLO格式数据集制作详细介绍

背景介绍 开源数据集isaid标注包含实例分割,但是原始影像太大,很吃显存,一般显卡无法用原始影像直接训练,所以需要对影像进行裁剪,并生成对应的标签,因为想用yolo系列跑模型,所以将标签需要转为…

【设计模式-模板】

定义 模板方法模式是一种行为设计模式,它在一个方法中定义了一个算法的骨架,并将一些步骤延迟到子类中实现。通过这种方式,模板方法允许子类在不改变算法结构的情况下重新定义算法中的某些特定步骤。 UML图 组成角色 AbstractClass&#x…

Java 为什么使用 UTF-16 而不是更节省内存的 UTF-8?

Java 选择 UTF-16 编码而不是更节省内存的 UTF-8 这一决定,涉及多个层面的设计权衡,包括历史原因、虚拟机(JVM)实现的复杂度、性能和字符处理的一致性。要理解这个问题,我们需要从 Java 语言的设计初衷、JVM 的工作机制…

C++:笔试题

1.什么是虚函数?什么是纯虚函数? 虚函数是类中的一个成员函数,使用关键字virtual在函数名前声明。 虚函数主要目的是允许子类重写父类中的同名函数,从而实现多态性,并且子函数重写的是虚函数表中的函数。 当通过父类的…

七、添加攻击音效

一、添加动画事件 1、在动画事件中添加音效 2、添加音频组件 3、代码 public void PlayAttackSound() {AudioSource1.PlayOneShot(AudioClip1, SoundValue);//PlayOneShot播放一个音频剪辑(AudioClip)一次 }

Oracle 日志文件多路复用

多路复用 PRODCDB 数据库的所有日志组中的 redo log 文件,存放目录: /u01/app/oracle/oradata/MREDO 1.创建目录 mkdir -p /u01/app/oracle/oradata/MREDO 2.查看日志文件路径 select group#,member from v$logfile; 3.增加日志组文件 alter database a…

ElementUI el-tree 树组件 增加辅助线

需求 项目需求给elementUI的el-tree添加辅助线&#xff0c;并且不能使用其他插件&#xff0c;没办法只能该样式了。 效果 代码 html <template><div><el-scrollbar class"long-content"><el-tree node-key"id":data"deptTre…

《程序猿之Redis缓存实战 · 有序集合类型》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

OpenGL ES 索引缓冲区(4)

OpenGL ES 索引缓冲区(4) 简述 本节会介绍索引缓冲区&#xff0c;索引缓冲区和顶点缓冲区类似&#xff0c;也是显存上的一段内存&#xff0c;只不过上面的数据用处不同&#xff0c;索引缓冲区故名思义里面的数据是用于索引&#xff0c;主要作用是用于复用顶点缓冲区里的数据。…

Kd-tree介绍和使用

GeoHash原理介绍以及在redis中的应用-CSDN博客 这边文章中介绍了GeoHash编码原理以及它的一个应用——利用GeoHash编码可以建立一个索引&#xff0c;从而实现快速的空间搜索。今天&#xff0c;我们介绍一个常见的数据结构Kd-Tree&#xff0c;利用它也可以快速实现多位数据的搜索…

调用智谱AI,面试小助手Flask简单示例

文章目录 1.接入AI获取API密钥Python代码 2.小助手的实现流程3.Flask应用示例Python文件.pyindex.html运行Flask应用地址栏输入 http://localhost:5000/ 1.接入AI 获取API密钥 在智谱AI的官方网站上注册&#xff0c;右上角点击API密钥&#xff0c;新建并复制一个 API Key&…

掌握未来:产品经理学习AI大模型的重要性解析

前言 在AI大模型时代&#xff0c;技术的迅猛进步正在重塑各行各业的面貌。作为产品经理&#xff0c;我们不仅要紧跟时代步伐&#xff0c;更要深入探索与运用这一前沿技术。学习大模型等AI技术&#xff0c;不仅是为了理解其背后的工作原理和应用潜力&#xff0c;更是为了将智能…

天选思路怎能不会!小波变换+CNN完美融合,最新idea发了CV顶会!

今天给大家推荐一个涨点发顶会的好方向&#xff1a;小波变换CNN。这俩热点的结合可以轻松实现“11&#xff1e;2”的效果。 这是因为&#xff0c;一方面小波变换可以作为预处理步骤&#xff0c;提取出关键的局部特征&#xff0c;加速CNN收敛并提升性能&#xff1b;另一方面&am…

配置树莓派打开SSH服务

在树莓派终端中查看IP 在终端中输入命令来查看IP地址。最常用的命令是&#xff1a;hostname -I注意&#xff0c;这里的参数I是大写的&#xff0c;它表示查看本机上所有配置的IP地址&#xff08;包括IPv4和IPv6&#xff0c;如果有的话&#xff09;。如果你只需要查看IPv4地址&am…