如何在android中获得ABI(应用程序二进制接口)

时间:2016-02-09 12:23:40

标签: android abi

这可能是一个重复的问题,但我无法找到它。 我想知道我们如何使用代码获得手机的ABI。我知道可以在gradle文件中指定不同的接口。但问题是如何才能准确获取某个设备的ABI,以便我可以使用SuperSU手动将其复制到system / lib /文件夹。 谢谢。

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

4 个答案:

答案 0 :(得分:19)

有两种方法可以做到这一点。一个已被弃用但仍然有效,而另一个则要求手机运行Android 5.0或更高版本。

弃用的方式

如果您想支持所有可以使用的手机:

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

更新的方式

新方法实际上会提供所有支持的ABI列表,第一个索引是最受欢迎的ABI使用(API Reference):

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

两种方式都经过测试,可以在Android 5.1.1上运行,它们将返回以下内容之一:

  • armeabi
  • armeabi-V7A
  • armeabi-V7A硬
  • arm64-V8A
  • 86
  • x86_64的
  • MIPS
  • MIPS64

未来的ABI应列在此处:https://developer.android.com/ndk/guides/abis.html#sa

答案 1 :(得分:10)

在这里查看:

enter image description here

不在吗?

通过ADB shell:

adb shell getprop ro.product.cpu.abi

虽然是Java代码:

import android.os.Build;
Log.d("myabi", Build.SUPPORTED_ABIS[0]);

答案 2 :(得分:0)

TLDR :这是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;
    }
}

答案 3 :(得分:0)

如果您对正在运行当前进程/运行时的ABI感兴趣(例如arm64 / x86_64处理器可以运行32位app_process以节省内存),则应使用CPU_ABI,{{1} },因为它会返回正确的结果。

如果您不想使用已弃用的API,但可以使用内部(核心平台)API,则还可以使用反射和访问CPU_ABI2(或dalvik.runtime.VMRuntime.getRuntime().is64Bit())并过滤{{1} }。有关更多信息,请参见getCurrentInstructionSet的静态构造函数的源代码。