web-dev-qa-db-fra.com

Appel d'API pour obtenir l'architecture du processeur

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

31
Ljdawson

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'.

62
3c71

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");
16
shem

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));
10
tommybee

Vous pouvez utiliser la classe Build :

import Android.os.Build;

puis lisez:

Build.CPU_ABI

8
and0421

Essayez cette commande:

adb Shell getprop ro.product.cpu.abi

Il indique si cpu est ARM ou Intel, 64 ou 86_64

6
Maher Abuthraa

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

6
nandeesh

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

De: https://github.com/termux/termux-app/blob/master/app/src/main/Java/com/termux/app/TermuxInstaller.Java

3
Ratata Tata

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;
}
2
Robs Ned