将 Flutter 模块集成到 Android 项目中

Flutter 可以分批嵌入到现有的 Android 应用程序中,作为源代码 Gradle 子项目或 AAR。

集成流程可以使用带有 Flutter 插件 的 Android Studio IDE 完成,也可以手动完成。

集成 Flutter 模块

在 Android Studio 中集成

Android Studio IDE 可以帮助集成 Flutter 模块。使用 Android Studio,您可以在同一个 IDE 中编辑 Android 和 Flutter 代码。

您还可以使用 IntelliJ Flutter 插件功能,如 Dart 代码补全、热重载和小部件检查器。

Android Studio 支持 Android Studio 2022.2 或更高版本上的添加到应用流程,并使用 IntelliJ 的 Flutter 插件。为了构建您的应用,Android Studio 插件会配置您的 Android 项目,以将您的 Flutter 模块添加为依赖项。

  1. 在 Android Studio 中打开您的 Android 项目。

  2. 转到文件 > 新建 > 新建项目…新建项目对话框显示。

  3. 点击Flutter

  4. 如果要求您提供Flutter SDK 路径,请提供并点击下一步

  5. 完成 Flutter 模块的配置。

    • 如果您有现有项目

      1. 要选择现有项目,请点击项目位置框右侧的
      2. 导航到您的 Flutter 项目目录。
      3. 点击打开
    • 如果您需要创建一个新的 Flutter 项目

      1. 完成配置对话框。
      2. 项目类型菜单中,选择模块
  6. 点击完成

不使用 Android Studio 集成

要手动将 Flutter 模块与现有 Android 应用集成,而不使用 Flutter 的 Android Studio 插件,请按照以下步骤操作

创建一个 Flutter 模块

我们假设您在 some/path/MyApp 处有一个现有的 Android 应用,并且您希望您的 Flutter 项目作为同级

cd some/path/
flutter create -t module --org com.example flutter_module

这会创建一个 some/path/flutter_module/ Flutter 模块项目,其中包含一些 Dart 代码以帮助你入门,以及一个 .android/ 隐藏子文件夹。 .android 文件夹包含一个 Android 项目,它既可以帮助你通过 flutter run 运行 Flutter 模块的精简独立版本,又是一个包装器,可帮助引导 Flutter 模块成为一个可嵌入的 Android 库。

Java 版本要求

Flutter 要求你的项目声明与 Java 11 或更高版本兼容。

在尝试将 Flutter 模块项目连接到宿主 Android 应用之前,请确保你的宿主 Android 应用在应用的 build.gradle 文件中的 android { } 块下声明了以下源兼容性。

MyApp/app/build.gradle
android {
  //...
  compileOptions {
    sourceCompatibility 11 // The minimum value
    targetCompatibility 11 // The minimum value
  }
}

集中存储库设置

从 Gradle 7 开始,Android 建议在 settings.gradle 中使用集中存储库声明,而不是在 build.gradle 文件中的项目或模块级别声明。

在尝试将 Flutter 模块项目连接到宿主 Android 应用之前,请进行以下更改。

  1. 删除应用的所有 build.gradle 文件中的 repositories 块。

    // Remove the following block, starting on the next line
        repositories {
            google()
            mavenCentral()
        }
    // ...to the previous line
    
  2. 将此步骤中显示的 dependencyResolutionManagement 添加到 settings.gradle 文件。

    dependencyResolutionManagement {
      repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)
      repositories {
        google()
        mavenCentral()
      }
    }
    

将 Flutter 模块添加为依赖项

在 Gradle 中将 Flutter 模块添加为现有应用的依赖项。你可以通过两种方式实现此目的。

  1. Android 存档 AAR 机制创建通用 Android AAR 作为中间体,用于打包你的 Flutter 模块。当你的下游应用构建器不想安装 Flutter SDK 时,这很好。但是,如果你经常构建,它会增加一个构建步骤。

  2. 模块源代码 源代码子项目机制是一种便捷的一键式构建流程,但需要 Flutter SDK。这是 Android Studio IDE 插件使用的机制。

