Android原生整合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將相應的原始碼和外掛打包就行,畢竟 閒魚技術組 的文章就是這麼幹的)
看一下目錄:

./gradlew assembleRelease
為我們生成一個
aar
檔案

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資料夾內

Sync Project with Gadle Files

此目錄中將看到引用的包
aar遠端依賴
這裡我將 庫放到 github 上,提供原生開發遠端依賴,好處是讓Android開發人員只關注自己的業務開發,flutter層相關更新對他們來說是無感變化的。
- 在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 } } } } 複製程式碼
- .android/ 目錄下執行
./gradlew uploadArchives 複製程式碼
"D:\\f\\github\\test"
allprojects{ repositories { ... maven{ url 'https://raw.githubusercontent.com/自己github使用者名稱/庫名/master'} ... } } 複製程式碼
- Android 專案 app:build.gradle
dependencies { ... implementation 'com.test:flutter_library:1.0.0-SNAPSHOT' ... } 複製程式碼
-
Sync Project with Gadle Files
同步完後應該就能看到 External Libraries中相應的包
梳理
- SNAPSHOT版本 gradle 預設快取 24h,如果想每次 build 前檢查版本 在build.gradle中加入
configurations.all { ... resolutionStrategy.cacheChangingModulesFor 0, 'seconds' ... } 複製程式碼
- 由於自己對原生以及gradle不是很熟悉,在做整合的時候可能有些方式欠妥
- 遠端依賴aar包的時候,在flutter專案中更改了build.gradle,這也是有弊端的
至少每次更新Flutter時,這個檔案會被官方重置
so... 如果有更好的方式,還望告知。。。