将 Flutter module 集成到 Android 项目

您所在的位置:网站首页 maven引入不了手动添加包 将 Flutter module 集成到 Android 项目

将 Flutter module 集成到 Android 项目

2023-05-27 15:21| 来源: 网络整理| 查看: 265

将 Flutter module 集成到 Android 项目 Contents

使用 Android Studio

手动集成

创建 Flutter 模块

引入 Java 11

将 Flutter module 作为依赖项

方案 A - 依赖 Android Archive (AAR)

方案 B - 依赖模块的源码

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

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

请注意

你目前现有的 Android 项目可能支持 mips 或 x86 之类的架构,然而,Flutter 当前仅支持 为 x86_64,armeabi-v7a 和 arm64-v8a 构建预编(AOT)的库。

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

android { //... defaultConfig { ndk { // Filter for architectures supported by Flutter. abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86_64' } } }

Flutter 引擎支持 x86 和 x86_64 的版本,在模拟器以 debug 即时编译 (JIT) 模式运行时, Flutter 模块仍可以正常运行。

使用 Android Studio

直接使用 Android Studio 是在现有应用中自动集成 Flutter 模块比较便捷的方法。在 Android Studio 中,你可以在一个项目中同时编写 Android 代码和 Flutter 代码,还可以继续使用各种常用的 IntelliJ Flutter 插件功能,例如 Dart 代码自动补全、热重载和 widget 检查器等。

只有在 Android Studio 3.6 及以上的版本,配合 42 以上版本的 IntelliJ Flutter 插件 才能直接通过 Android Studio 执行集成流程,并且,Android Studio 目前仅支持以 Gradle 子项目源码的方式集成,而不能以 AAR 方式集成。有关这两种方式的区别及更多详细信息,请参见下文。

在 Android Studio 打开现有的 Android 项目并点击菜单按钮 File > New > New Module… ,这样就可以创建出一个可以集成的新 Flutter 模块,或者选择导入已有的 Flutter 模块。

如果你想创建一个新的 Flutter 模块,则可以直接在向导窗口中填写模块名称、路径等信息。

此时,Android Studio 插件就会自动为这个 Android 项目配置添加 Flutter 模块作为依赖项,这时集成应用就已准备好进行下一步的构建。

提示

如果要查看 IDE 插件自动对 Android 项目做了哪些更改,可以在执行具体步骤之前对 Android 项目使用代码版本控制,便可以使用本地 diff 查看更改内容的具体信息。

小提示

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

现在,应用程序已经包含了 Flutter 模块作为依赖项,你可以跳转至 向 Android 应用中添加 Flutter 页面 执行后续步骤。

手动集成

如果想要在不使用 Flutter 的 Android Studio 插件的情况下手动将 Flutter 模块与现有的 Android 应用集成,可以参考以下步骤:

创建 Flutter 模块

假设你在 some/path/MyApp 路径下已有一个 Android 应用,并且你希望 Flutter 项目作为同级项目:

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

这会创建一个 some/path/my_flutter/ 的 Flutter 模块项目,其中包含一些 Dart 代码来帮助你入门以及一个隐藏的子文件夹 .android/。 .android 文件夹包含一个 Android 项目,该项目不仅可以帮助你通过 flutter run 运行这个 Flutter 模块的独立应用,而且还可以作为封装程序来帮助引导 Flutter 模块作为可嵌入的 Android 库。

提示

将自己的 Android 代码添加到你现有应用程序的项目或插件中,而不是添加到 .android/ 中的模块。在模块的 .android/ 目录中所做的任何更改并不会显示在使用该模块的现有 Android 项目中。

由于 .android/ 目录是自动生成的,因此不需要对它的代码进行版本控制,在新机器上构建模块之前,可以先在 my_flutter 目录中运行 flutter pub get 来重新生成 .android/ 目录,然后再使用 Flutter 模块构建 Android 项目。

提示

为了避免 Dex 合并出现问题,flutter.androidPackage 不应与应用的包名相同。

提示 To avoid Dex merging issues, flutter.androidPackage should not be identical to your host app’s package name

引入 Java 11

Flutter Android 引擎需要使用到 Java 11 中的新特性。

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

android { //... compileOptions { sourceCompatibility 11 targetCompatibility 11 } } 将 Flutter module 作为依赖项

接下来,将 Flutter 模块添加为 Gradle 中宿主应用程序的依赖项。主要有两种方法实现。 AAR 机制可以为每个 Flutter 模块创建 Android AAR 作为依赖媒介。当你的宿主应用程序开发者不想安装 Flutter SDK 时,这是一个很好方案,但是,如果你想要经常编译,那么每次都需要重新编译一次,该步骤不可避免。

直接将 Flutter 模块的源码作为子项目的依赖机制是一种便捷的一键式构建方案,但此时需要另外安装 Flutter SDK,这是目前 Android Studio IDE 插件使用的机制。

方案 A - 依赖 Android Archive (AAR)

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

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

$ cd some/path/my_flutter $ flutter build aar

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

详细地说,该命令应用于创建(默认情况下创建 debug/profile/release 所有模式)本地存储库,主要包含以下文件:

build/host/outputs/repo └── com └── example └── my_flutter ├── 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,宿主应用必须能够找到这些文件。

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

android { // ... } repositories { maven { url 'some/path/my_flutter/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' } } dependencies { // ... debugImplementation 'com.example.flutter_module:flutter_debug:1.0' profileImplementation 'com.example.flutter_module:flutter_profile:1.0' releaseImplementation 'com.example.flutter_module:flutter_release:1.0' }

重点提醒

在国内,需要使用镜像站点(如直接使用 https://[a mirror site]/download.flutter.io 代替 storage.googleapis.com)。有关镜像的详细信息,参见 在中国网络环境下使用 Flutter 页面。

小提示

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

你的应用程序现在添加了 Flutter 模块作为依赖项,下面,你可以按照 向 Android 应用中添加 Flutter 页面 中的后续步骤继续操作。

方案 B - 依赖模块的源码

该方式可以使你的 Android 项目和 Flutter 项目能够同步一键式构建。当你需要同时在这两个项目中进行快速迭代时,这种方案非常方便,但是此时,你的团队必须安装 Flutter SDK 才能构建宿主应用程序。

小提示

默认情况下,宿主应用程序已经提供了 Gradle 项目 :app。要更改该项目的名称,可以在 Flutter 模块的 gradle.properties 文件中设置 flutter.hostAppProjectName。最后,将该项目添加到下面提到的宿主应用的 settings.gradle 文件中。

将 Flutter 模块作为子项目添加到宿主应用的 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 'my_flutter/.android/include_flutter.groovy' // new )) // new

假设 my_flutter 和 MyApp 是同级目录。

binding 和 evaluation 脚本可以使 Flutter 模块将其自身(如 :flutter)和该模块使用的所有 Flutter 插件(如 :package_info,:video_player 等)都包含在 settings.gradle 的评估的上下文中。

在你的应用中引入对 Flutter 模块的依赖:

dependencies { implementation project(':flutter') }

此时,你的应用程序已将 Flutter 模块添加为依赖项,下面,你可以按照 向 Android 应用中添加 Flutter 页面 中的后续步骤继续操作。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3