如何获取Android设备的核心数

时间:2015-05-08 08:49:31

标签: android

我正在寻找(或计算)Android设备的嵌入式处理器中的核心数量。

我尝试使用/proc/cpuinfo,但它没有返回设备的核心数量!

我没有在互联网上的任何地方找到代码。这里有谁知道我怎么能确定这个,那么请回答。提前致谢

更新

这个问题How can you detect a dual-core cpu on an Android device from code?的答案在某些设备上运行不佳。我测试的是双核心和双核心。四核处理器,他们返回2&分别为4,罚款!

但是,在三星Note 3中的 Octa Core 处理器上,它返回 4 。 (或许在注3中有2套四核处理器单独运行

我本来想解决这个问题。

更新

应用 CPU-Z 正在我的设备Samsung note 3中返回正确的核心数 enter image description here 这似乎存在一种可能的解决方案......

8 个答案:

答案 0 :(得分:44)

您可以结合使用上述答案。这样,它将在运行API 17+的设备上执行得更快,因为这种方法比过滤文件要快得多。

private int getNumberOfCores() {
    if(Build.VERSION.SDK_INT >= 17) {
        return Runtime.getRuntime().availableProcessors()
    }
    else {
       // Use saurabh64's answer
       return getNumCoresOldPhones();
    }
}

/**
 * Gets the number of cores available in this device, across all processors.
 * Requires: Ability to peruse the filesystem at "/sys/devices/system/cpu"
 * @return The number of cores, or 1 if failed to get result
 */
private int getNumCoresOldPhones() {
    //Private Class to display only CPU devices in the directory listing
    class CpuFilter implements FileFilter {
        @Override
        public boolean accept(File pathname) {
            //Check if filename is "cpu", followed by a single digit number
            if(Pattern.matches("cpu[0-9]+", pathname.getName())) {
                return true;
            }
            return false;
        }      
    }

    try {
        //Get directory containing CPU info
        File dir = new File("/sys/devices/system/cpu/");
        //Filter to only list the devices we care about
        File[] files = dir.listFiles(new CpuFilter());
        //Return the number of cores (virtual CPU devices)
        return files.length;
    } catch(Exception e) {
        //Default to return 1 core
        return 1;
    }
}
  

public int availableProcessors()

     

在API级别1中添加返回可用的处理器核心数   到VM,至少1.传统上这返回了数字   目前在线,但许多移动设备都可以使用未使用的   脱机核心以节省电力,因此发布比Android 4.2更新(Jelly   Bean)返回可用的最大核心数   如果没有电力或热量限制。

还有关于文件内核心数量的信息 /sys/devices/system/cpu/present它以以下格式报告可用CPU的数量:

  • 0 - >单CPU /核心
  • 0-1 - >两个CPU /核心
  • 0-3 - >四个CPU /核心
  • 0-7 - >八个CPU /核心

另请注意注释3

/sys/devices/system/cpu/possible内的内容

这两个文件都设置了r--r--r--444文件权限,因此您应该能够在代码中没有root设备的情况下阅读它们。

编辑:发布代码以帮助您

 private void printNumberOfCores() {
        printFile("/sys/devices/system/cpu/present");
        printFile("/sys/devices/system/cpu/possible");

    }

    private void printFile(String path) {
        InputStream inputStream = null;
        try {
            inputStream = new FileInputStream(path);
            if (inputStream != null) {

                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                String line;

                do {
                    line = bufferedReader.readLine();
                    Log.d(path, line);
                } while (line != null);
            }
        } catch (Exception e) {

        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                }
            }
        }
    }

结果

D//sys/devices/system/cpu/present﹕ 0-3
D//sys/devices/system/cpu/possible﹕ 0-3

测试在OnePlus One上运行,运行带有Android v5.1.1的BlissPop ROM,并按照应有的方式进行打印。请试试你的三星

答案 1 :(得分:5)

试试这个:

Runtime.getRuntime().availableProcessors();

这会返回我所体验的特定虚拟机可用CPU的数量。这可能不是你想要的,但是,出于一些目的,这是非常方便的。您可以非常轻松地测试它:杀死所有应用程序,运行上面的代码。打开10个非常密集的应用程序,然后再次运行测试。当然,我认为这只适用于多CPU设备。

答案 2 :(得分:5)

首先,似乎这是不可能的,这里有一些信息:

我们将使用三星Exynos 5 Octa CPU作为此线程的示例,但通常任何ARM处理器都可以正常工作。

