引發(fā)的原因
導(dǎo)致這個問題出現(xiàn)的原因是因為我們在項目種使用了so庫,或者項目中引用的三方sdk使用了so庫。在引用so庫時需要針對不同的cpu架構(gòu)使用不同的.so文件吞获。armeabi谜酒,armeabi-v7a,x86舞肆,arm64-v8a,大家通常會對這幾個cpu架構(gòu)進(jìn)行適配博杖。然而問題就出在現(xiàn)在Flutter在打包Apk時不能同引入arm32和arm64的libflutter.so
椿胯。我門將打好包的Apk安裝到arm64架構(gòu)(默認(rèn)打包會引入arm32)的手機(jī)上就出現(xiàn)了couldn't find libflutter.so
這個異常。
如何解決
-
針對arm32和arm64分別打包(flutter 提供了命令來之分別對arm32和arm64分別打包)
flutter build apk --target-platform=android-arm32
flutter build apk --target-platform=android-arm64
我們用flutter build apk --target-platform=android-arm64
打包apk剃根,并在arm64cpu架構(gòu)的手機(jī)安裝運(yùn)行哩盲,很好完美運(yùn)行。但是當(dāng)我們吧apk安裝到32位時問題再次出現(xiàn)狈醉,原因就不再重復(fù)了廉油。很顯然到這里這個方式并不能解決這個問題,為了適配arm32和arm64我們需要分別打包舔糖,而國內(nèi)大部分應(yīng)用市場不能針對不同cpu架構(gòu)上傳不同的apk娱两。
-
不對arm64做適配,打包時排除其他非arm32架構(gòu)的so文件
這時候有些朋友可能會又疑問金吗,問題不就是因為打包時沒有引入arm64的libflutter的so文件導(dǎo)致在arm64架構(gòu)手機(jī)上出現(xiàn)“兼容”問題的么十兢。這里簡單說一點(diǎn)關(guān)于引用so庫的一些知識,了解的朋友大家直接跳過就可以摇庙。arm64cpu架構(gòu)是可以像下兼容的旱物,簡單點(diǎn)就是arm64架構(gòu)的cpu可以使用arm32的.so文件。出現(xiàn)問題真正原因是我們在引用so庫時(引用的三方庫中引用了so庫)卫袒,對arm64做了兼容宵呛。這樣就會導(dǎo)致運(yùn)行時系統(tǒng)誤以為我們的應(yīng)用對所有的so庫做了arm64架構(gòu)的兼容,但是在打包時libflutter并沒有引入arm64的版本夕凝。這就導(dǎo)致系統(tǒng)去尋找arm64版本的libflutter發(fā)現(xiàn)找不到宝穗。系統(tǒng)誤會了我們,我門只能通過gradle在打包時排除其他非arm32架構(gòu)的so文件來解除這個誤會码秉。
好那如何排除其他非arm32架構(gòu)的so文件逮矛。在app下的gradle文件加入如下代碼
buildTypes { release { ndk{ //這里其實我覺可以直接是用"armeabi-v7a",但國內(nèi)幾個大哥之前使用的都是"armeabi" abiFilters "armeabi" } } debug { ndk { //這里要加上转砖,否則debug包會出問題,后面三個為可選须鼎,x86建議加上不然部分模擬器回報錯 abiFilters "armeabi", ,"armeabi-v7a","arm64-v8a", "x86" } } }
最后
這個問題在官方issues已經(jīng)存在很久了暫時沒有完美的解決方法,有新的方法我會第一時間更新。
后續(xù)我會持續(xù)更新一些Flutter開發(fā)時遇到的問題晋控,以及一些好的文章(可能包含生肉汞窗,本人英文能力有限盡量嘗試炒熟)。希望能幫大家少走一些彎路赡译。有些理解不到位也希望大家指正幫助進(jìn)步仲吏,提前謝過大家。謝謝捶朵。