今天遇到一個(gè)問(wèn)題儿倒,本來(lái)運(yùn)行得好好的項(xiàng)目在我升級(jí)Android Studio到3.2后剂邮,想要運(yùn)行到Vivo Y51A就報(bào)了這個(gè)錯(cuò):
Unknown (Android 5.1.1, API 22) (Device supports, but APK only supports armeabi)
意思已經(jīng)很明確,這部機(jī)器的CPU架構(gòu)不是armeabi颓芭,而我的app只支持了armeabi顷锰。
那么首先我要確定,這部機(jī)器的CPU架構(gòu)是什么亡问。好官紫,經(jīng)過(guò)查找,知道可以使用以下方法獲得:
1.連接手機(jī)到電腦上
2.打開(kāi) cmd 命令窗口州藕,輸入命令 adb shell
3.然后輸入命令 cat /proc/cpuinfo
得到的結(jié)果是:
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架構(gòu)是armeabi-v7a束世。在app下的build.gradle里面加上
ndk {
//設(shè)置支持的CPU架構(gòu)
abiFilters "armeabi", "armeabi-v7a"
}
再運(yùn)行一遍,可以正常運(yùn)行了床玻,但是在app里面隨便點(diǎn)一下毁涉,又出現(xiàn)了報(bào)錯(cuò)閃退,應(yīng)用程序已停止笨枯。去logcat上查找錯(cuò)誤薪丁,得到如下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庫(kù)文件復(fù)制一份到此目錄馅精。再運(yùn)行严嗜,相同的地方?jīng)]有報(bào)錯(cuò)了≈薷遥基本上解決了這個(gè)問(wèn)題漫玄。
然后再查了一下CPU架構(gòu):
Android 設(shè)備的CPU類型(通常稱為”ABIs”)
armeabi-v7a: 第7代及以上的 ARM 處理器。2011年15月以后的生產(chǎn)的大部分Android設(shè)備都使用它.
arm64-v8a: 第8代压彭、64位ARM處理器睦优,很少設(shè)備,三星 Galaxy S6是其中之一壮不。
armeabi: 第5代汗盘、第6代的ARM處理器,早期的手機(jī)用的比較多询一。
x86: 平板隐孽、模擬器用得比較多。
x86_64: 64位的平板健蕊。
通過(guò)百度查到知乎有一段關(guān)于arm64-v8a的解釋:
arm64-v8a是可以向下兼容的菱阵,但前提是你的項(xiàng)目里面沒(méi)有arm64-v8a的文件夾,如果你有兩個(gè)文件夾armeabi和arm64-v8a缩功,兩個(gè)文件夾晴及,armeabi里面有a.so 和 b.so,arm64-v8a里面只有a.so,那么arm64-v8a的手機(jī)在用到b的時(shí)候發(fā)現(xiàn)有arm64-v8a的文件夾嫡锌,發(fā)現(xiàn)里面沒(méi)有b.so虑稼,就報(bào)錯(cuò)了,所以這個(gè)時(shí)候刪掉arm64-v8a文件夾势木,這個(gè)時(shí)候手機(jī)發(fā)現(xiàn)沒(méi)有適配arm64-v8a动雹,就會(huì)直接去找armeabi的so庫(kù),所以要么你別加arm64-v8a,要么armeabi里面有的so庫(kù)跟压,arm64-v8a里面也必須有
也就是說(shuō)Android手機(jī)基本上用的都是ARM架構(gòu)胰蝠,而arm64-v8a這種架構(gòu)是向下兼容的,如果不考慮性能有所降低震蒋,有armeabi茸塞,armeabi-v7a足矣。問(wèn)題解決查剖,加上armeabi-v7a后apk體積增加了4點(diǎn)幾MB钾虐。