将 Flutter module 集成到 Android 项目

将 Flutter module 集成到 Android 项目

集成到现有应用chevron_right在 Android 中集成 Flutterchevron_right集成 Flutter

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

开发者可以使用带有 Flutter 插件 的 Android Studio 或手动完成整个集成流程。

warning请注意

你目前现有的 Android 项目可能支持 mipsx86 之类的架构,然而,Flutter 当前仅支持x86_64armeabi-v7aarm64-v8a 构建预编(AOT)的库。

可以考虑使用 abiFilters 这个 Android Gradle 插件 API 来指定 APK 中支持的架构,从而避免 libflutter.so 无法生成而导致应用运行时崩溃,具体操作如下:

MyApp/app/build.gradle.kts

kotlin

android {
    //...
    defaultConfig {
        ndk {
            // Filter for architectures supported by Flutter
            abiFilters += listOf("armeabi-v7a", "arm64-v8a", "x86_64")
        }
    }
}

content_copy

Flutter 引擎也有一个 x86_64 的版本,在模拟器以 debug 即时编译 (JIT) 模式运行时, Flutter 模块仍可以正常运行。

集成 Flutter 模块

#

使用 Android Studio 集成

#

直接使用 Android Studio 是在现有应用中自动集成 Flutter 模块比较便捷的方法。在 Android Studio 中,你可以在一个项目中同时编写 Android 代码和 Flutter 代码。

你还可以继续使用各种常用的 IntelliJ Flutter 插件功能,例如 Dart 代码自动补全、热重载和 widget 检查器等。

为了构建你的应用, Android Studio 插件会配置你的 Android 项目,来将 Flutter 模块添加为依赖。

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

  2. 前往 File > New > New Project...,此时 New Project 弹窗会显示。

  3. 选择 Flutter

  4. 填写你的 Flutter SDK path 并点击 Next 继续。

  5. 完成你的 Flutter 模块配置。

    • 如果你的项目是已有的:

      1. 点击 Project location 右侧的 ... 选择现有的项目。
      2. 前往你的 Flutter 项目的目录所在位置。
      3. 点击 打开
    • 如果你需要创建一个新的 Flutter 项目:

      1. 完成配置弹窗的内容。
      2. Project type 菜单中,选择 Module
  6. 点击完成。

lightbulb小提示

默认情况下,项目的 Project 窗口中可能会显示的是 “Android” 视图,如果在 Project 窗口中看不到新创建的 Flutter 文件,可以将 Project 窗口设置为显示 Project Files,这时就会显示所有未过滤的文件。

将 Flutter module 作为依赖项

#

主要有两种方法将 Flutter 模块添加为 Gradle 中宿主应用程序的依赖项。

  1. AAR 集成 AAR 机制可以为每个 Flutter 模块创建 Android AAR 作为依赖媒介。当你的宿主应用程序开发者不想安装 Flutter SDK 时,这是一个很好方案。但是每次修改都需要重新编译。
  2. 模块源码集成 直接将 Flutter 模块的源码作为子项目的依赖机制是一种便捷的一键式构建方案,但此时需要另外安装 Flutter SDK,这是目前 Android Studio IDE 插件使用的机制。

依赖 Android Archive (AAR)

#

这种方式会将 Flutter 库打包成由 AAR 和 POM artifacts 组成的本地 Maven 存储库。这种方案可以使你的团队不需要安装 Flutter SDK 即可编译宿主应用。之后,你可以从本地或远程存储库中分发更新 artifacts。

假设你在 some/path/flutter_module 下构建 Flutter 模块,执行如下命令:

cd some/path/flutter_module
flutter build aar

content_copy

然后,根据屏幕上的提示完成集成操作。

img

详细地说,该命令应用于创建(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
                └── ...

content_copy

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

为此,需要在宿主应用程序中修改 settings.gradle 文件,使其包含本地存储库和上述依赖项:

settings.gradle.kts

kotlin

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)
    repositories {
        google()
        mavenCentral()
        maven("https://storage.googleapis.com/download.flutter.io")
    }
}

content_copy

基于 Kotlin DSL 的 Android 项目

#

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

在 Android 项目的 app/build.gradle 文件中将 flutter module 列为依赖项。

MyApp/app/build.gradle.kts

kotlin

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")
}

content_copy

profileImplementation ID 是在宿主项目的 app/build.gradle 文件中实施的自定义 configuration

host-project/app/build.gradle.kts

kotlin

configurations {
    getByName("profileImplementation") {
    }
}

content_copy

MyApp/settings.gradle.kts

kotlin

include(":app")

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

content_copy

error重点提醒

在国内,需要使用镜像站点代替 storage.googleapis.com。有关镜像的详细信息,参见 在中国网络环境下使用 Flutter 页面。

lightbulb小提示

你也可以直接点击 Android Studio 菜单中的 Build > Flutter > Build AAR 为 Flutter 模块构建 AAR。

img

此时,你的应用程序已将 Flutter 模块添加为依赖项,

接下来你可以按照 向 Android 应用中添加 Flutter 页面 继续进一步的集成。

posted on 2024-12-11 09:21  AtlasLapetos  阅读(485)  评论(0)    收藏  举报