Android CPU性能数据获取

简介: 总体CPU获取CPU信息思路Android系统是基于Linux内核的,所以系统文件的结构和Linux下一样,系统总体CPU使用信息放在/proc/stat文件下,/proc/cpuinfo文件存放CPU的其它信息,包括CPU名称,直接读取即可。

总体CPU

获取CPU信息思路

Android系统是基于Linux内核的,所以系统文件的结构和Linux下一样,系统总体CPU使用信息放在/proc/stat文件下,/proc/cpuinfo文件存放CPU的其它信息,包括CPU名称,直接读取即可。

通过proc获取CPU信息:

Linux CPU 九元组参数解析(单位:jiffies): (jiffies是内核中的一个全局变量,用来记录自系统启动一来产生的节拍数,在linux中,一个节拍大致可理解为操作系统进程调度的最小时间片,不同linux内核可能值有不同,通常在1ms到10ms之间)

user 从系统启动开始累计到当前时刻,处于用户态的运行时间,不包含 nice值为负进程。
nice 从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间
system 从系统启动开始累计到当前时刻,处于核心态的运行时间
idle 从系统启动开始累计到当前时刻,除IO等待时间以外的其它等待时间
iowait 从系统启动开始累计到当前时刻,IO等待时间(since 2.5.41)
irq 从系统启动开始累计到当前时刻,硬中断时间(since 2.6.0-test4)
softirq 从系统启动开始累计到当前时刻,软中断时间(since 2.6.0-test4)

可以每1s获取一次CPU信息,分析整机CPU占用率。总的cpu时间totalCpuTime = user + nice + system + idle + iowait + irq + softirq + stealstolen +guest

计算方法

1、 采样两个足够短的时间间隔的Cpu快照,分别记作t1,t2,其中t1、t2的结构均为: (user、nice、system、idle、iowait、irq、softirq、stealstolen、guest)的9元组;

2、 计算总的Cpu时间片totalCpuTime

a) 把第一次的所有cpu使用情况求和,得到s1;

b) 把第二次的所有cpu使用情况求和,得到s2;

c) s2 - s1得到这个时间间隔内的所有时间片,即totalCpuTime = s2 - s1 ;

3、计算空闲时间idle

idle对应第四列的数据,用第二次的idle - 第一次的idle即可 idle = idle2 - idle1

4、计算cpu使用率

CPU总使用率(%) = 100*((totalCputime2- totalCputime1)-(idle2-idle1))/(totalCputime2-totalCputime1)

示例代码

public static long getTotalCpuTime() {
        // 获取系统总CPU使用时间
        String[] cpuInfos = null;
        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new InputStreamReader(
                    new FileInputStream("/proc/stat")), 1000);
            String load = reader.readLine();
            cpuInfos = load.split(" ");
        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        long totalCpu = Long.parseLong(cpuInfos[2])
                + Long.parseLong(cpuInfos[3]) + Long.parseLong(cpuInfos[4])
                + Long.parseLong(cpuInfos[6]) + Long.parseLong(cpuInfos[5])
                + Long.parseLong(cpuInfos[7]) + Long.parseLong(cpuInfos[8]);
        return totalCpu;
    }

应用级CPU

单个应用CPU监控

Emmagee是将选中应用的PID传入,读取/proc/PID/stat文件信息及可获取该PID对应程序的CPU信息。

计算方法

1、首先获取应用的进程id: adb shell ps | grep com.package | awk '{print $2}' > tmp

2、根据进程id,通过proc获取CPU信息 while read line; do adb shell cat /proc/$line/stat | awk '{print $14,$15,$16,$17}' >> appcpu0; done < tmp

说明:以下只解释对我们计算Cpu使用率有用相关参数(14-17列) 参数解释

pid 进程号

utime 该任务在用户态运行的时间,单位为jiffies

stime 该任务在核心态运行的时间,单位为jiffies

cutime 所有已死线程在用户态运行的时间,单位为jiffies

cstime 所有已死在核心态运行的时间,单位为jiffies

结论:进程的总Cpu时间processCpuTime = utime + stime + cutime + cstime,该值包括其所有线程的cpu时间。 之后可以每1s获取一次CPU信息,分析获得app的CPU占用率等信息

单个程序的CPU使用率(%) = 100*(processCpuTime2-processCpuTime1)/(totalCpuTime2-totalCpuTime1)

示例代码

