Подтвердить что ты не робот

Как получить количество ядер устройства Android

Я искал, чтобы определить (или подсчитать) количество ядер во встроенном процессоре Android-устройства.

Я попытался использовать /proc/cpuinfo, но он не возвращает количество ядер устройства!

Я не нашел код в любом месте в Интернете. Кто-нибудь знает, как я могу это определить, тогда, пожалуйста, ответьте. Спасибо заранее

UPDATE:

Ответы на этот вопрос Как вы можете обнаружить двухъядерный процессор на устройстве Android из кода? не работает на некоторых устройствах. Я тестировал их двухъядерные и четырехъядерные процессоры, они вернули 2 и 4 соответственно, отлично!

Но в процессоре Octa Core, как в Samsung Note 3, он вернул 4. (Возможно, в примечании 3 есть два набора четырехъядерных процессоров, работающих по отдельности)

Я искал, чтобы решить эту проблему.

ОБНОВЛЕНИЕ

Приложение CPU-Z возвращает правильный подсчет ядра на моем устройстве Samsung note 3 enter image description here Здесь кажется, что существует возможное решение...

4b9b3361

Ответ 1

Вы можете использовать комбинацию вышеуказанного ответа с этим. Таким образом, он будет работать быстрее на устройствах с API 17+, поскольку этот метод намного быстрее, чем фильтрация файлов.

private int getNumberOfCores() {
    if(Build.VERSION.SDK_INT >= 17) {
        return Runtime.getRuntime().availableProcessors()
    }
    else {
       // Use saurabh64 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;
    }
}

public int availableProcessors()

Добавлен в уровень API 1 Возвращает количество доступных процессорных ядер к VM, по крайней мере 1. Традиционно это возвращало номер в настоящее время в сети, но многие мобильные устройства могут использовать неиспользуемые отключает автономный режим для экономии энергии, поэтому выпускает новее, чем Android 4.2 (Jelly Bean) возвращает максимальное количество ядер, которые могут быть доступны если бы не было ограничений мощности или тепла.

Также есть информация о количестве ядер внутри файла, расположенного в /sys/devices/system/cpu/present Сообщает количество доступных процессоров в следующем формате:

  • 0 → один процессор/ядро ​​
  • 0-1 → два процессора/ядра
  • 0-3 → четыре процессора/ядра
  • 0-7 → восемь процессоров/ядер

и др.

Также проверьте, что находится внутри /sys/devices/system/cpu/possible на заметке 3

Оба файла имеют на них права доступа к файлам r--r--r-- или 444, поэтому вы должны иметь возможность читать их без внедренного устройства в код.

EDIT: Проводка кода, чтобы помочь вам

 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, который запускал BlissPop ROM с Android v5.1.1, и он печатает как следует. Попробуйте использовать свой Samsung

Ответ 2

Во-первых, кажется, что это невозможно, вот несколько информации об этом:

В качестве примера для этого потока мы будем использовать процессор Samsung Exynos 5 Octa, но обычно любой ARM-процессор будет работать одинаково.

Процессор Samsung Exynos 5 Octa имеет 8 ядер процессора. но на самом деле он имеет два процесса с 4 ядрами каждый. Это называется big.LITTLE. У вас есть 1 быстрый процессор и 1 энергоэффективный процессор.

В процессоре Exynos 5 он имеет два разных процессора: Cortex a15 и Cortex a7...

Внутри big.LITTLE оба процессора не могут работать одновременно, только один процессор может быть активным в любой момент времени.

Но есть и то, что называется "big.LITTLE mp", в котором оба процессора могут быть активны в одно и то же время, но вот уловка (опять!). Только FOUR-ядра могут быть активны для программного обеспечения в любой момент времени. Вот изображение, чтобы объяснить это немного лучше:

big.LITTLE mp

Теперь, как вы можете видеть, одно ядерное ядро ​​используется от более мощного процессора, а затем остальные четыре ядра активны из более энергоэффективного кластера с процессором a7.

Подробнее о архитектуре big.LITTLE вы можете прочитать здесь: http://www.arm.com/products/processors/technologies/biglittleprocessing.php

Подробнее о большой архитектуре m.LITTLE mp можно узнать здесь: http://www.arm.com/products/processors/technologies/biglittleprocessing.php

То, что вы хотите узнать сейчас, - это узнать, есть ли архитектура процессора Big.LITTLE или BIG.LITTLE mp. Затем посмотрите, можете ли вы напрямую узнать количество CPU от каждого отдельного процессора, но я не могу найти соответствующий код. На веб-сайте ARM есть много документации, но я не уверен, можно ли получить эту информацию. В любом случае, только 4 ядра процессора могут использоваться для этого, так как у вас есть технически правильный, так как это число используемых ядер.

Я надеюсь, что это помогло, если у вас есть какие-либо вопросы или вы хотите что-то прояснить, дайте мне знать. Там есть много информации.

Ответ 3

Попробуйте следующее:

Runtime.getRuntime().availableProcessors();

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

Ответ 4

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

Код относится к ЭТОТ САЙТ

/**
 * 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 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());
        Log.d(TAG, "CPU Count: "+files.length);
        //Return the number of cores (virtual CPU devices)
        return files.length;
    } catch(Exception e) {
        //Print exception
        Log.d(TAG, "CPU Count: Failed.");
        e.printStackTrace();
        //Default to return 1 core
        return 1;
    }
}

Ответ 5

Вы можете попробовать этот метод, чтобы получить номер ядра.

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