如何获取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/核
/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();
}