2019年6月16日 星期日

[Android] 既有原生專案導入 Flutter Module 兩大踩坑解決辦法




總是心想,只要照著官方文件,就可以妥妥地把 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=fq4N0hgOWzU
https://juejin.im/post/5c08b6405188251da07dfbe1
https://github.com/flutter/flutter/issues/30916 
https://medium.com/flutterpub/flutter-app-couldnt-find-libflutter-so-c95ad81cbccd


相關 Android 教學一律會放在 Android 標籤分類,歡迎持續追蹤。


沒有留言:

張貼留言