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

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

Есть идеи?

5 ответов

Решение

К сожалению, для большинства устройств Android метод availableProcessors() работает неправильно. Даже / 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, даже без рута.

Если вы работаете с собственным приложением, попробуйте это:

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

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

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

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

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

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

availableProcessors

public int availableProcessors()

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

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

Возвращает:

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

Поскольку:

  1.4

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

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

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

Вот мое решение на Котлине, основанное на этом:

        /**
         * return the number of cores of the device.
         * based on : http://stackru.com/a/10377934/878126
         */
        private var coresCount: Int = 0
            get() {
                if (field > 0)
                    return field
                class CpuFilter : FileFilter {
                    override fun accept(pathname: File): Boolean {
                        return Pattern.matches("cpu[0-9]+", pathname.name)
                    }
                }
                try {
                    val dir = File("/sys/devices/system/cpu/")
                    val files = dir.listFiles(CpuFilter())
                    if (files != null) {
                        field = files.size
                        return field
                    }
                } catch (ignored: Exception) {
                }
                field = max(1, Runtime.getRuntime().availableProcessors())
                return field
            }

Я использую комбинацию обоих доступных решений:

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()
  )
}
Другие вопросы по тегам