Как вы можете обнаружить двухъядерный процессор на Android-устройстве из кода?

У меня возникла проблема, которая, по-видимому, влияет только на двухъядерные Android-устройства, на которых работает пряничный пряник или больше. Я хотел бы дать диалог по этой проблеме только моим пользователям, которые соответствуют этим критериям. Я знаю, как проверить уровень ОС, но не нашел ничего, что может окончательно сказать мне, что устройство использует многоядерные процессоры.

Любые идеи?

Ответ 1

К сожалению, для большинства Android-устройств метод доступныхпроцессоров() работает некорректно. Even/proc/stat не всегда показывает правильное количество процессоров.

Единственный надежный метод, который я нашел для определения количества процессоров, - это перечислить список виртуальных процессоров в /sys/devices/system/cpu/, как описано в этом сообщении на форуме. Код:

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

Этот Java-код должен работать в любом приложении Android, даже без root.

Ответ 2

Если вы работаете с родным приложением, вы должны попробовать следующее:

#include <unistd.h>
int GetNumberOfProcessor()
{
    return sysconf(_SC_NPROCESSORS_CONF);
}

Он работает на моем i9100 (который доступен дляпроцессоров() 1).

Ответ 3

Вы можете попробовать использовать Runtime.availableProcessors(), как предлагается в этом ответе

Есть ли какой-либо API, который сообщает, является ли устройство Android двухъядерным или нет?

--- редактировать ---

Более подробное описание приведено на сайт Oracle

availableProcessors

public int availableProcessors()

Возвращает количество процессоров, доступных для виртуальной машины Java.

Это значение может меняться во время конкретного вызова виртуальной машины. Поэтому приложения, чувствительные к количеству доступных процессоров, должны периодически опробовать это свойство и соответствующим образом отрегулировать их использование ресурсов.

Возврат:

максимальное количество процессоров, доступных для виртуальной машины; не менее одного

С:

  1.4

Ответ 4

Это довольно просто.

int numberOfProcessors = Runtime.getRuntime().availableProcessors();

Обычно он возвращает 1 или 2. 2 будет в двухъядерном процессоре.