Вызов API для получения архитектуры процессора

В качестве части своего приложения я использую NDK, и мне было интересно, стоит ли объединять двоичные файлы x86 и mips вместе со стандартными двоичными файлами ARM.

Я подумал, что лучшим способом было бы отследить, что на самом деле есть у моих пользователей, есть ли вызов API для захвата архитектуры процессора, чтобы я мог передать это обратно своему экземпляру Google Analytics?

Спасибо

9 ответов

Решение

На самом деле, вы можете получить архитектуру без необходимости отражения:

String arch = System.getProperty("os.arch");

Из моих тестов он вернулся armv71 а также i686,

РЕДАКТИРОВАТЬ:

В архитектуре MIPS он возвращает либо "mips", либо "mips64".

На 64-битном ARM/Intel возвращается "arch64" или "x86_64" соответственно.

Вы можете использовать класс Build:

import android.os.Build;

и затем прочитайте:

Build.CPU_ABI

Вы также можете использовать Android SDK, посмотрите на Build учебный класс:

    /** The name of the instruction set (CPU type + ABI convention) of native code. */
    public static final String CPU_ABI = getString("ro.product.cpu.abi");

    /** The name of the second instruction set (CPU type + ABI convention) of native code. */
    public static final String CPU_ABI2 = getString("ro.product.cpu.abi2");

Вы можете использовать команду ADB

Оболочка adb getprop ro.product.cpu.abi Оболочка adb getprop ro.product.cpu.abi2

и обратитесь к [site]: Как узнать, что процесс приложения 32-битный или 64-битный программно в Android Lollipop?

Если вы ищете Lollipop API

import android.os.Build;

Log.i(TAG, "CPU_ABI : " + Build.CPU_ABI);
Log.i(TAG, "CPU_ABI2 : " + Build.CPU_ABI2);
Log.i(TAG, "OS.ARCH : " + System.getProperty("os.arch"));

Log.i(TAG, "SUPPORTED_ABIS : " + Arrays.toString(Build.SUPPORTED_ABIS));
Log.i(TAG, "SUPPORTED_32_BIT_ABIS : " + Arrays.toString(Build.SUPPORTED_32_BIT_ABIS));
Log.i(TAG, "SUPPORTED_64_BIT_ABIS : " + Arrays.toString(Build.SUPPORTED_64_BIT_ABIS));

Попробуйте эту команду:

adb shell getprop ro.product.cpu.abi

Он говорит, является ли процессор ARM или Intel, 64 или 86_64

Значения, которые вы ищете

ro.product.cpu.abi

а также

ro.product.cpu.abi2

Их можно получить с помощью внутреннего api SystemProperties.get. Поэтому вам придется использовать Reflection для SystemProperties.

Вы можете использовать функцию getSystemProperty, если вы не слишком заинтересованы в рефлексии. Проверьте это здесь

termux-app использует другой подход и имеет объяснение:

private static String determineTermuxArchName() {
    // Note that we cannot use System.getProperty("os.arch") since that may give e.g. "aarch64"
    // while a 64-bit runtime may not be installed (like on the Samsung Galaxy S5 Neo).
    // Instead we search through the supported abi:s on the device, see:
    // http://developer.android.com/ndk/guides/abis.html
    // Note that we search for abi:s in preferred order (the ordering of the
    // Build.SUPPORTED_ABIS list) to avoid e.g. installing arm on an x86 system where arm
    // emulation is available.
    for (String androidArch : Build.SUPPORTED_ABIS) {
        switch (androidArch) {
            case "arm64-v8a": return "aarch64";
            case "armeabi-v7a": return "arm";
            case "x86_64": return "x86_64";
            case "x86": return "i686";
        }
    }
    throw new RuntimeException("Unable to determine arch from Build.SUPPORTED_ABIS =  " +
        Arrays.toString(Build.SUPPORTED_ABIS));
}

От: https://github.com/termux/termux-app/blob/master/app/src/main/java/com/termux/app/TermuxInstaller.java

Мой код выглядит так

private String cpuinfo()
{
String arch = System.getProperty("os.arch");    
String arc = arch.substring(0, 3).toUpperCase();
String rarc="";
if (arc.equals("ARM")) {
    rarc= "This is ARM";
    }else if (arc.equals("MIP")){
        rarc= "This is MIPS";
    }else if (arc.equals("X86")){
        rarc= "This is X86";
    }
    return rarc;
}

см. эту ссылку: https://developer.android.com/reference/android/os/Build#SUPPORTED_ABIS

      Build.SUPPORTED_32_BIT_ABIS;
Другие вопросы по тегам