依赖 Android 存档 (AAR)

此选项将您的 Flutter 库打包为由 AAR 和 POM 工件组成的通用本地 Maven 存储库。此选项允许您的团队在不安装 Flutter SDK 的情况下构建宿主应用。然后,您可以从本地或远程存储库分发工件。

假设您在 some/path/flutter_module 中构建了一个 Flutter 模块,然后运行

cd some/path/flutter_module
flutter build aar

然后,按照屏幕上的说明进行集成。

更具体地说,此命令(默认情况下所有 debug/profile/release 模式)创建一个 本地存储库,其中包含以下文件

build/host/outputs/repo
└── com
    └── example
        └── flutter_module
            ├── flutter_release
            │   ├── 1.0
            │   │   ├── flutter_release-1.0.aar
            │   │   ├── flutter_release-1.0.aar.md5
            │   │   ├── flutter_release-1.0.aar.sha1
            │   │   ├── flutter_release-1.0.pom
            │   │   ├── flutter_release-1.0.pom.md5
            │   │   └── flutter_release-1.0.pom.sha1
            │   ├── maven-metadata.xml
            │   ├── maven-metadata.xml.md5
            │   └── maven-metadata.xml.sha1
            ├── flutter_profile
            │   ├── ...
            └── flutter_debug
                └── ...

要依赖 AAR,宿主应用必须能够找到这些文件。

为此,在宿主应用中编辑 settings.gradle,以便其包括本地存储库和依赖项

dependencyResolutionManagement {
  repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)
  repositories {
    google()
    mavenCentral()

  // Add the new repositories starting on the next line...
    maven {
      url 'some/path/flutter_module/build/host/outputs/repo'
      // This is relative to the location of the build.gradle file
      // if using a relative path.
    }
    maven {
      url 'https://storage.googleapis.com/download.flutter.io'
    }
  // ...to before this line  
  }
}

</br>

基于 Kotlin DSL 的 Android 项目

在基于 Kotlin DSL 的 Android 项目的 aar 构建之后,请按照以下步骤添加 flutter_module。

将 flutter 模块作为依赖项包含在 Android 项目的 app/build.gradle 文件中。

MyApp/app/build.gradle.kts
android {
    buildTypes {
        release {
          ...
        }
        debug {
          ...
        }
        create("profile") {
            initWith(getByName("debug"))
        }
}
dependencies {
  // ...
  debugImplementation "com.example.flutter_module:flutter_debug:1.0"
  releaseImplementation 'com.example.flutter_module:flutter_release:1.0'
  add("profileImplementation", "com.example.flutter_module:flutter_profile:1.0")
}

profileImplementation ID 是一个自定义 configuration,将在宿主项目的 app/build.gradle 文件中实现。

host-project/app/build.gradle.kts
configurations {
    getByName("profileImplementation") {
    }
}
MyApp/settings.gradle.kts
include(":app")

dependencyResolutionManagement {
    repositories {
        maven(url = "https://storage.googleapis.com/download.flutter.io")
        maven(url = "some/path/flutter_module_project/build/host/outputs/repo")
    }
}

依赖模块的源代码

此选项为您的 Android 项目和 Flutter 项目启用一步式构建。当您同时处理这两个部分并快速迭代时,此选项很方便,但您的团队必须安装 Flutter SDK 才能构建宿主应用。

将 Flutter 模块作为子项目包含在宿主应用的 settings.gradle 中。此示例假定 flutter_moduleMyApp 存在于同一目录中

MyApp/settings.gradle
// Include the host app project.
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
))                                                                     // new

绑定和脚本评估允许 Flutter 模块在 settings.gradle 的评估上下文中 include 自身(作为 :flutter)以及模块使用的任何 Flutter 插件(例如 :package_info:video_player)。

从您的应用中引入一个 implementation 依赖项,该依赖项来自 Flutter 模块

MyApp/app/build.gradle
dependencies {
    implementation project(':flutter')
}

您的应用现在将 Flutter 模块作为依赖项包含在内。

继续 向 Android 应用添加 Flutter 屏幕 指南。