如何進行Flutter混合開發

[TOC]java

Why Flutter ?

Flutter框架與應用

框架與Source Code

總體框架

Source Code

因此從上面的分析能夠看出,爲了實現Flutter的平臺無差別性,Google主要在 PlatForm Integration和Dart:UI部分作了適配工做。android

APK(Android應用)結構

咱們經過解壓一個release的混合開發APK包,來探索一下加入了Flutter以後的包到底發生了哪些變化以及這些變化對應的做用是什麼。ios

從上圖的標記中能夠清楚的看出變化點bash

  • 變化1app

    未在圖中標出,可是我相信大部分的開發者應該能夠猜的到,就是在dex中打入了 PlatForm Integration的代碼(FutterActivity,FlutterApplication,FlutterView etc.)框架

  • 變化2gradle

    assets下面的4個文件,內容均爲arm指令ui

    • isolate_snapshot_data/isolate_snapshot_instrthis

      對應了咱們的Flutter代碼進行AOT編譯,用於建立一個新isolatelua

    • vm_snapshot_data/vm_snapshot_instr

      用於初始化Dart VM,提供 runTime,gc等服務

    因爲該部份內容經過gen_snapshot編譯生成,且存放在App的data目錄下面,因此

    爲之後的動態更新提供了可能。

  • 變化3

    ICU Dart Language包,提供語言相關的數據信息。

  • 變化4

​ Flutter Engine層的代碼

Flutter混合模式

相信對於絕大多數應用來講,從零開始從新作一個App的成本是至關高的,因此混合開發成了它們嘗試Flutter的首選。

閒魚模式

雙Branch共存(Flutter模式 && Standalone模式)

Standalone模式:純Native開發或者是平臺打包下的模式

Flutter模式:進行flutter相關功能的開發,庫生成,編譯和調試走的都是Flutter定義的流程。

  • 優勢

在Standalone模式下,純Native開發者和打包平臺,對Flutter是無感知的。在這種狀況下,Flutter相關的代碼能夠認爲是一個常規的第三方庫文件。

  • 前期準備

    理清Standalone模式下對Flutter的依賴並將它們提取成一個aar庫。

  • 開發步驟

    1. 在Flutter模式下進行flutter相關功能的開發。
    2. 將代碼打包成一個aar庫上傳到repository中去進行版本控制。
    3. 切換分支到Standalone模式,修改相關依賴包的版本號。

    固然這種方法在實際的開發過程當中還會遇到不少其餘問題,好比複雜流程下生成aar庫腳本的編寫,好比兩個模式下的代碼同步等。

Google模式

對與方便的進行Flutter的混合模式開發呼聲有多高,Google專門爲了這個問題創建了Wiki而且進行了持續4個月42個版本的更新。

建立Flutter Module模式
1.1.1 切換flutter分支

假如直接使用

$ cd some/path/
$ flutter create -t module my_flutter
複製代碼

會出現沒法識別 command module的錯誤,查找其緣由發現咱們默認clone的分支是flutter的beta版本並不支持module命令因此首先須要

flutter channel
flutter channel master
flutter upgrade
複製代碼

將分支切換到master而且進行upgrade操做。

1.1.2 建立Flutter module模版
flutter create -t module flutter_module
複製代碼

這個時候會看到project中新增長了一個flutter_module,其中包含了.android,.ios和關鍵的include_flutter.groovy文件

1.1.3 將Flutter添加到現有工程中
  • 在android工程的根目錄的settings.gradle中添加

    include ':app'                                     // assumed existing content
    setBinding(new Binding([gradle: this]))                                 // new
    evaluate(new File(                                                      // new
      settingsDir.parentFile,                                               // new
      'flutter_module/.android/include_flutter.groovy'                      // new
    )) 
    複製代碼
  • 在app的build.gradle中添加依賴

    dependencies {
      implementation project(':flutter')
    複製代碼
1.1.4 總而言之

簡單的說,Google在兼顧維護成本和開發成本的前提下,爲了Insert flutter module ,創建了一個邏輯依賴鏈

flutter_module/.android/include_flutter.groovy ->
flutter_module/.android/Flutter/build.gradle ->
$flutterRoot/packages/flutter_tools/gradle/flutter.gradle 
複製代碼

利用 $flutterRoot/packages/flutter_tools/lib/中的flutter command &&

$AndroidRoot/build-tools/buildToolsVersion/中的android command

完成混合開發模式下的打包操做。

相關文章
相關標籤/搜索