1、目前Android支持的CPU架构有以下几种:
类型 | 简介 |
---|---|
armeabi | 第5代 ARM v5TE,使用软件浮点运算,兼容所有ARM设备,通用性强,速度慢 |
armeabi-v7a | 第7代 ARM v7,使用硬件浮点运算,具有高级扩展功能(从2010年起) |
arm64-v8a | 第8代,64位,包含AArch32、AArch64两个执行状态对应32、64bit |
x86 | intel 32位,一般用于平板(从2011年起) |
x86_64 | intel 64位,一般用于平板(从2014年起) |
mips | 少接触(从2012年起) |
mips64 | 少接触(从2014年起) |
2、我们的代码是在哪里设置apk对它们适配的?
在主工程module的build.gradle添加下面的代码:
defaultConfig {
ndk {
abiFilters "armeabi-v7a", "x86", "armeabi"
}
}
当我们的应用安装到设备上时,上述设置的abi所对应的lib/armeabi-v7a,lib/x86,lib/armeabi这三个目录中的.so文件会被打包到APK中;
这里解释一下abiFilters这个标签属性的意义,abiFilters就是abi过滤器,abi又是什么呢?
ABI,(application binary interface,缩写为ABI),应用二进制接口,是指应用基于哪种指令集来进行编译。在计算机中,ABI描述了应用程序(或者其他类型)和操作系统之间或其他应用程序之间的低级接口;
3、介绍通过adb命令行查看手机设备支持的CPU架构类型:
连接手机到电脑上之后,打开Terminal输入以下代码:
adb shell
cat /proc/cpuinfo
图上显示我的测试机是AArch64,对应的应该是arm64-v8a;
4、使用Realm的时候,解决64位库找不到的方法?
如果,我们的工程还包含其它的Native库,并且它们没有提供arm64平台的支持,而Realm带有全平台的so文件,当我们运行程序时,由于手机是arm64-v8a,导致arm64的安卓设备在加载Realm的librealm-jni.so时可能会失败。这是因为安卓无法同时加载32位和64位的Native库。最佳的解决方案是为所有的Native库提供arm64版本。但使用第三方闭源库时这个方案不太好实现。
另一个解决方案是在编译期通过gradle配置将Realm的arm64库排除在外,工程中统一加载非arm64的so包;如下代码所示:
defaultConfig {
ndk {
abiFilters "armeabi-v7a", "x86", "armeabi"
}
// 过滤掉不支持的平台
packagingOptions {
exclude "lib/arm64-v8a/librealm-jni.so"
}
}