App模拟下载场景的demo

摘要

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

原理:把电脑当做服务器,手机测试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.mzph.cn/pingmian/55136.shtml

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

相关文章

C语言进阶版第14课—内存函数

文章目录 1. memcpy函数的使用和模拟实现1.1 memcpy函数的使用1.2 模拟实现memcpy函数 2. memmove函数的使用和模拟实现2.1 memmove函数的使用2.2 memmove函数的模拟实现 3. memset函数4. memcmp函数 1. memcpy函数的使用和模拟实现 1.1 memcpy函数的使用 memcpy函数的原形voi…

英语音标与重弱读

英语中,比较重要的是音标。但事实上,我们对音标的学习还是比较少的,对它的理解也是比较少的。 一、音标 2个半元音 [w][j] 5个长元音:[i:] [ə:] [ɔ:] [u:] [ɑ:] 7个短元音:[i] [ə] [ɔ] [u] [] [e] [ʌ] 8个双元音…

leetcode-32. 最长有效括号

题目描述 给你一个只包含 ( 和 ) 的字符串,找出最长有效(格式正确且连续)括号 子串 的长度。 示例 1: 输入:s "(()" 输出:2 解释:最长有效括号子串是 "()"示例 2&…

压力测试指南-压力测试基础入门

压力测试基础入门 在当今快速迭代的软件开发环境中,确保应用程序在高负载情况下仍能稳定运行变得至关重要。这正是压力测试大显身手的时刻。本文将带领您深入了解压力测试的基础知识,介绍实用工具,并指导您设计、执行压力测试,最…

ffmpeg 结合 opencv 显示ps流文件

存储的ps 流文件如何显示 使用ffmpeg 和 opencv 做demo 结合opencv 和 ffmpeg 显示ps文件 // showps.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 //#include <iostream> #include <opencv2/opencv.hpp>extern "C" { #inc…

【openwrt-21.02】T750 openwrt switch划分VLAN之后网口插拔状态异常问题分析及解决方案

Openwrt版本 NAME="OpenWrt" VERSION="21.02-SNAPSHOT" ID="openwrt" ID_LIKE="lede openwrt" PRETTY_NAME="OpenWrt 21.02-SNAPSHOT" VERSION_ID="21.02-snapshot" HOME_URL="https://openwrt.org/" …

第100+26步 ChatGPT学习:概率校准 Bayesian Binning into Quantiles

基于Python 3.9版本演示 一、写在前面 最近看了一篇在Lancet子刊《eClinicalMedicine》上发表的机器学习分类的文章&#xff1a;《Development of a novel dementia risk prediction model in the general population: A large, longitudinal, population-based machine-learn…

【2】图像视频的加载和显示

文章目录 【2】图像视频的加载和显示一、代码在哪写二、创建和显示窗口&#xff08;一&#xff09;导入OpenCV的包cv2&#xff08;二&#xff09;创建窗口&#xff08;三&#xff09;更改窗口大小 & 显示窗口&#xff08;四&#xff09;等待用户输入补充&#xff1a;ord()函…

Gateway和VirtualService

在 Istio 服务网格中&#xff0c;Gateway 和 VirtualService 是两个关键的配置对象&#xff0c;它们分别用于定义入站流量的接入点和路由规则。下面详细介绍这两个配置对象的功能及其相互关系。 Gateway Gateway 是 Istio 中用于定义入站流量接入点的配置对象。它描述了外部流…

正则表达式的使用规则

1.介绍 正则表达式&#xff08;Regular Expression&#xff09;是一种强大的文本模式匹配工具&#xff0c;它使用单个字符串来描述、匹配一系列符合某个句法规则的字符串搜索模式。正则表达式可以用于文本搜索、文本替换等场景。 2.基本语法 正则表达式由普通字符&#xff0…

vue框架学习-- 父子页面 参数方法调用

一、父组件向子组件传递参数 在Vue中&#xff0c;父组件向子组件传递参数是一种非常常见的通信方式&#xff0c;这通常通过props来实现。props允许父组件向子组件传递数据&#xff0c;并且这些数据是单向的&#xff0c;即子组件不能直接修改由父组件传递的数据。但是&#xff…

