app专项性能测试——获取手机cpu、内存、流量

2023-05-16

1、Cpu获取

了解过腾讯GT工具的源码,他们用的是通过读取/proc/stat的数据,将每一个核的cpu使用跟闲置数据提取。使用率永远是增量式计算。计算方法为100*(cpu忙时增量-cpu整体增量),从计算方法来看,可能会导致负数出现。 getProcessCpuUsage:计算进程的CPU使用率,主要通过"/proc/" + pid + "/stat"来计算,在这里回京过一系列计算,拿到进程的CPU时间片。这样的方式比较麻烦,但是兼容性可能会好一些。下面方法是直接adb shell top -n来找到应用的top信息,直接取cpu那一列的数

// 获取手机指定packagename的cpu占比
    public static String getCPU(String PackageName) {

        String Cpu = null;
        try {

            Runtime runtime = Runtime.getRuntime();
            Process proc = runtime.exec("adb shell top -n 1| grep " + PackageName);
            try {
                if (proc.waitFor() != 0) {
                    System.err.println("exit value = " + proc.exitValue());
                }
                BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
                StringBuffer stringBuffer = new StringBuffer();
                String line = null;
                while ((line = in.readLine()) != null) {
                    stringBuffer.append(line + " ");

                }

                String str1 = stringBuffer.toString();
//                System.out.println("返回是#####"+str1);
                // 以空格区分正则
                String[] toks = str1.split(" +");
/// /            String str2 = str1.substring(str1.indexOf(" " + PackageName) - 46, str1.indexOf(" " + PackageName));
                Cpu = toks[4];
//                System.out.println("当前进程的cpu占用是*** " + Cpu );

            } catch (InterruptedException e) {
                System.err.println(e);
            } finally {
                try {
                    proc.destroy();
                } catch (Exception e2) {
                }
            }
        } catch (Exception StringIndexOutOfBoundsException) {

            System.out.println("请检查设备是否连接");

        }

        return Cpu;

    }

2、内存获取

adb shell dumpsys meminfo|grep packagename

public static double getMemory(String PackageName) {

        double Heap = 0;

        try {
            Runtime runtime = Runtime.getRuntime();
            Process proc = runtime.exec("adb shell dumpsys meminfo|grep " + PackageName);
            try {
                if (proc.waitFor() != 0) {
                    System.err.println("exit value = " + proc.exitValue());
                }
                BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
                StringBuffer stringBuffer = new StringBuffer();
                String line = null;
                while ((line = in.readLine()) != null) {
                    stringBuffer.append(line + " ");

                }

                String str1 = stringBuffer.toString();
                String str2 = str1.substring(str1.indexOf(": "+PackageName) - 12, str1.indexOf(": "+PackageName)).trim();
                String str3 = str2.substring(0, str2.indexOf("K"));
                str3 = str3.trim().replace(",","");
                Heap = Double.parseDouble(str3) / 1024;
                DecimalFormat df = new DecimalFormat("#.000");
                String memory = df.format(Heap);
                Heap = Double.parseDouble(memory);
                System.out.println(Heap + "MB");
            } catch (InterruptedException e) {
                System.err.println(e);
            } finally {
                try {
                    proc.destroy();
                } catch (Exception e2) {
                }
            }
        }

        catch (Exception StringIndexOutOfBoundsException) {
            System.out.print("请检查设备是否连接");

        }
        return Heap;
    }

3、获取流量

通过看 /proc/$pid/net/dev,查看应用流量使用情况。wlan0: 一行显示了接受、发送流量的字节数,把两个相加就是app累计消耗的流量(bytes),除以1024得到kbps。打开手机飞行模式、会使该数据清零。

下面通过时间查计算流量,两次获取流量除以时间(下面用的是1秒,所以得到的每秒消耗流量 kbps/s)

