How can you detect a dual-core cpu on an Android device from code?
I've run into a problem that appears to affect only dual-core Android
devices running Android 2.3
(Gingerbread
or greater. I'd like to give a dialog regarding this issue, but only to my users that fit that criterion. I know how to check OS
level but haven't found anything that can definitively tell me the device is using multi-core.
Any ideas?
Solution 1:
Unfortunately for most Android devices, the availableProcessors() method doesn't work correctly. Even /proc/stat doesn't always show the correct number of CPUs.
The only reliable method I've found to determine the number of CPUs is to enumerate the list of virtual CPUs at /sys/devices/system/cpu/ as described in this forum post. The code:
/**
* 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 one or more digits
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;
}
}
This Java code should work in any Android application, even without root.
Solution 2:
If you're working with a native application, you should try this:
#include <unistd.h>
int GetNumberOfProcessor()
{
return sysconf(_SC_NPROCESSORS_CONF);
}
It work on my i9100 (which availableProcessors() returned 1).
Solution 3:
You can try using Runtime.availableProcessors() as is suggested in this answer
Is there any API that tells whether an Android device is dual-core or not?
---edit---
A more detailed description is given at Oracle's site
availableProcessors
public int availableProcessors()
Returns the number of processors available to the Java virtual machine.
This value may change during a particular invocation of the virtual machine. Applications that are sensitive to the number of available processors should therefore occasionally poll this property and adjust their resource usage appropriately.
Returns:
the maximum number of processors available to the virtual machine; never smaller than one
Since:
1.4
Solution 4:
This is pretty simple.
int numberOfProcessors = Runtime.getRuntime().availableProcessors();
Typically it would return 1 or 2. 2 would be in a dual-core CPU.