Flutter雜症(couldn't find "libflutter.so")

三義廟范佩西發表於2019-01-08

引發的原因

導致這個問題出現的原因是因為我們在專案種使用了so庫,或者專案中引用的三方sdk使用了so庫。在引用so庫時需要針對不同的cpu架構使用不同的.so檔案。armeabi,armeabi-v7a,x86,arm64-v8a,大家通常會對這幾個cpu架構進行適配。然而問題就出在現在Flutter在打包Apk時不能同時引入arm32和arm64的libflutter.so。我門將打好包的Apk安裝到arm64架構(預設打包會引入arm32)的手機上時就出現了couldn't find libflutter.so這個異常。

如何解決

  1. 針對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架構的手機安裝執行,很好完美執行。但是當我們吧apk安裝到32位時問題再次出現,原因就不再重複了。很顯然到這裡這個方式並不能解決這個問題,為了適配arm32和arm64我們需要分別打包,而國內大部分應用市場不能針對不同cpu架構上傳不同的apk。

  2. 不對arm64做適配,打包時排除其他非arm32架構的so檔案

    這時候有些朋友可能會又疑問,問題不就是因為打包時沒有引入arm64的libflutter的so檔案導致在arm64架構手機上出現“相容”問題的麼。這裡簡單說一點關於引用so庫的一些知識,瞭解的朋友大家直接跳過就可以。arm64cpu架構是可以像下相容的,簡單點就是arm64架構的cpu可以使用arm32的.so檔案。出現問題真正原因是我們在引用so庫時(引用的三方庫中引用了so庫),對arm64做了相容。這樣就會導致執行時系統誤以為我們的應用對所有的so庫做了arm64架構的相容,但是在打包時libflutter並沒有引入arm64的版本。這就導致系統去尋找arm64版本的libflutter發現找不到。系統誤會了我們,我門只能通過gradle在打包時排除其他非arm32架構的so檔案來解除這個誤會。

    好那如何排除其他非arm32架構的so檔案。在app下的gradle檔案加入如下程式碼

     buildTypes {
         release {
             ndk{
                 //這裡其實我覺可以直接是用"armeabi-v7a",但國內幾個大哥之前使用的都是"armeabi"
                 abiFilters "armeabi"
             }
         }
         debug {
             ndk {
                 //這裡要加上,否則debug包會出問題,後面三個為可選,x86建議加上不然部分模擬器回報錯
                 abiFilters "armeabi", ,"armeabi-v7a","arm64-v8a", "x86"
             }
         }
     }
    複製程式碼

最後

這個問題在官方issues已經存在很久了暫時沒有完美的解決方法,有新的方法我會第一時間更新。 後續我會持續更新一些Flutter開發時遇到的問題,以及一些好的文章(可能包含生肉,本人英文能力有限盡量嘗試炒熟)。希望能幫大家少走一些彎路。有些理解不到位也希望大家指正幫助進步,提前謝過大家。謝謝。

相關文章