FLUTTER混合工程踩坑之旅

chedechao333發表於2019-10-08

簡介

Flutter 是 Google推出並開源的移動應用開發框架,主打跨平臺、高保真、高效能。開發者可以通過 Dart語言開發 App,一套程式碼同時執行在 iOS 和 Android平臺。 Flutter提供了豐富的元件、介面,開發者可以很快地為 Flutter新增 native擴充套件。同時 Flutter還使用 Native引擎渲染檢視,這無疑能為使用者提供良好的體驗。

在app兩端我們分別採取產物&原始碼的方式引入到我們的工程,這兩種方式對應著兩種模式,分別是打包,開發。

產物方式,在專案的打包階段,我們通過引入flutter-release產物來整合到我們專案中。

原始碼方式,在開發階段,我們通過官方推薦的原始碼方式進行flutter需求的開發。

這個是官方推薦的方式: github.com/flutter/flu…

接下來會通過『flutter產物裡都有什麼』,『兩端產物引入方式』和『問題記錄』三個模組闡述我嵌入和排坑的過程,以及提供一個思路,後續出現其他問題也可以按照這個思路去解決。

Flutter產物裡都有什麼

你通過在你的flutter工程裡面的.ios & .android的觀察發現,這裡面都是你主工程端想要的,我們嵌入的內容大致也都是參考這兩個工程的內容。

如果沒有.ios & .android這兩個工程可以執行flutter packages get命令重新生成一下。

iOS

FLUTTER混合工程踩坑之旅

你可以看到.ios資料夾大致的結構。

1.app.framework包含著我們程式碼資料段,圖片等等

2.flutter.framework包含Engine和Embedder層的內容,flutter的基礎服務

3.FlutterPluginRegistrant包含bridge註冊原始碼

4.podhelper.rb:指令碼檔案,通過flutter-plugins裡的plugin列表迴圈的將bridge填到pod中

Android

FLUTTER混合工程踩坑之旅
Android的Flutter依賴的檔案:

  1. Flutter庫和引擎: icudtl.dat、libflutter.so、還有一些class檔案。這些都封裝在flutter.jar中,這個jar檔案位於Flutter庫目錄下的[flutter/bin/cache/artifacts/engine]下。
  2. Flutter工程產物: isolate_snapshot_data、isolate_snapshot_instr、vm_snapshot_data、vm_snapshot_instr、flutter_assets。
  3. Flutter Plugin: 各個plugin編譯出來的aar檔案。

其中:

isolate_snapshot_data 應用程式資料段 isolate_snapshot_instr 應用程式指令段 vm_snapshot_data VM虛擬機器資料段 vm_snapshot_instr VM虛擬機器指令段

兩端產物引入方式

iOS 通過pod方式引入,android通過aar包方式引入。

我們其實是寫指令碼將產物匯出,指令碼的核心命令是flutter和Android自身的工具,flutter build iOS 和./gradlew assembleRelease,那既然官方已經提供,為什麼我們還要寫指令碼,其原因是,flutter自身有問題,另一個是方便將產物集中在一起,免得一個一個去手動copy。

Android指令碼製作的大致思路:

1.進入flutter工程的.android資料夾執行./gradlew assembleRelease就會打出一個flutter-release.aar的包(在.android/Flutter/build/outputs/aar下),但是在1.0.0有問題,問題是flutter-release.aar下缺少assets下面少一個flutter_assets檔案,事實上這個資料夾及其內容在io/flutter.jar可以看到,但是flutter在引用的時候還是回去assets資料夾下去找,導致嵌入Android失敗。

2.但是還有path_provider,share_preference,audioplayer等官方外掛我們也需要copy出來,這裡我們發現flutter工程目錄下面有.flutter-plugins這個檔案,這個檔案記錄著你當前flutter所使用的官方外掛的檔案位置,我們通過shell讀取檔案位置,找到對應的aar集中到一起。

iOS指令碼製作的大致思路:

以下我們需要的產物就聚集在.ios/Flutter這個資料夾下,我們將.ios/Flutter這個檔案整體copy,再寫一個podspec檔案pod進我們的主工程

flutter.framework 是根據Generated.xcconfig儲存的flutter根目錄copy出來的;

app.framework不用多說。

path_provider,share_preference,audioplayer是通過.flutter-plugins裡面記錄的位置copy過來,在.symlinks資料夾下;

FlutterPluginRegistrant 通過pod方式引入過來;

問題記錄

1.Android產物aar下缺少assets下面少一個flutter_assets檔案,問題&解決在上面說了。

2.Android原始碼方式or開發模式or『debug』引入時出現一個經典的錯誤,VM snapshot must be valid. 大致的意思是說你的dart VM初始化失敗。或者你進入flutter頁面什麼都沒有,也不抱錯。

這個查閱很多資料,解決辦法大多數時clean,rebuild就好了。但其實是刷幾個檔案

FLUTTER混合工程踩坑之旅
在你的apk裡面看下有沒有assets檔案,並且裡面的東西是不是跟我圖中的一樣,如果沒有,那就報這個問題了。
FLUTTER混合工程踩坑之旅
或者你看看merged_assets資料夾下有沒有這個東西。 解決辦法一個是自己手打一個aar,改成zip解壓copy到merged_assets裡面,另一個是改寫flutter.gradle,但是改寫方式我是沒成功。

相關文章