API-вызов для получения архитектуры процессора
Как часть моего приложения, я использую NDK и задаюсь вопросом, стоит ли связывать бинарные файлы x86 и mips вместе со стандартными двоичными файлами ARM.
Я решил, что лучший способ - отслеживать, что на самом деле имеют мои пользователи, есть ли вызов API для захвата архитектуры процессора, чтобы я мог передать это обратно в свой экземпляр Google Analytics?
Спасибо
Ответы
Ответ 1
Собственно, вы можете получить архитектуру без необходимости отражения вообще:
String arch = System.getProperty("os.arch");
В моих тестах он возвращал armv71
и i686
.
ИЗМЕНИТЬ:
В архитектуре MIPS он либо возвращает "mips", либо "mips64"
В 64-битном ARM/Intel он возвращает соответственно "arch64" или "x86_64".
Ответ 2
Вы также можете использовать SDK для Android, посмотрите класс 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");
Ответ 3
Вы можете использовать команду adb
adb shell getprop ro.product.cpu.abi
adb shell getprop ro.product.cpu.abi2
и обратитесь к [site]: Как узнать, что процесс приложения 32-разрядный или 64-разрядный программно в Android lollipop?
Если вы ищете API Lollipop
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));
Ответ 4
Значения, которые вы ищете,
ro.product.cpu.abi
и
ro.product.cpu.abi2
Они могут быть получены с помощью внутреннего api SystemProperties.get. Вам нужно будет использовать Reflection on SystemProperties.
Вы можете использовать функцию getSystemProperty, если вы не слишком увлечены отражением. Проверьте здесь
Ответ 5
Вы можете использовать класс Build:
import android.os.Build;
а затем прочитайте:
Build.CPU_ABI
Ответ 6
Попробуйте выполнить следующую команду:
adb shell getprop ro.product.cpu.abi
Он сообщает, является ли процессор ARM или Intel, 64 или 86_64
Ответ 7
Мой код выглядит следующим образом
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;
}
Ответ 8
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