这可能是一个重复的问题,但我无法找到它。 我想知道我们如何使用代码获得手机的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")
}
答案 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上运行,它们将返回以下内容之一:
未来的ABI应列在此处:https://developer.android.com/ndk/guides/abis.html#sa
答案 1 :(得分:10)
在这里查看:
不在吗?
通过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
的静态构造函数的源代码。