public static double getFlowAction(String PackageName) {
        double flowAction = 0;
        try {

            String Pid = PID(PackageName);

            Runtime runtime = Runtime.getRuntime();
            Process proc = runtime.exec("adb shell cat /proc/" + Pid + "/net/dev");
            try {
                if (proc.waitFor() != 0) {
                    System.err.println("exit value = " + proc.exitValue());
                }
                BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
                StringBuffer stringBuffer = new StringBuffer();
                String line = null;
                while ((line = in.readLine()) != null) {
                    stringBuffer.append(line + " ");

                }
                String str1 = stringBuffer.toString();
                String str2 = str1.substring(str1.indexOf("wlan0:"), str1.indexOf("wlan0:") + 100);
//                System.out.println("先获取的句子  " + str2);
//              空格分成字符串数组取第2个,第10个数,分别是发送流量和接受流量
                String[] toks = str2.split(" +");
                String str4 = toks[1];
                String str6 = toks[9];
                int b = Integer.parseInt(str4);
                int a = Integer.parseInt(str6);

                double sendFlow = a / 1024 ;
                double revFlow = b / 1024 ;
                flowAction = sendFlow + revFlow;
                System.out.println("当前应用使用流量为: " + flowAction + "Kbps");
            } catch (InterruptedException e) {
                System.err.println(e);
            } finally {
                try {
                    proc.destroy();
                } catch (Exception e2) {
                }
            }
        } catch (Exception StringIndexOutOfBoundsException) {
            System.out.println("请检查设备是否连接");

        }

        return flowAction;
    }

    public static double getFlow() {
        double flow = 0;
        double flowbefore = 0;
        double flowafter = 0;
        flowbefore = getFlowAction("com.umetrip.android.msky.app");
        try {
            sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        flowafter = getFlowAction("com.umetrip.android.msky.app");
        flow = flowafter - flowbefore;
        return flow;
    }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

app专项性能测试——获取手机cpu、内存、流量 的相关文章

  • R:如何检查可用的核心数/CPU 使用率

    R 是单线程的 使用 R 如何检查 Windows 和 Linux 中运行 R 的核心 线程数 或者正在运行多少卢比 使用R 如何检查Windows和Linux中运行R的每个核心的使用情况 或者每个 R 使用的 CPU 百分比 例如 如果我
  • vCPU 是否可以使用两台不同硬件计算机的不同 CPU

    我搜索过这个问题 但似乎没有得到公平的答案 假设我不想创建一个具有 vCPU 的虚拟机 并且该 vCPU 必须有 10 个核心 但我只有 2 台计算机 每台计算机有 5 个物理 CPU 核心 是否可以通过依赖这两个物理 CPU 来创建一个
  • 了解CPU寄存器

    我是汇编语言的初学者 并试图理解这些都是如何工作的 我的问题可能看起来很愚蠢 但无论如何 我不太清楚 考虑以下简单的程序 section text global start start mov eax text mov val eax mo
  • sched_getcpu() 相当于 OS X 吗?

    在 OS X 上 有没有办法找出线程正在哪个 CPU 上运行 Linux 的等效函数是调度获取CPU http man7 org linux man pages man3 sched getcpu 3 html 获取当前处理器编号 http
  • 基准测试 - 如何计算发送到 CPU 的指令数以查找消耗的 MIPS

    假设我有一个软件并想使用黑盒子 https en wikipedia org wiki Black box testing方法 我有一个 3 0GHz CPU 有 2 个插槽和 4 个核心 如您所知 为了找出每秒指令数 IPS 我们必须使用
  • 批处理文件获取 CPU 温度(°C)并设置为变量

    我如何获取批处理文件来计算 CPU 的温度并将其作为变量返回 我知道这是可以做到的 因为我已经看到它已经完成了 该解决方案可以使用任何外部工具 我在谷歌上搜索了至少两个小时 但一无所获 任何人都可以帮忙吗 谢谢 您可以使用wmic exe
  • 第一个计算机程序是如何创建的? [复制]

    这个问题在这里已经有答案了 可能的重复 第一个编译器是如何编写的 https stackoverflow com questions 1653649 how was the first compiler written 这个问题一直困扰着我
  • 您的CPU不支持VT-x

    我已经创建了 AVD 但是当我尝试运行 android 程序时 它显示 错误 您的CPU不支持VT x 我在 BIOS 中启用了虚拟化技术 但当我尝试运行 Android 程序时仍然出现此错误 有两种情况 使用VMware 进入 WM gt
  • FreeBSD v8.1 上的 /proc/cpuinfo 相当于什么?

    相当于Linux的什么 proc cpuinfo在 FreeBSD v8 1 上 我的应用程序读取 proc cpuinfo并将信息保存在日志文件中 我该怎么做才能在 FreeBSD 上记录类似的信息 一个样品 proc cpuinfo看起
  • 如何在 iOS 设备上运行 .app [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有应用程序的 app 文件 我有 mac 和 iPhone 但没有安装 Xcode 如何在没有 Xcode 的情况下在 iPhone 上
  • 使CPU的缓存失效

    当我的程序执行具有获取语义的加载操作 具有释放语义的存储操作或可能是完整栅栏时 它会使 CPU 的缓存无效 我的问题是 缓存的哪一部分实际上失效了 只有保存我使用的获取 释放变量的缓存行 或者整个缓存都失效了 L1 L2 L3 等等 当我使
  • Java限制资源使用

    有没有办法限制java使用的核心数量 同样 是否有可能限制该核心的使用量 您可以在 Linux 上使用任务集 您还可以降低进程的优先级 但除非 CPU 繁忙 否则进程将获得尽可能多的 CPU 我有一个将线程专用于核心的库 称为 Java T
  • iOS:无法启动 .app 文件

    我不知道为什么它在我的 app 文件中寻找目录 每次我运行应用程序时 它都会在 iPhone 上安装应用程序 但不会运行并给出以下错误 谁能告诉我这个设置存储在哪里 谢谢 error failed to launch Users xxx L
  • GCC对读/写指令的重新排序

    Linux 的同步原语 自旋锁 互斥锁 RCU 使用内存屏障指令来强制内存访问指令重新排序 这种重新排序可以由 CPU 本身完成 也可以由编译器完成 有人可以展示一些 GCC 生成的代码示例 其中完成了此类重新排序吗 我主要对 x86 感兴
  • 为什么每个逻辑 CPU 在多线程情况下都有自己的 CR3 寄存器?

    当我们有一个支持某种形式的多线程的 CPU 时 每个逻辑 CPU 都有它自己的一组寄存器 至少 包括 CR3 寄存器 由于我们在执行不同线程时正在处理同一进程的虚拟地址空间 并且永远不会发生上下文切换 切换同一进程的线程时TLB缓存也不会失
  • 如何获取 Java7 应用程序的 CPU、RAM 和网络使用情况

    我找到了这篇旧文章如何在 Java 中监控计算机的 cpu 内存和磁盘使用情况 https stackoverflow com questions 47177 how to monitor the computers cpu memory
  • Linux:如何对系统内存施加负载?

    我正在开发一个小功能 它可以让我的用户了解 CPU 的占用情况 我在用着cat proc loadavg 它返回众所周知的 3 个数字 我的问题是 当我正在开发时 CPU 目前没有做任何事情 有没有一种好方法可以在CPU上产生一些负载 我在
  • 阿迪和苏比之间到底是什么“关系”?

    我应该回答这个问题 经过一番研究后发现 add 和 sub 具有相同的操作码 仅在功能领域有所不同 这是答案还是其他什么 Update Nios II CPU 手册中提供了它 subi subtract immediate Operatio
  • python 进程占用 100% CPU

    我正在尝试运行 python 应用程序并根据指定的时间间隔执行操作 下面的代码持续消耗 100 的 CPU def action print print hello there interval 5 next run 0 while Tru
  • 就 size_t 而言,“目标平台上最大可能对象的大小”是多少

    我正在阅读有关的文章size t在 C C 中http web archive org web 20081006073410 http www embedded com columns programmingpointers 2009001

随机推荐

  • MacOS 日历和群晖日历同步问题解决

    问题 xff1a 一直不能建立 群晖日历 账户 xff08 但可以订阅 xff09 2021 08 23 群晖日历和MAC日历不能同步问题 2021 08 23提示错误 xff1a 发生错误 xff0c 错误 1 解决 xff1a 1 主要
  • sudo apt-get install gcc-4.4 g++-4.4 g++-4.4-multilib

    问题 xff1a sudo apt get install gcc 4 4 g 43 43 4 4 g 43 43 4 4 multilib 正在读取软件包列表 完成 正在分析软件包的依赖关系树 正在读取状态信息 完成 没有可用的软件包 g
  • 如何修改电脑的MAC地址?

    常见的修改方式为修改有线的MAC地址 xff0c 本文主要讲述如何修改有限MAC地址 xff1b 首先第一步让电脑通过网线和交换机相连接 xff0c 这样才可以看到能够修改的网卡 xff1b 图中为未连接网线时的网络连接状态 xff0c 如
  • C#RabbitMQ消息队列的使用

    C RabbitMQ消息队列的使用 概念 1 消息 Message 消息指的是两个应用之间传递的数据 其中数据的类型可以有很多的形式 xff0c 可能只是包含文本字符串的一条消息 xff0c 也可能时一个嵌入的对象 2 消息队列 Meaas
  • 基础篇:03-SpringCloud工程部署启动

    目录 1 工程搭建部署 方案一 xff1a 完整工程导入 方案二 xff1a 从零开始搭建 1 工程与module创建 2 数据库导入 3 项目启动 3 1 启动并访问user service 3 2 启动并访问order service
  • TS常见面试题

    type和接口interface的区别 type和interface都可以用来定义类型 xff0c 都可以定义对象和函数 xff1b 都可以继承或扩展其他类型 xff0c 但语法不一样 xff1b 都支持泛型 不同点 xff1a type可
  • 36个JavaScript实用函数

    JavaScript 是一个很复杂的语言 xff0c 很多新手在使用它开发应用的时候会发现很多功能无从下手 有了我根据功能分类总结的 36 个 JavaScript 技巧 xff0c 复制粘贴一键搞定 xff01 帮助你提高开发效率 快速解
  • vim 实现批量注释

    vim 实现批量注释 第一种方法 批量插入字符快捷键 xff1a Ctrl 43 v进入VISUAL BLOCK xff08 可视块 xff09 模式 xff0c 按 j xff08 向下选取列 xff09 或者 k xff08 向上选取列
  • linux sh脚本无法执行

    有可能是该sh文件不是直接在linux上创建的 xff0c 实在外部新建 xff0c 导致无法识别 解决 xff1a 在linux上新建一个sh文件 xff0c 并执行chmod 755 lt sh文件 gt 即可 sh文件执行命令 xff
  • pycharm远程通过SSH调用linux环境下的python

    最近博主在帮老师做项目 xff0c 因为更习惯使用windows系统 xff0c 平常没少花时间在配置环境上 在linux环境安装各类环境库的方便程度要远远高于window环境下 xff0c 但是每次都要在远程连接服务器或者打开虚拟机未免有
  • Ubuntu14.04 Chrome闪退问题

    具体表现 xff1a 打开Chrome后等待大约两分钟自动崩溃退出 解决方案 xff1a sudo apt install reinstall libnss3
  • 群晖note station client 闪退(Mac OS Monterey)

    问题 xff1a 升级后如题 解决 xff1a 下载官方Bug 修正版 xff0c 覆盖安装 xff01 ftp Synology RackStation 出处 xff1a Note Station Client not working o
  • 美化VScode终端(报错信息用不同颜色区分)

    在PythonXY Lib site packages xff08 Anaconda位置为envs XX PythonXY site packages xff09 中添加sitecustomize py xff0c 内容如下 xff1a i
  • ActiveMQ教程之二:queue和topic的使用

    文章目录 三 基本的使用1 JMS编码总体规范2 Destination简介3 队列消息生产者消费者入门案例4 TOPIC消息生产者消费者入门案例 三 基本的使用 1 JMS编码总体规范 JMS Java 消息中间件的服务接口规范 xff0
  • Vnc viewer连接超时的问题

    转载地址 xff1a https blog csdn net yzg2010a article details 37994145 服务器打开了 vncserver但是vnc viewer无法连接 xff0c 连接超时 原因 xff1a 服务
  • jtag不识别

    win10电脑装了两版vivado xff0c 2017和2021 xff0c 突然有一天要用JTAG的时候发现不识别 xff0c 设备管理器显示如下 xff1a 用vivado自动连接 xff0c 显示如下 xff1a Xicom 50
  • Linux安装jdk1.8和配置环境变量

    每次感觉配这个都很简单 xff0c 但每次都要查一下 xff0c 毕竟配错一点 后面都比较麻烦 xff0c 记录一下 xff0c 方便以后查看 linux 下安装jdk和windows下的安装是一样的 xff0c 之前在windows安装的
  • 一段比较浅显易懂的java识别pdf 文字及图片

    使用pdfbox及orc进行pdf文件的文字及图片的识别 pom设置相关依赖 lt pdf相关依赖开始 gt lt dependency gt lt groupId gt org apache pdfbox lt groupId gt lt
  • 制作多系统启动U盘

    多系统启动U盘制作 制作过系统启动盘的人都知道 xff0c 一个U盘只要被制作成启动盘后 xff0c 里面的文件将是杂乱无章的 xff0c 抛开我们的强迫症不说 xff0c 主要是这有失我们的逼格 xff0c 不符合我们作为 会装系统 的大
  • app专项性能测试——获取手机cpu、内存、流量

    1 Cpu获取 了解过腾讯GT工具的源码 xff0c 他们用的是通过读取 proc stat的数据 xff0c 将每一个核的cpu使用跟闲置数据提取 使用率永远是增量式计算 计算方法为100 xff08 cpu忙时增量 cpu整体增量 xf