總是心想,只要照著官方文件,就可以妥妥地把 Flutter Module 放進來了!
但事實是殘酷的,在 import 進來時,可以說是非常順利,可是事與願違....
以下是我的導入過程踩坑心路歷程。希望不會有人又誤闖一次。
如果還沒導入 Flutter 建議請先閱覽過以下教學再回來看此篇會比較好。
⇒ [Android] 簡單將 Flutter 併入現有的 Android 專案步驟教學
人生總是會有個 BUT!!!
APP Run 起來時,只要經過 Flutter view 的時候,就會閃退 Crash。
- Product Flavor設定問題
如果有設定 Product flavor ,記得在 build.gradle 要加以下代碼。原因是因為 Flutter 的 Asset 裡面的檔案沒有被包進 Apk 裡面,這段是為了搬移過去正確的 Flavor。
雖然 github 上有很多討論的解法,親測以下方法有效。
android.buildTypes.all{ theBuildType -> android.productFlavors.all { theProductFlavor -> tasks.whenTaskAdded { theTask -> if (theTask.name == "merge${theProductFlavor.name.capitalize()}${theBuildType.name.capitalize()}Assets") { theTask.dependsOn ":flutter:copyFlutterAssets${theBuildType.name.capitalize()}" } } }}
- 找不到 libflutter.so
在模擬器運行得非常順利,但實機依然閃退,報錯訊息是找不到 libflutter.so
一樣 build.gradle 中加上以下代碼即可。主要是 64 bit 的裝置(屬於 arm64-v8a)找不到 libflutter.so,限定它ndk只有 v7a 的位置,自然會去拿那邊的 lib (因為有向下兼容),ndk 這邊通常會依據不同的 CPU 核心架構產生不一樣的位置。但如果是模擬器的話是用x86核心,若需要則再加一個x86。
android { defaultConfig { .... .... ndk { abiFilters 'armeabi-v7a' } } }那甚麼是 abi 呢? 全名是 Application Binary Interface ,也就是針對不同 CPU 產生不同的二進制檔案去跟系統交互。
- 缺檔案問題到底要怎麼發現?
以上都是 Build 成 Apk 時缺少需要的檔案,但是編譯前其實看不出來。
其實從 Android Studio 裡的 Build > Analyze Apk 去分析裡面缺少的檔案就可以了。
- Android Gradle 精進書籍
⇒ 巧用Gradle構建Android應用
感謝參考連結
https://www.youtube.com/watch?v=fq4N0hgOWzUhttps://juejin.im/post/5c08b6405188251da07dfbe1
https://github.com/flutter/flutter/issues/30916
https://medium.com/flutterpub/flutter-app-couldnt-find-libflutter-so-c95ad81cbccd
沒有留言:
張貼留言