Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何获取android设备的内核数_Android - Fatal编程技术网

如何获取android设备的内核数

如何获取android设备的内核数,android,Android,我想确定(或计算)安卓设备嵌入式处理器中的内核数量 我尝试使用/proc/cpuinfo,但它没有返回设备的内核数 我在网上的任何地方都找不到代码。这里有没有人知道我该如何判断,请回答。提前谢谢 更新: 这个问题的答案在某些设备上运行不好。我测试了他们是双核和四核处理器,他们分别返回2和4,很好 但是,在像三星Note 3那样的八核处理器上,它返回了4。(注3中可能有2组四核处理器单独运行) 我想解决这个问题 更新 应用程序CPU-Z正在我的设备三星note 3中返回正确的内核计数 这里似乎存在

我想确定(或计算)安卓设备嵌入式处理器中的内核数量

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

我在网上的任何地方都找不到代码。这里有没有人知道我该如何判断,请回答。提前谢谢

更新:

这个问题的答案在某些设备上运行不好。我测试了他们是双核和四核处理器,他们分别返回2和4,很好

但是,在像三星Note 3那样的八核处理器上,它返回了4。(注3中可能有2组四核处理器单独运行)

我想解决这个问题

更新

应用程序CPU-Z正在我的设备三星note 3中返回正确的内核计数
这里似乎存在一个可能的解决方案…

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

代码引用自

试试这个:

Runtime.getRuntime().availableProcessors();

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

您可以将上述答案与此答案结合使用。这样,它将在运行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;
    }
}
公共int可用处理器()

API级别1中添加的返回可用的处理器内核数 到虚拟机,至少1个。传统上,这会返回数字 目前在线,但许多移动设备都可以使用未使用的 内核离线以节省电源,因此发布了比安卓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/可能的
中的内容

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

编辑:发布代码以帮助您解决问题

 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,并按原样打印。请先试用您的三星

,这似乎是不可能的,以下是一些相关信息:

我们将使用三星Exynos 5 Octa CPU作为该线程的示例,但一般来说,任何ARM处理器的工作原理都是相同的

三星Exynos 5 Octa CPU有8个CPU核。但实际上它有两个进程,每个进程有4个核。这叫做大。小。您有一个快速处理器和一个节能处理器

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

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

但也有一种称为“big.LITTLE mp”的方法,在这种方法中,两个CPU可以同时处于活动状态,但这里有一个陷阱(再次!)在任何给定的时间内,只有四个内核可以对软件处于活动状态。下面的图片可以更好地解释这一点:

现在,正如您所看到的,这里使用的是来自更强大处理器的一个CPU内核,然后其他四个内核来自更节能的A7CPU集群

您可以在此处阅读更多关于“大.小”架构的信息:

您可以在此处阅读有关big.LITTLE mp体系结构的更多信息:

你现在想知道的是,是否有可能知道CPU架构是大的、小的还是大的、小的mp。然后看看是否可以直接从每个CPU中找到CPU计数,但我找不到任何相关代码。武器网站上有很多文档,但我不太确定是否有可能获得这些信息。然而,无论哪种方式,只有4个CPU内核可以使用,因此您的代码在技术上是正确的,因为这是可用内核的数量


我希望这有帮助,如果你有任何问题或想澄清什么,请告诉我。有很多信息

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

 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;
      }

若可能的话,最好在项目中使用JNI

std::thread::hardware_concurrency()


kotlin中的简单而漂亮的解决方案:

fun getCPUCoreNum(): Int {
  val pattern = Pattern.compile("cpu[0-9]+")
  return Math.max(
    File("/sys/devices/system/cpu/")
      .walk()
      .maxDepth(1)
      .count { pattern.matcher(it.name).matches() },
    Runtime.getRuntime().availableProcessors()
  )
}
给你(Java):


请解释下一票你需要有根访问权限,你想要根设备的解决方案吗?请看我的编辑,我已经详细解释了这个问题!!!我认为三星note 3应该返回4。你不能同时使用所有的8个,它不是一个真正的八核。这只是三星销售更多垃圾的方式。为了解释,它有4个运行1,9GHz的内核和4个运行1,3GHz的内核。此时只有4个是活动的,这取决于便笺当前正在执行的处理量和您使用的函数,返回最大活动核心数,因为大多数人将该数字用作线程池sizeCPU-Z的数量,而外部数据库显示为8(营销废话)。它不会问系统本身(一次最多有4个内核)。
Runtime.getRuntime().availableProcessors()
仍然返回4而不是8为什么您要在这里更改注释,我对rea非常了解
fun getCPUCoreNum(): Int {
  val pattern = Pattern.compile("cpu[0-9]+")
  return Math.max(
    File("/sys/devices/system/cpu/")
      .walk()
      .maxDepth(1)
      .count { pattern.matcher(it.name).matches() },
    Runtime.getRuntime().availableProcessors()
  )
}
    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 (m.find())
            processorCount++;
        System.out.println(processorCount);
    } catch (IOException e) {
        e.printStackTrace();
    }