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、内存、流量 的相关文章

  • 获取CPU温度

    我想知道CPU的温度 以下是我使用 C 和 WMI 所做的工作 我正在读取 MSAcpi ThermalZoneTemperature 但它始终相同 而且根本不是 CPU 温度 有没有办法不用写驱动就能获取CPU的真实温度 或者有什么我可以
  • 编译器实际上会生成机器代码吗?

    我一直在读到 在大多数情况下 如 gcc 编译器以高级语言读取源代码并吐出相应的机器代码 现在 机器代码的定义是处理器可以直接理解的代码 因此 机器代码应该仅依赖于机器 处理器 且独立于操作系统 但这种情况并非如此 即使 2 个不同的操作系
  • 用于查找 UNIX 计算机上 CPU 信息的命令

    您知道是否有一个 UNIX 命令可以告诉我 Sun OS UNIX 机器的 CPU 配置是什么 我也在尝试确定内存配置 有没有 UNIX 命令可以告诉我这一点 AFAIK 没有标准的 Unix 命令 我没有使用过Sun OS 但是在Linu
  • 运行 Android Studio gradle 构建时如何使用所有 CPU 核心/线程?

    我正在 Android Studio 中寻找参数或配置 Gradle 它可以设置构建 以便在构建期间使用我的所有 CPU 核心 即 如果我有一个四核 CPU 并且每个核心运行 8 个线程 我如何优化构建 以便它将使用它可以获得的所有资源 当
  • 如何通过.NET Core查找物理CPU核心数(不是逻辑SMT超线程)?

    我想检测实际物理核心的数量 而不是逻辑核心的数量 因为当更多线程竞争私有每核心缓存时 工作负载会出现负扩展 和 或具有足够高的 IPC 每个核心运行多个逻辑线程不会吞吐量的增加超过线程开销的增加 特别是对于无法完美扩展到大量内核的问题 或者
  • 执行长字传输到 CPU 需要多少个周期和大小

    该任务针对架构 ColdFire 处理器 MCF5271 我不明白执行到 CPU 的长字传输或字传输需要多少个周期以及什么大小的周期 我正在阅读图表 但不明白其中有何联系 非常感谢任何评论 我附上了两个例子和答案 数据总线大小 https
  • 如何在 iOS 设备上运行 .app [关闭]

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

    是否有任何小工具可以让我访问 Intel CPU 计数器收集的数据 例如 L1 L2 缓存未命中 分支预测失败 您知道现代 Core2 CPU 上有数百个此类数据 它必须在 Windows 上运行 同时能够在 Solaris FreeBSD
  • 如何在Python中模拟CPU和内存压力

    我想知道是否有人用 python 编写了模拟 cpu 和内存压力的代码 我看到一段加载 cpu 的代码 但如何强制它们在 90 的使用率下工作 一个节点主要有 4 种经常使用的资源 有效内存 中央处理器周期 储存空间 网络负载 上传和下载
  • C linux相当于windows QueryPerformanceCounter

    Linux 中是否有等效的 C 函数用于读取 CPU 计数器及其频率 我正在寻找类似于 QueryPerformanceCounter 函数的东西 该函数读取现代 CPU 中的 64 位计数器 clock gettime 2 http li
  • 多处理和并行处理之间的比较

    有人能告诉我多处理和并行处理之间的确切区别吗 我有点困惑 感谢您的帮助 多重处理 多重处理是使用两个或多个中央处理单元 单个计算机系统中的 CPU 该术语还指 系统支持多个处理器和 或的能力 在他们之间分配任务的能力 并行处理 在计算机中
  • k8s hpa无法获取cpu信息[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我设置了 hpa 使用命令 sudo kubectl autoscale deployment e7 build 64 cpu perce
  • java中获取某些进程的cpu使用率的正确命令行是什么

    给定进程 ID 在 Java 中从进程获取当前 cpu 使用情况的正确命令是什么 命令 typeperf Memory Available bytes processor total process time 不适用于特定进程 并且任何第
  • 阿迪和苏比之间到底是什么“关系”?

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

    我有一个用 C 编写的程序 每秒运行多个 for 循环 而不使用任何会使其因任何原因等待的东西 它始终使用 2 10 的 CPU 有没有什么方法可以强制它使用更多的CPU并进行更多的计算而不使程序变得更复杂 此外 我在 Windows 计算
  • 就 size_t 而言,“目标平台上最大可能对象的大小”是多少

    我正在阅读有关的文章size t在 C C 中http web archive org web 20081006073410 http www embedded com columns programmingpointers 2009001
  • 测量进程消耗的 CPU 时钟

    我用 C 语言编写了一个程序 它是作为研究结果创建的程序 我想计算程序消耗的确切 CPU 周期 精确的循环次数 知道我怎样才能找到它吗 The valgrind tool cachegrind valgrind tool cachegrin
  • 找出 CPU 时钟频率(每个内核、每个处理器)

    像 CPUz 这样的程序非常擅长提供有关系统的深入信息 总线速度 内存时序等 但是 是否有一种编程方法可以计算每个核心 以及每个处理器 在每个 CPU 具有多个核心的多处理器系统中 频率 而无需处理 CPU 特定信息 我正在尝试开发一个反作
  • prometheus中每个节点的CPU使用率

    理想情况下 我必须找出每个节点上 Pod 的 CPU 使用率百分比 但我试图找出每个节点的CPU使用率 我已经编写了查询 但它给了我超过 100 可以是 150 200 即使包含多个 cpu 的情况 我取了平均值 您能帮我理解下面的查询有什
  • 从 Java 内部限制 CPU

    我在这个 和其他 论坛中看到了许多具有相同标题的问题 但似乎没有一个问题能完全解决我的问题 就是这个 我有一个 JVM 它占用了托管它的机器上的所有 CPU 我想限制它 但是我不能依赖任何限制工具 技术external到 Java 因为我无

随机推荐

  • 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