Как получить ABI (двоичный интерфейс приложения) в android

Это может быть повторяющийся вопрос, но я не могу его найти. Интересно, как с помощью кода узнать, что такое ABI телефона. Я знаю, что в файле gradle может быть другой интерфейс. Но проблема в том, как я могу получить точный ABI определенного устройства, чтобы я мог вручную скопировать его в папку system / lib / с помощью SuperSU. Спасибо.

android.productFlavors {
        // for detailed abiFilter descriptions, refer to "Supported ABIs" @
        // https://developer.android.com/ndk/guides/abis.html#sa
        create("arm") {
            ndk.abiFilters.add("armeabi")
        }
        create("arm7") {
            ndk.abiFilters.add("armeabi-v7a")
        }
        create("arm8") {
            ndk.abiFilters.add("arm64-v8a")
        }
        create("x86") {
            ndk.abiFilters.add("x86")
        }
        create("x86-64") {
            ndk.abiFilters.add("x86_64")
        }
        create("mips") {
            ndk.abiFilters.add("mips")
        }
        create("mips-64") {
            ndk.abiFilters.add("mips64")
        }
        // To include all cpu architectures, leaves abiFilters empty
        create("all")
    }

person Cuong Phan    schedule 09.02.2016    source источник


Ответы (4)


Это можно сделать двумя способами. Один устарел, но все еще работает, в то время как другой требует, чтобы телефон работал под управлением Android 5.0 или более поздней версии.

Устаревший способ

Если вы хотите поддерживать все текущие телефоны, вы можете использовать:

import android.os.Build;
String ABI = Build.CPU_ABI;

Новый путь

Новый способ фактически предоставит список всех поддерживаемых ABI, причем первый индекс является наиболее предпочтительным для использования ABI (Справочник по API):

import android.os.Build;
String ABI = Build.SUPPORTED_ABIS[0];

Оба способа были протестированы для работы на Android 5.1.1, они вернут одно из следующих значений:

  • армеаби
  • armeabi-v7a
  • armeabi-v7a-hard
  • arm64-v8a
  • x86
  • x86_64
  • мипс
  • mips64

Будущие ABI должны быть перечислены здесь: https://developer.android.com/ndk/guides/abis.html#sa

person brandonhuddle    schedule 18.03.2016

Посмотрите здесь:

введите описание изображения здесь

не там?

Через оболочку ADB:

adb shell getprop ro.product.cpu.abi

Хотя код Java:

import android.os.Build;
Log.d("myabi", Build.SUPPORTED_ABIS[0]);
person ishandutta2007    schedule 15.10.2017
comment
у вас есть источник для скриншота? - person DAS; 22.06.2018
comment
Думаю, developer.android.com/ndk/guides/abis, теперь он изменился хотя - person ishandutta2007; 22.06.2018

TL; DR. Вот комбинированная версия решения bandoncontortion, которая работает на всех версиях Android:

public String getAbi() {
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
        // on newer Android versions, we'll return only the most important Abi version
        return Build.SUPPORTED_ABIS[0];
    }
    else {
        // on pre-Lollip versions, we got only one Abi
        return Build.CPU_ABI;
    }
}
person Johnson_145    schedule 09.08.2018

Если вас интересует ABI, в котором выполняется текущий процесс / среда выполнения (например, процессор arm64 / x86_64 может запускать 32-разрядный app_process для экономии памяти), вы должны использовать CPU_ABI, CPU_ABI2, поскольку он вернет правильный результат.

Если вы не хотите использовать устаревший API, но можете использовать внутренние API (базовая платформа), вы также можете использовать отражение и доступ к dalvik.runtime.VMRuntime.getRuntime().is64Bit() (или getCurrentInstructionSet) и фильтровать SUPPORTED_ABIS самостоятельно. Дополнительную информацию см. В исходном коде статического конструктора android.os.Build.

person Mygod    schedule 11.08.2020