【Unity踩坑】Unity更新Google Play结算库

一、问题描述&#xff1a; 在Google Play上提交了app bundle后&#xff0c;提示如下错误。 我使用的是Unity 2022.01.20f1&#xff0c;看来用的Play结算库版本是4.0 查了一下文档&#xff0c;Google Play结算库的维护周期是两年。现在需要更新到至少6.0。 二、更新过程 1. 下…

【视频目标分割-2024CVPR】Putting the Object Back into Video Object Segmentation

Cutie 系列文章目录1 摘要2 引言2.1背景和难点2.2 解决方案2.3 成果 3 相关方法3.1 基于记忆的VOS3.2对象级推理3.3 自动视频分割 4 工作方法4.1 overview4.2 对象变换器4.2.1 overview4.2.2 Foreground-Background Masked Attention4.2.3 Positional Embeddings 4.3 Object Me…

cpp,git,unity学习

c#中的? 1. 空值类型&#xff08;Nullable Types&#xff09; ? 可以用于值类型&#xff08;例如 int、bool 等&#xff09;&#xff0c;使它们可以接受 null。通常&#xff0c;值类型不能为 null&#xff0c;但是通过 ? 可以表示它们是可空的。 int? number null; // …

使用 SSH 连接 Docker 服务器:IntelliJ IDEA 高效配置与操作指南

使用 SSH 连接 Docker 服务器&#xff1a;IntelliJ IDEA 高效配置与操作指南 本文详细介绍了如何在 2375 端口未开放的情况下&#xff0c;通过 SSH 连接 Docker 服务器并在 Idea 中进行开发。通过修改用户权限、生成密钥对以及配置 SSH 访问&#xff0c;用户可以安全地远程操作…

NASA数据集:ATLAS/ICESat-2 L3B 每日和每月网格化海冰自由面高度,第 4 版

目录 简介 摘要 代码 引用 网址推荐 0代码在线构建地图应用 机器学习 ATLAS/ICESat-2 L3B Daily and Monthly Gridded Sea Ice Freeboard, Version 4 简介 ATLAS/ICESat-2 L3B Daily and Monthly Gridded Sea Ice Freeboard, Version 4数据是由NASA的ATLAS&#xff08…

Ubuntu 系统崩了,如何把数据拷下来

问题描述&#xff1a; Linux系统中安装输入法后&#xff0c;重启后&#xff0c;导致系统无法进入&#xff0c;进入 recovery mode下的resume 也启动不了&#xff0c;所以决定将需要的东西复制到U盘 解决方案&#xff1a; 1.重启ubuntu&#xff0c;随即点按Esc进入grub菜单&am…

OpenStack Yoga版安装笔记(十五)Horizon安装

1、官方文档 OpenStack Installation Guidehttps://docs.openstack.org/install-guide/ 本次安装是在Ubuntu 22.04上进行&#xff0c;基本按照OpenStack Installation Guide顺序执行&#xff0c;主要内容包括&#xff1a; 环境安装 &#xff08;已完成&#xff09;OpenStack…

HarmonyOS/OpenHarmony Audio 实现音频录制及播放功能

关键词&#xff1a;audio、音频录制、音频播放、权限申请、文件管理 在app的开发过程中时常会遇见一些需要播放一段音频或进行语音录制的场景&#xff0c;那么本期将介绍如何利用鸿蒙 audio 模块实现音频写入和播放的功能。本次依赖的是 ohos.multimedia.audio 音频管理模块&am…

AI日常绘画【国庆海报】:盛世迎华诞,Flux国庆节海报制作教程

大家好我是极可菌&#xff01;&#xff01;&#xff01; 马上就要到祖国母亲的节日了&#xff0c;想想心里都美滋滋的&#xff0c;终于可以放松一下了。相信AI绘画关于国庆主题肯定也会精彩纷呈吧&#xff0c;今天和大家分享几组关于国庆海报的制作教程。 本文使用基于Flux的相…