今天遇到一个问题,本来运行得好好的项目在我升级Android Studio到3.2后,想要运行到Vivo Y51A就报了这个错:
Unknown (Android 5.1.1, API 22) (Device supports, but APK only supports armeabi)
意思已经很明确,这部机器的CPU架构不是armeabi,而我的app只支持了armeabi。
那么首先我要确定,这部机器的CPU架构是什么。好,经过查找,知道可以使用以下方法获得:
1.连接手机到电脑上
2.打开 cmd 命令窗口,输入命令 adb shell
3.然后输入命令 cat /proc/cpuinfo
得到的结果是:
processor : 0
model name : ARMv7 Processor rev 0 (v7l)
BogoMIPS : 38.40
Features : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva id
ivt vfpd32 evtstrm
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part : 0xd03
CPU revision : 0
... ...
CPU架构是armeabi-v7a。在app下的build.gradle里面加上
ndk {
//设置支持的CPU架构
abiFilters "armeabi", "armeabi-v7a"
}
再运行一遍,可以正常运行了,但是在app里面随便点一下,又出现了报错闪退,应用程序已停止。去logcat上查找错误,得到如下log:
java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.fenlibao.fenlibao-1/base.apk", zip file "/data/app/com.fenlibao.fenlibao-1/split_lib_dependencies_apk.apk", zip file "/data/app/com.fenlibao.fenlibao-1/split_lib_slice_0_apk.apk", ... couldn't find "libfenlibao.so"
在libs下新建目录armeabi-v7a,将armeabi目录下的so库文件复制一份到此目录。再运行,相同的地方没有报错了。基本上解决了这个问题。
然后再查了一下CPU架构:
Android 设备的CPU类型(通常称为”ABIs”)
armeabi-v7a: 第7代及以上的 ARM 处理器。2011年15月以后的生产的大部分Android设备都使用它.
arm64-v8a: 第8代、64位ARM处理器,很少设备,三星 Galaxy S6是其中之一。
armeabi: 第5代、第6代的ARM处理器,早期的手机用的比较多。
x86: 平板、模拟器用得比较多。
x86_64: 64位的平板。
通过百度查到知乎有一段关于arm64-v8a的解释:
arm64-v8a是可以向下兼容的,但前提是你的项目里面没有arm64-v8a的文件夹,如果你有两个文件夹armeabi和arm64-v8a,两个文件夹,armeabi里面有a.so 和 b.so,arm64-v8a里面只有a.so,那么arm64-v8a的手机在用到b的时候发现有arm64-v8a的文件夹,发现里面没有b.so,就报错了,所以这个时候删掉arm64-v8a文件夹,这个时候手机发现没有适配arm64-v8a,就会直接去找armeabi的so库,所以要么你别加arm64-v8a,要么armeabi里面有的so库,arm64-v8a里面也必须有
也就是说Android手机基本上用的都是ARM架构,而arm64-v8a这种架构是向下兼容的,如果不考虑性能有所降低,有armeabi,armeabi-v7a足矣。问题解决,加上armeabi-v7a后apk体积增加了4点几MB。