public static long getAppCpuTime(int pid) {
        // 获取应用占用的CPU时间
        String[] cpuInfos = null;
        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new InputStreamReader(
                    new FileInputStream("/proc/" + pid + "/stat")), 1000);
            String load = reader.readLine();
            cpuInfos = load.split(" ");
        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        long appCpuTime = Long.parseLong(cpuInfos[13])
                + Long.parseLong(cpuInfos[14]) + Long.parseLong(cpuInfos[15])
                + Long.parseLong(cpuInfos[16]);
        return appCpuTime;
    }
}
目录
相关文章
|
11天前
|
XML 存储 JSON
51. 【Android教程】JSON 数据解析
51. 【Android教程】JSON 数据解析
21 2
|
3天前
|
编解码 安全 Android开发
探索iOS与Android开发的差异:从界面到性能
【6月更文挑战第10天】在移动应用开发的广阔天地中,iOS和Android两大平台各占山头,它们在设计理念、用户体验、性能优化等方面展现出独特的魅力。本文将深入探讨这两大系统在开发过程中的主要差异,从用户界面设计到性能调优,揭示各自背后的技术逻辑与创新策略,为开发者提供全面的视角和实用的开发指南。
|
7天前
|
JSON 编解码 Apache
Android中使用HttpURLConnection实现GET POST JSON数据与下载图片
Android中使用HttpURLConnection实现GET POST JSON数据与下载图片
11 1
|
11天前
|
XML 存储 JavaScript
50. 【Android教程】xml 数据解析
50. 【Android教程】xml 数据解析
10 1
|
14天前
|
缓存 Android开发 开发者
安卓系统优化:提升手机性能的秘诀
【5月更文挑战第31天】本文将探讨如何通过一系列简单的步骤和技巧,对安卓系统进行优化,以提升手机的性能。我们将从清理无用文件、管理后台应用、调整系统设置等方面入手,帮助你的安卓设备运行更加流畅。
|
15天前
|
缓存 监控 Android开发
提升安卓应用性能的实用策略
【5月更文挑战第31天】 在移动设备愈发普及的今天,用户对安卓应用的性能要求也越来越高。一个流畅、响应迅速的应用能够显著提高用户体验和满意度。本文将深入探讨影响安卓应用性能的关键因素,并提出一系列实用的优化策略。从内存管理到代码效率,从UI渲染到网络通信,我们将逐一解析每个环节的性能瓶颈,并给出相应的解决方案。通过这些策略的实施,开发者可以显著提升应用的性能,为用户提供更加流畅和高效的使用体验。
19 0
|
15天前
|
缓存 监控 数据库
提升安卓应用性能的十大技巧
【5月更文挑战第30天】 在竞争激烈的应用市场中,一个流畅、高效的应用体验是吸引和保留用户的关键。对于安卓开发者来说,优化应用的性能是一个持续的挑战。本文将深入探讨十个实用的技巧来提升安卓应用的性能,包括内存管理、UI渲染、多线程处理等关键领域。这些技巧不仅有助于改善应用的响应速度和稳定性,还能确保在不同设备上的兼容性和效率。通过实践这些策略,开发者能够为用户提供更加流畅和愉悦的使用体验。
|
16天前
|
移动开发 Java Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【5月更文挑战第29天】 在移动开发领域,性能优化一直是开发者追求的关键目标。随着Kotlin在Android开发中的普及,了解其与传统Java语言在性能方面的差异成为一项重要议题。本文通过深入分析和对比两种语言的运行效率、启动时间以及内存消耗,为开发者在选择编程语言时提供数据支持和实践指南,从而帮助他们构建更加高效的Android应用。
|
16天前
|
缓存 Java 数据库
提升安卓应用性能的实用策略
【5月更文挑战第29天】 在竞争激烈的移动市场中,一个流畅且响应迅速的应用程序是获得用户青睐的关键。本文将探讨针对安卓平台的性能优化技巧,从内存管理到多线程处理,从布局优化到高效的资源利用,旨在帮助开发者构建更高效、更稳定的应用体验。通过分析常见的性能瓶颈并提供解决方案,我们的目标是使应用启动更快、响应更迅捷,同时减少电量消耗,确保最终用户拥有最佳的使用体验。
|
17天前
|
监控 测试技术 Android开发
提升安卓应用性能的实用策略
【5月更文挑战第29天】 在竞争激烈的应用市场中,性能优化是提升用户体验和保持应用竞争力的关键。本文将探讨针对安卓平台的性能优化技巧,包括内存管理、多线程处理、UI渲染效率以及电池寿命优化等方面。我们将深入分析每种策略的原理,并通过实例说明如何实现这些优化措施,帮助开发者构建更快速、更流畅的安卓应用。