如何读取CPU“;统计数据“;用Java从安卓手机下载?
我试图通过核心计算出CPU的使用率,如果可能的话,可能是temp,并且通常计算出我可以从CPU读取什么 我已经做了一些搜索,我有一些返回核心数的代码(请参阅)。现在,我正试图从这个链接()中找出如何使用它来获取内核的CPU使用率 唯一的问题是我对Java/Android有点陌生,所以我很难理解评论者想说什么。有一条评论说,您应该更改idle1和cpu1上的分隔符……我对idle2和cpu2也这样做吗?任何帮助都将不胜感激,因此提前感谢您 现在我有了一个更好的方法来理解我在做什么,但是我的4核测试板上的2-4核都是0。有时,当我启动应用程序时,core 2的值大于0,但在后续运行时(应用程序每秒更新一次值),它会返回到0。这是我目前拥有的代码,非常感谢如何读取CPU“;统计数据“;用Java从安卓手机下载?,java,android,Java,Android,我试图通过核心计算出CPU的使用率,如果可能的话,可能是temp,并且通常计算出我可以从CPU读取什么 我已经做了一些搜索,我有一些返回核心数的代码(请参阅)。现在,我正试图从这个链接()中找出如何使用它来获取内核的CPU使用率 唯一的问题是我对Java/Android有点陌生,所以我很难理解评论者想说什么。有一条评论说,您应该更改idle1和cpu1上的分隔符……我对idle2和cpu2也这样做吗?任何帮助都将不胜感激,因此提前感谢您 现在我有了一个更好的方法来理解我在做什么,但是我的4核测试
public double readUsage(int corenum) {
int j=0;
int coreVal = getNumCores();
String[] toks;
long idle1;
long cpu1;
long idle2;
long cpu2;
try {
RandomAccessFile reader = new RandomAccessFile("/proc/stat", "r");
String load = reader.readLine();
reader.seek(0);
while (j <= corenum){
load = reader.readLine();
j++;
}
j=0;
toks = load.split(" ");
if (corenum == 0) {
idle1 = Long.parseLong(toks[5]);
cpu1 = Long.parseLong(toks[2]) + Long.parseLong(toks[3]) + Long.parseLong(toks[4])
+ Long.parseLong(toks[6]) + Long.parseLong(toks[7]) + Long.parseLong(toks[8]);
}
else {
idle1 = Long.parseLong(toks[4]);
cpu1 = Long.parseLong(toks[1]) + Long.parseLong(toks[2]) + Long.parseLong(toks[3])
+ Long.parseLong(toks[5]) + Long.parseLong(toks[6]) + Long.parseLong(toks[7]);
}
try {
Thread.sleep(100);
} catch (Exception e) {}
reader.seek(0);
while (j <= corenum){
load = reader.readLine();
j++;
}
j=0;
reader.close();
toks = load.split(" ");
if (corenum == 0) {
idle2 = Long.parseLong(toks[5]);
cpu2 = Long.parseLong(toks[2]) + Long.parseLong(toks[3]) + Long.parseLong(toks[4])
+ Long.parseLong(toks[6]) + Long.parseLong(toks[7]) + Long.parseLong(toks[8]);
}
else {
idle2 = Long.parseLong(toks[4]);
cpu2 = Long.parseLong(toks[1]) + Long.parseLong(toks[2]) + Long.parseLong(toks[3])
+ Long.parseLong(toks[5]) + Long.parseLong(toks[6]) + Long.parseLong(toks[7]);
}
return (double)(cpu2 - cpu1) / ((cpu2 + idle2) - (cpu1 + idle1));
} catch (IOException ex) {
ex.printStackTrace();
}
return 9999999;
}
public双读用法(int-corenum){
int j=0;
int coreVal=getNumCores();
字符串[]toks;
长时间闲置1;
长cpu1;
长时间闲置2;
长cpu2;
试试{
RandomAccessFile reader=新的RandomAccessFile(“/proc/stat”,“r”);
字符串加载=reader.readLine();
reader.seek(0);
而(j您可以使用此答案中的代码:
如注释中所述,您可以跳过第一行以获取每个核心的数据
根据下面的注释,您可以阅读文件的每一行并打印用法,然后按照提供的链接拆分这些行:
public void printCpuUsages()
{
try
{
RandomAccessFile reader = new RandomAccessFile("/proc/stat", "r");
String load = reader.readLine();
while (load != null)
{
Log.d("CPU", "CPU usage: " + load);
load = reader.readLine();
}
}
catch (IOException ex)
{
ex.printStackTrace();
}
}
尽管答案似乎是正确的,我还是创建了一个小解析器来帮助人们提取“proc/stat”的信息
公共类Cpu{
私有字符串名称=”;
专用长cpu_用户=0;
专用长cpu_niced=0;
专用长cpu_系统=0;
专用长cpu_空闲=0;
专用长cpu_iowait=0;
专用长cpu_irq=0;
专用长cpu_softirqs=0;
公共Cpu(字符串名称、长Cpu\u用户、长Cpu\u niced、长Cpu\u系统、长Cpu\u空闲、长Cpu\u iowait、长Cpu\u irq、长Cpu\u软件irq){
this.name=名称;
this.cpu\u user=cpu\u user;
this.cpu\u niced=cpu\u niced;
this.cpu\u system=cpu\u system;
this.cpu\u idle=cpu\u idle;
this.cpu\u iowait=cpu\u iowait;
this.cpu\u irq=cpu\u irq;
this.cpu_softirqs=cpu_softirqs;
}
公共长getCpuUser(){
返回cpu_用户;
}
公共长getCpuNiced(){
返回cpu_niced;
}
公共长getCpuSystem(){
返回cpu_系统;
}
公共长getCpuIdle(){
返回cpu_空闲;
}
公共长getCpuIowait(){
返回cpu_iowait;
}
公共长getCpuIrq(){
返回cpu_irq;
}
公共长getCpuSoftirqs(){
返回cpu_软件;
}
public double getAverageIdlePercentage(){
返回(cpu_空闲*100)/(cpu_用户+cpu_加密+cpu_系统+cpu_空闲+cpu_iowait+cpu_irq+cpu_软件irq);
}
公共字符串getName(){
返回名称;
}
公共字符串toString(){
字符串temp=“”;
temp+=名称+“”;
温度+=cpu_用户+“”;
温度+=cpu_niced+“”;
温度+=cpu_系统+“”;
温度+=cpu_空闲+“”;
温度+=cpu_iowait+“”;
温度+=cpu_irq+“”;
temp+=cpu_softirqs+“”;
返回温度;
}
}
公共类固定文件{
/**
*第一行“cpu”汇总了所有其他“cpuN”行中的数字。
*这些数字表示CPU执行不同类型工作所花费的时间。时间单位为用户赫兹或千分之一秒(通常为百分之一秒)。
*/
私有列表CPU;
/**
*对于每个可能的系统中断,自启动时起提供服务的中断计数。第一列是提供服务的所有中断的总数;随后的每列是该特定中断的总数。
*/
私人名单中断;
/**
*跨所有CPU的上下文切换的总数。
*/
私有长ctxt=0;
/**
*系统启动的时间
*/
私人约会时间;
/**
*创建的进程和线程的数量,包括(但不限于)通过调用fork()和clone()系统调用创建的进程和线程。
*/
私有长进程=0;
/**
*当前在CPU上运行的进程数
*/
私有长进程运行=0;
/**
*当前被阻止、等待I/O完成的进程数
*/
私有长进程阻塞=0;
私人名单软件;
公共StatFile(){
CPU=新的ArrayList();
中断=新建ArrayList();
ctxt=0;
b时间=新日期();
进程=0;
procs_running=0;
procs_blocked=0;
softirq=newarraylist();
}
公共列表getCPU(){
返回CPU;
}
公共无效设置CPU(列出CPU){
this.cpus=CPU;
}
公共列表getInterruptions(){
返回中断;
}
公共中断(列表中断){
这个。中断=中断;
}
公共长getCtxt(){
返回ctxt;
}
公共无效setCtxt(长ctxt){
this.ctxt=ctxt;
}
公共日期getBtime(){
返回b时间;
}
公共时间(日期时间){
this.btime=btime;
}
公共长getprocesss(){
返回过程;
}
公共进程(长进程){
这个过程=过程;
}
公共长getProcs_正在运行(){
返回正在运行的进程;
}
public void setProcs_运行(长进程运行){
this.procs\u running=procs\u running;
}
公共长getProcs_阻塞(){
返回进程被阻止;
}
公共无效设置进程被阻止(长进程被阻止){
this.procs\u blocked=procs\u blocked;
}
公共列表getSoftirq(){
返回软irq;
}
公共无效setSoftirq(列表软件IRQ){
this.softirq=softirq;
}
}
CpuUtils类:
public class CpuUtils {
private static final String TAG = CpuUtils.class.getSimpleName();
/**
* Normal processes executing in user mode
*/
private static final int CPU_USER=1;
/**
* Niced processes executing in user mode
*/
private static final int CPU_NICE=2;
/**
* Processes executing in kernel mode
*/
private static final int CPU_SYSTEM=3;
/**
* Twiddling thumbs
*/
private static final int CPU_IDLE=4;
/**
* Waiting for I/O to complete
*/
private static final int CPU_IOWAIT=5;
/**
* Servicing interrupts
*/
private static final int CPU_IRQ=6;
/**
* Servicing softirqs
*/
private static final int CPU_SOFTIRQS=7;
public static StatFile parseStatsFile() {
StatFile statFile = new StatFile();
try {
RandomAccessFile reader = new RandomAccessFile("/proc/stat", "r");
try {
while (true) {
String load = reader.readLine();
//Avoid problem parsing doble space
if(load!=null) {
Log.d(TAG, "Stat: " + load);
load = load.replace(" ", " ");
String[] tokens = load.split(" ");
if (tokens[0].startsWith("cpu")) {
Cpu cpu = parseCpuTokens(tokens);
statFile.getCpus().add(cpu);
}
else if(tokens[0].startsWith("intr")){
for(int i=1; i<tokens.length; i++){
statFile.getInterruptions().add(Long.parseLong(tokens[i]));
}
}
else if(tokens[0].startsWith("ctxt")){
statFile.setCtxt(Long.parseLong(tokens[1]));
}
else if(tokens[0].startsWith("btime")){
//time is in seconds, therefore we need it in milliseconds
statFile.setBtime(new Date(Long.parseLong(tokens[1])*1000));
}
else if(tokens[0].startsWith("processes")){
statFile.setProcesses(Long.parseLong(tokens[1]));
}
else if(tokens[0].startsWith("procs_running")){
statFile.setProcs_running(Long.parseLong(tokens[1]));
}
else if(tokens[0].startsWith("procs_blocked")){
statFile.setProcs_blocked(Long.parseLong(tokens[1]));
}
else if(tokens[0].startsWith("softirq")){
for(int i=1; i<tokens.length; i++){
statFile.getSoftirq().add(Long.parseLong(tokens[i]));
}
}
}
else{
throw new EOFException("File end reached");
}
}
} catch (EOFException ex) {
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}catch (FileNotFoundException e){
e.printStackTrace();
throw new IllegalStateException("Unable to access the stats");
}
return statFile;
}
private static Cpu parseCpuTokens(String[] tokens){
Cpu cpu = new Cpu(tokens[0],
Long.parseLong(tokens[CPU_USER]),
Long.parseLong(tokens[CPU_NICE]),
Long.parseLong(tokens[CPU_SYSTEM]),
Long.parseLong(tokens[CPU_IDLE]),
Long.parseLong(tokens[CPU_IOWAIT]),
Long.parseLong(tokens[CPU_IRQ]),
Long.parseLong(tokens[CPU_SOFTIRQS]));
return cpu;
}
}
公共类CpuUtils{
私有静态最终字符串标记=CpuUtils.class.getSimpleName();
/**
*在用户模式下执行的正常进程
*/
专用静态最终int CPU_用户=1;
/**
*在用户模式下执行的Niced进程
*/
私有静态最终整数
public class CpuUtils {
private static final String TAG = CpuUtils.class.getSimpleName();
/**
* Normal processes executing in user mode
*/
private static final int CPU_USER=1;
/**
* Niced processes executing in user mode
*/
private static final int CPU_NICE=2;
/**
* Processes executing in kernel mode
*/
private static final int CPU_SYSTEM=3;
/**
* Twiddling thumbs
*/
private static final int CPU_IDLE=4;
/**
* Waiting for I/O to complete
*/
private static final int CPU_IOWAIT=5;
/**
* Servicing interrupts
*/
private static final int CPU_IRQ=6;
/**
* Servicing softirqs
*/
private static final int CPU_SOFTIRQS=7;
public static StatFile parseStatsFile() {
StatFile statFile = new StatFile();
try {
RandomAccessFile reader = new RandomAccessFile("/proc/stat", "r");
try {
while (true) {
String load = reader.readLine();
//Avoid problem parsing doble space
if(load!=null) {
Log.d(TAG, "Stat: " + load);
load = load.replace(" ", " ");
String[] tokens = load.split(" ");
if (tokens[0].startsWith("cpu")) {
Cpu cpu = parseCpuTokens(tokens);
statFile.getCpus().add(cpu);
}
else if(tokens[0].startsWith("intr")){
for(int i=1; i<tokens.length; i++){
statFile.getInterruptions().add(Long.parseLong(tokens[i]));
}
}
else if(tokens[0].startsWith("ctxt")){
statFile.setCtxt(Long.parseLong(tokens[1]));
}
else if(tokens[0].startsWith("btime")){
//time is in seconds, therefore we need it in milliseconds
statFile.setBtime(new Date(Long.parseLong(tokens[1])*1000));
}
else if(tokens[0].startsWith("processes")){
statFile.setProcesses(Long.parseLong(tokens[1]));
}
else if(tokens[0].startsWith("procs_running")){
statFile.setProcs_running(Long.parseLong(tokens[1]));
}
else if(tokens[0].startsWith("procs_blocked")){
statFile.setProcs_blocked(Long.parseLong(tokens[1]));
}
else if(tokens[0].startsWith("softirq")){
for(int i=1; i<tokens.length; i++){
statFile.getSoftirq().add(Long.parseLong(tokens[i]));
}
}
}
else{
throw new EOFException("File end reached");
}
}
} catch (EOFException ex) {
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}catch (FileNotFoundException e){
e.printStackTrace();
throw new IllegalStateException("Unable to access the stats");
}
return statFile;
}
private static Cpu parseCpuTokens(String[] tokens){
Cpu cpu = new Cpu(tokens[0],
Long.parseLong(tokens[CPU_USER]),
Long.parseLong(tokens[CPU_NICE]),
Long.parseLong(tokens[CPU_SYSTEM]),
Long.parseLong(tokens[CPU_IDLE]),
Long.parseLong(tokens[CPU_IOWAIT]),
Long.parseLong(tokens[CPU_IRQ]),
Long.parseLong(tokens[CPU_SOFTIRQS]));
return cpu;
}
}