【问题标题】:How to find CPU load of any Android device programmatically如何以编程方式查找任何 Android 设备的 CPU 负载
【发布时间】:2018-03-24 16:10:27
【问题描述】:

我想在我的 android 应用中拥有相同的详细信息。有人有什么解决办法吗?

【问题讨论】:

  • 我也在找这个,你找到解决办法了吗?由于所有的 cmets 和解决方案都没有提供您所请求的信息附近的任何地方......

标签: android android-studio


【解决方案1】:

由于Android是基于Linux内核的修改版本,我们可以使用同样的Linux命令根据documentation检索CPU信息。

此虚拟文件标识系统使用的处理器类型 - /proc/cpuinfo

可以通过ADBshell执行命令

ADB 命令:

adb shell cat /proc/cpuinfo

在Java API 中使用ProcessBuilder,您可以从Android 应用程序执行shell 命令,如下所示。

Java API:

try {

    String[] DATA = {"/system/bin/cat", "/proc/cpuinfo"};
    ProcessBuilder processBuilder = new ProcessBuilder(DATA);
    Process process = processBuilder.start();
    InputStream inputStream = process.getInputStream();
    byte[] byteArry = new byte[1024];
    String output = "";
    while (inputStream.read(byteArry) != -1) {
        output = output + new String(byteArry);
    }
    inputStream.close();

    Log.d("CPU_INFO", output);

} catch (Exception ex) {
    ex.printStackTrace();
}

示例输出:

【讨论】:

    【解决方案2】:

    首先,我尝试解析“top”命令输出以获取总体使用情况,以及我的 onw 应用程序。但我发现如果我从 adb shell 或应用程序运行顶部,结果完全不同。 该应用程序报告了大约一半的 CPU 使用率,位于 adb(以及 android profiler 选项卡)。所以使用 top 不是解决方案。

    在我看来,您需要解析“/proc/stat”文件。 感谢 Souch 提供的this questioncode,这项工作已经为我们完成了。每次需要时,只需使用他的 CpuInfo 类来获取平均负载。

    【讨论】:

      【解决方案3】:

      使用此函数获取 CPU 详细信息。

      public static String getCPUDetails(){
      
          /*
           *Created By Atiar Talukdar
           * 01/01/2018
           * contact@atiar.info
           */
      
          ProcessBuilder processBuilder;
          String cpuDetails = "";
          String[] DATA = {"/system/bin/cat", "/proc/cpuinfo"};
          InputStream is;
          Process process ;
          byte[] bArray ;
          bArray = new byte[1024];
      
          try{
              processBuilder = new ProcessBuilder(DATA);
      
              process = processBuilder.start();
      
              is = process.getInputStream();
      
              while(is.read(bArray) != -1){
                  cpuDetails = cpuDetails + new String(bArray);   //Stroing all the details in cpuDetails
              }
              is.close();
      
          } catch(IOException ex){
              ex.printStackTrace();
          }
      
          return cpuDetails;
      }
      

      预期输出如 - (我使用模拟器生成输出)

      vendor_id   : GenuineIntel
      cpu family  : 6
      model       : 61
      model name  : Intel(R) Core(TM) i5-5257U CPU @ 2.70GHz
      stepping    : 4
      cpu MHz     : 2699.883
      cache size  : 3072 KB
      physical id : 0
      siblings    : 2
      core id     : 0
      cpu cores   : 1
      apicid      : 0
      initial apicid  : 0
      fpu     : yes
      fpu_exception   : yes
      cpuid level : 13
      wp      : yes
      flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat 
      pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm 
      constant_tsc pebs bts rep_good nopl eagerfpu pni pclmulqdq dtes64 ds_cpl ssse3 
      sdbg fma cx16 xtpr pdcm movbe popcnt aes xsave avx f16c rdrand hypervisor 
      lahf_lm retpoline fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms xsaveopt
      bugs        : cpu_meltdown spectre_v1 spectre_v2
      bogomips    : 5399.76
      clflush size    : 64
      cache_alignment : 64
      address sizes   : 39 bits physical, 48 bits virtual
      power management:
      
      processor   : 1
      vendor_id   : GenuineIntel
      cpu family  : 6
      model       : 61
      model name  : Intel(R) Core(TM) i5-5257U CPU @ 2.70GHz
      stepping    : 4
      cpu MHz     : 2699.883
      cache size  : 3072 KB
      physical id : 0
      siblings    : 2
      core id     : 0
      cpu cores   : 1
      apicid      : 1
      initial apicid  : 1
      fpu     : yes
      fpu_exception   : yes
      cpuid level : 13
      wp      : yes
      flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat 
      pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm 
      constant_tsc pebs bts rep_good nopl eagerfpu pni pclmulqdq dtes64 ds_cpl ssse3 
      sdbg fma cx16 xtpr pdcm movbe popcnt aes xsave avx f16c rdrand hypervisor 
      lahf_lm retpoline fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms xsaveopt
      
      bugs        : cpu_meltdown spectre_v1 spectre_v2
      bogomips    : 5399.76
      clflush size    : 64
      cache_alignment : 64
      address sizes   : 39 bits physical, 48 bits virtual
      power management:
      
      s       : cpu_meltdown spectre_v1 spectre_v2
      bogomips    : 5399.76
      clflush size    : 64
      cache_alignment : 64
      address sizes   : 39 bits physical, 48 bits virtual
      power management:
      
      processor   : 1
      vendor_id   : GenuineIntel
      cpu family  : 6
      model       : 61
      model name  : Intel(R) Core(TM) i5-5257U CPU @ 2.70GHz
      stepping    : 4
      cpu MHz     : 2699.883
      cache size  : 3
      

      【讨论】:

        【解决方案4】:
        import android.support.v7.app.AppCompatActivity;
        import android.os.Bundle;
        import android.widget.TextView;
        import java.io.IOException;
        import java.io.InputStream;
        
        public class MainActivity extends AppCompatActivity {
        
            TextView textView ;
            ProcessBuilder processBuilder;
            String Holder = "";
            String[] DATA = {"/system/bin/cat", "/proc/cpuinfo"};
            InputStream inputStream;
            Process process ;
            byte[] byteArry ;
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
        
                textView = (TextView)findViewById(R.id.textView);
        
                byteArry = new byte[1024];
        
                try{
                    processBuilder = new ProcessBuilder(DATA);
        
                    process = processBuilder.start();
        
                    inputStream = process.getInputStream();
        
                    while(inputStream.read(byteArry) != -1){
        
                        Holder = Holder + new String(byteArry);
                    }
        
                    inputStream.close();
        
                } catch(IOException ex){
        
                    ex.printStackTrace();
                }
        
                textView.setText(Holder);
            }
        }
        

        更多信息:

        【讨论】:

        • 我之前尝试过同样的事情,这个只是提供CPU信息而不是CPU所有内核的时钟速度。任何解决方案
        • @ArpitAgarwal 查看第一个链接,然后看看它是否有效
        • 你不能直接从 Java 中读取 /proc/cpuinfo 而不是生成外部 cat 命令吗?
        猜你喜欢
        • 2012-06-05
        • 1970-01-01
        • 2014-08-22
        • 2022-11-27
        • 2010-12-03
        • 2012-07-27
        • 1970-01-01
        • 1970-01-01
        • 2013-01-31
        相关资源
        最近更新 更多