Android原生集成Flutter的淺嘗

簡介

Flutter更新速度仍是很快的爲了不帶來的一些不必的問題,這邊文章是基於的版本爲java

感謝Flutter的先行者們對Flutter的項目的促進,以便讓咱們這些後來者能少跳一些坑。這篇文章以前已經有許多談論這方面的文章了。最具表明性的就是 閒魚技術組 的系列文章了。而這篇文章更多的是我的在實際項目中的運用與總結。

Flutter 原碼集成

官方源碼集成方式 Add Flutter to existing apps
android

這種方式是我在完成 Flutter 層開發後,爲了接入原生最早嘗試的方式,畢竟官方永遠是最早選擇的大大,官方的 Add-to-App能夠看到他們在這方面的進度。並且這方式結合 flutter attach調試更爲方便git

aar產物集成

Flutter項目是經過flutter create -t module my_flutter生成的module工程,此工程能夠爲咱們生成一個 arr 文件,避免本身手動建立module工程帶來的沒必要要的坑(若是你想,也是能夠,參照 flutter.gradle將相應的源碼和插件打包就行,畢竟 閒魚技術組 的文章就是這麼幹的)
看一下目錄:github

Flutter 中的 build.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並不支持模擬器的緣由在於,模擬器上的診斷並不表明真實的性能。bash

在 Android中引用 aar 包

//app:build.gradle
//name:與咱們aar文件名同樣
// ext: 此文件格式
dependencies {
    ...
    implementation(name: 'flutter-release', ext: 'aar')
    ...
}

複製代碼

aar包放到 libs文件夾內 app

執行 Sync Project with Gadle Files

此目錄中將看到引用的包

aar遠程依賴

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

  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,這也是有弊端的
    官方明確告訴咱們不要修改這個文件。。。
    至少每次更新Flutter時,這個文件會被官方重置
    so... 若是有更好的方式,還望告知。。。

參考

  1. 深刻理解 Flutter 的編譯原理與優化
  2. 閒魚flutter混合工程持續集成的最佳實踐
相關文章
相關標籤/搜索