三星Exynos 5 Octa CPU有8个CPU核心。但实际上它有两个进程,每个进程有4个核心。这叫做big.LITTLE。你有1个快速处理器和1个节能处理器。

在Exynos 5 CPU中,它内置两个不同的CPU,一个Cortex a15和一个Cortex a7 ......

在big.LITTLE中,两个CPU都无法同时运行,在任何给定时间只能有一个CPU处于活动状态......

但也有一些名为“big.LITTLE mp”的东西,其中两个CPU可以同时处于活动状态,但这里是捕获(再次!)在任何给定时间,只有四个核可以对软件有效。这是一张更好地解释这一点的图片:

big.LITTLE mp

现在您可以看到,此处功能更强大的处理器使用单个CPU内核,然后其他四个内核从更节能的a7 CPU群集中激活。

您可以在此处阅读有关big.LITTLE架构的更多信息: http://www.arm.com/products/processors/technologies/biglittleprocessing.php

您可以在此处阅读有关big.LITTLE mp架构的更多信息: http://www.arm.com/products/processors/technologies/biglittleprocessing.php

您现在想要了解的是,是否可以知道CPU架构是Big.LITTLE还是BIG.​​LITTLE mp。然后看看你是否可以直接找出每个CPU的CPU数量,但我找不到任何相关的代码。 ARMs网站上有很多文档,但我不太确定是否可以获取这些信息。无论哪种方式,只能使用4个CPU内核,因此您拥有的代码在技术上是正确的,因为这是可用内核的数量。

我希望这有帮助,如果您有任何疑问或想要清理任何事情,请告诉我。那里有很多信息

答案 3 :(得分:3)

您可以尝试使用此方法获取核心数量。

 private int getNumOfCores()
      {
        try
        {
          int i = new File("/sys/devices/system/cpu/").listFiles(new FileFilter()
          {
            public boolean accept(File params)
            {
              return Pattern.matches("cpu[0-9]", params.getName());
            }
          }).length;
          return i;
        }
        catch (Exception e)
        {
              e.printstacktrace();
        }
        return 1;
      }

答案 4 :(得分:1)

使用此选项获取否。核心。请仔细阅读此链接,并了解作者试图在虚拟设备和真实设备之间分析的内容。

代码来自THIS SITE

/**
 * Gets the number of cores available in this device, across all processors.
 * Requires: Ability to peruse the filesystem at "/sys/devices/system/cpu"
 * @return The number of cores, or 1 if failed to get result
 */
private int getNumCores() {
    //Private Class to display only CPU devices in the directory listing
    class CpuFilter implements FileFilter {
        @Override
        public boolean accept(File pathname) {
            //Check if filename is "cpu", followed by a single digit number
            if(Pattern.matches("cpu[0-9]+", pathname.getName())) {
                return true;
            }
            return false;
        }      
    }

    try {
        //Get directory containing CPU info
        File dir = new File("/sys/devices/system/cpu/");
        //Filter to only list the devices we care about
        File[] files = dir.listFiles(new CpuFilter());
        Log.d(TAG, "CPU Count: "+files.length);
        //Return the number of cores (virtual CPU devices)
        return files.length;
    } catch(Exception e) {
        //Print exception
        Log.d(TAG, "CPU Count: Failed.");
        e.printStackTrace();
        //Default to return 1 core
        return 1;
    }
}

答案 5 :(得分:0)

好的是使用JNI,如果可能的话在项目中使用

  

的std ::螺纹:: hardware_concurrency()

答案 6 :(得分:0)

kotlin中简单而又不错的解决方案:

SELECT DepartmentName, AvgDepartmentSalary
FROM   (SELECT   DepartmentName, AVG(Salary) AS AvgDepartmentSalary
        FROM     employees
        GROUP BY DepartmentName) g
JOIN   (SELECT AVG(Salary) AS AverageSalary
        FROM   employee) u ON AvgDepartmentSalary > AverageSalary

答案 7 :(得分:0)

您在这里(JAVA):

    try {
        int ch, processorCount = 0;
        Process process = Runtime.getRuntime().exec("cat /proc/cpuinfo");
        StringBuilder sb = new StringBuilder();
        while ((ch = process.getInputStream().read()) != -1)
            sb.append((char) ch);
        Pattern p = Pattern.compile("processor");
        Matcher m = p.matcher(sb.toString());
        while (processorCount.find())
            processorCount++;
        System.out.println(processorCount);
    } catch (IOException e) {
        e.printStackTrace();
    }