Dans le cadre de mon application, j'utilise le NDK et je me demandais s'il valait la peine de regrouper les binaires x86 et mips aux côtés des binaires standard ARM.
J'ai pensé que la meilleure façon serait de suivre ce que mes utilisateurs ont réellement. Existe-t-il un appel d'API pour récupérer l'architecture du processeur afin que je puisse la transmettre à mon instance Google Analytics?
Merci
En fait, vous pouvez obtenir l'architecture sans aucune réflexion:
String Arch = System.getProperty("os.Arch");
De mes tests, il est revenu armv71
et i686
.
ÉDITER:
Sur l'architecture MIPS, il renvoie soit "mips" soit "mips64"
Sur ARM/Intel 64 bits, il renvoie respectivement 'Arch64' ou 'x86_64'.
Vous pouvez également utiliser Android SDK, jetez un œil à la classe 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");
Vous pouvez utiliser la commande adb
adb Shell getprop ro.product.cpu.abi adb Shell getprop ro.product.cpu.abi2
et référez le [site]: Comment savoir qu'un processus d'une application est 32 bits ou 64 bits par programmation dans Android lollipop?
Si vous recherchez l'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));
Essayez cette commande:
adb Shell getprop ro.product.cpu.abi
Il indique si cpu est ARM ou Intel, 64 ou 86_64
Les valeurs que vous recherchez sont
ro.product.cpu.abi
et
ro.product.cpu.abi2
Ceux-ci peuvent être obtenus en utilisant l'api interne SystemProperties.get Vous devrez donc utiliser Reflection on SystemProperties.
Vous pouvez utiliser la fonction getSystemProperty si vous n'êtes pas trop amateur de réflexion. Vérifiez-le ici
termux-app
utilise une approche différente et a une explication:
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));
}
Mon code ressemble à ceci
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;
}