Android原生整合Flutter的淺嘗

翻滾的猿_開著窗戶睡覺發表於2019-03-27

簡介

Flutter更新速度還是很快的為了避免帶來的一些沒必要的問題,這邊文章是基於的版本為

Android原生整合Flutter的淺嘗
感謝Flutter的先行者們對Flutter的專案的促進,以便讓我們這些後來者能少跳一些坑。這篇文章之前已經有許多談論這方面的文章了。最具代表性的就是 閒魚技術組 的系列文章了。而這篇文章更多的是個人在實際專案中的運用與總結。

Flutter 原碼整合

官方原始碼整合方式 Add Flutter to existing apps

這種方式是我在完成 Flutter 層開發後,為了接入原生最先嚐試的方式,畢竟官方永遠是最先選擇的大大,官方的 Add-to-App可以看到他們在這方面的進度。而且這方式結合 flutter attach除錯更為方便

aar產物整合

Flutter專案是通過flutter create -t module my_flutter生成的module工程,此工程可以為我們生成一個 arr 檔案,避免自己手動建立module工程帶來的不必要的坑(如果你想,也是可以,參照 flutter.gradle將相應的原始碼和外掛打包就行,畢竟 閒魚技術組 的文章就是這麼幹的)
看一下目錄:

Android原生整合Flutter的淺嘗
Flutter 中的 build.gradle將會在我們 執行 ./gradlew assembleRelease為我們生成一個aar檔案
Android原生整合Flutter的淺嘗
這裡建議打release包。

Flutter 模式


對於Flutter,它支援常見的debug,release,profile等模式,但它又有其不一樣。

Debug模式:對應了Dart的JIT模式,又稱檢查模式或者慢速模式。支援裝置,模擬器(iOS/Android),此模式下開啟了斷言,包括所有的除錯資訊,服務擴充套件和Observatory等除錯輔助。此模式為快速開發和執行做了優化,但並未對執行速度,包大小和部署做優化。Debug模式下,編譯使用JIT技術,支援廣受歡迎的亞秒級有狀態的hot reload。

Release模式:對應了Dart的AOT模式,此模式目標即為部署到終端使用者。只支援真機,不包括模擬器。關閉了所有斷言,儘可能多地去掉了除錯資訊,關閉了所有除錯工具。為快速啟動,快速執行,包大小做了優化。禁止了所有除錯輔助手段,服務擴充套件。

Profile模式:類似Release模式,只是多了對於Profile模式的服務擴充套件的支援,支援跟蹤,以及最小化使用跟蹤資訊需要的依賴,例如,observatory可以連線上程式。Profile並不支援模擬器的原因在於,模擬器上的診斷並不代表真實的效能。

在 Android中引用 aar 包

//app:build.gradle
//name:與我們aar檔名一樣
// ext: 此檔案格式
dependencies {
    ...
    implementation(name: 'flutter-release', ext: 'aar')
    ...
}

複製程式碼

aar包放到 libs資料夾內

Android原生整合Flutter的淺嘗
執行 Sync Project with Gadle Files

Android原生整合Flutter的淺嘗
此目錄中將看到引用的包

aar遠端依賴

這裡我將 庫放到 github 上,提供原生開發遠端依賴,好處是讓Android開發人員只關注自己的業務開發,flutter層相關更新對他們來說是無感變化的。

  1. 在flutter專案中開啟 .android/Flutter/build.gradle
dependencies {
    testImplementation 'junit:junit:4.12'
    implementation 'com.android.support:support-v13:27.1.1'
    implementation 'com.android.support:support-annotations:27.1.1'
}
//新增以下程式碼
apply plugin: 'maven'
ext {
    // 從Github上clone下來的專案的本地地址
    GITHUB_REPO_PATH = "D:\\f\\github\\test"
    PUBLISH_GROUP_ID = 'com.test'
    PUBLISH_ARTIFACT_ID = 'flutter_library'
    PUBLISH_VERSION = '1.0.0-SNAPSHOT'//SNAPSHOT 為了原生開發時不用管具體版本
}
uploadArchives {
    repositories {
        mavenDeployer {
            //本地maven倉庫地址,也可以使用遠端maven倉庫
            def deployPath = file(project.GITHUB_REPO_PATH)
            repository(url: "file://${deployPath.absolutePath}")
            pom.project {
                groupId project.PUBLISH_GROUP_ID
                artifactId project.PUBLISH_ARTIFACT_ID
                version project.PUBLISH_VERSION
            }
        }
    }
}
複製程式碼
  1. .android/ 目錄下執行
./gradlew uploadArchives
複製程式碼
  1. 提交"D:\\f\\github\\test"該目錄下的內容到github上
  2. Android 專案 project:build.gradle
allprojects{
        repositories {
        ...
        maven{ url 'https://raw.githubusercontent.com/自己github使用者名稱/庫名/master'}
        ...
    }
}
複製程式碼
  1. Android 專案 app:build.gradle
dependencies {
    ...
    implementation 'com.test:flutter_library:1.0.0-SNAPSHOT'
    ... 
}
複製程式碼
  1. Sync Project with Gadle Files 同步完後應該就能看到 External Libraries中相應的包

梳理

  1. SNAPSHOT版本 gradle 預設快取 24h,如果想每次 build 前檢查版本 在build.gradle中加入
    configurations.all {
        ...
        resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
        ...
    }
複製程式碼
  1. 由於自己對原生以及gradle不是很熟悉,在做整合的時候可能有些方式欠妥
  2. 遠端依賴aar包的時候,在flutter專案中更改了build.gradle,這也是有弊端的
    Android原生整合Flutter的淺嘗
    官方明確告訴我們不要修改這個檔案。。。
    至少每次更新Flutter時,這個檔案會被官方重置
    so... 如果有更好的方式,還望告知。。。

參考

  1. 深入理解 Flutter 的編譯原理與優化
  2. 閒魚flutter混合工程持續整合的最佳實踐

更多關於使用Flutter知識筆記在我的 Github -- HybridApp ,持續更新,歡迎點個 star 訂閱收藏。

相關文章