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

Как мы все знаем, из Android 5.0.64bit есть поддержка. У меня очень простой вопрос. Можем ли мы программно проверить, в каком режиме работает любое приложение, т.е. 32-битное или 64-битное? Например: у меня на Nexus 9 запущено приложение Facebook, поэтому могу ли я с помощью своего приложения для Android проверить, запущен ли процесс приложения Facebook в 32-битном или 64-битном режиме?

Заранее спасибо!

6 ответов

Решение

Пытаться System.getProperty("os.arch"), Я не пробовал его на 64-битном Android, но он должен возвращать что-то вроде "aarch64" в случае 64-битного устройства.

http://developer.android.com/reference/java/lang/System.html

В Nexus 5x

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

возвращается

armv8l

это не aarch64 и мой код сломался. Тем не мение,

root@bullhead:/ # uname -m
aarch64

root@bullhead:/ # getprop ro.product.cpu.abilist
arm64-v8a,armeabi-v7a,armeabi

Проводной доступ. Поэтому я изменил свой код на

boolean is64 = (android.os.Build.VERSION.SDK_INT >= 21) && System.getProperty("ro.product.cpu.abilist").contains("64");

Обновлено 2016-02-11

В Samsung Samsung Galaxy S5 Neo, Android 5.1.1

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

возвращается aarch64 но это не 64-битное устройство!!!

ro.product.cpu.abilist возвращается armeabi-v7a,armeabi

bool is64Bit =   System.getProperty("ro.product.cpu.abilist").contains("64");

проверить это единственный способ проверить.

          public static boolean is64Bit() {
        Class<?> cls;
        Method getRuntimeMethod;
        Object vmRuntime;
        Method is64BitMethod;
        try {
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP ||
                    (cls = Class.forName("dalvik.system.VMRuntime")) == null ||
                    (getRuntimeMethod = cls.getDeclaredMethod("getRuntime")) == null ||
                    (vmRuntime = getRuntimeMethod.invoke(null)) == null ||
                    (is64BitMethod = cls.getDeclaredMethod("is64Bit")) == null) {
                return false;
            }
            Object is64Bit = is64BitMethod.invoke(vmRuntime);
            if (is64Bit instanceof Boolean) {
                return (Boolean) is64Bit;
            }
            return false;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

IMO, вы можете использовать отражение, чтобы получить результат is64Bit.

По моему опыту (если ваш minSdkVersion>= 21) лучший способ - проверить размер массива Build.SUPPORTED_64_BIT_ABIS.(см. https://developer.android.com/reference/android/os/Build#SUPPORTED_64_BIT_ABIS)

Что-то вроде этого:

      public static boolean is64Bit() {
 return (Build.SUPPORTED_64_BIT_ABIS!= null && Build.SUPPORTED_64_BIT_ABIS.length >0);
}

Что заставляет вас думать, что ваше устройство не является 64-битным? Спецификации телефона указывают, что он использует Exynos 7 Octa 7580, который является arm8 и 64-битным.

boolean is64Arch = Build.CPU_ABI.equalsIgnoreCase("x86_64") || Build.CPU_ABI.equalsIgnoreCase("arm64-v8a");
Другие вопросы по тегам