在 add-to-app 中管理插件和依赖项
本指南介绍了如何设置项目以使用插件,以及如何管理现有 Android 应用和 Flutter 模块插件之间的 Gradle 库依赖项。
A. 简单场景
#简单情况
- 你的 Flutter 模块使用的插件没有额外的 Android Gradle 依赖项,因为它只使用了 Android OS API,例如相机插件。
- 你的 Flutter 模块使用的插件具有 Android Gradle 依赖项,例如来自 video_player 插件的 ExoPlayer,但你现有的 Android 应用不依赖 ExoPlayer。
无需额外步骤。你的 add-to-app 模块将像一个完整的 Flutter 应用一样工作。无论你使用 Android Studio、Gradle 子项目还是 AAR 进行集成,传递的 Android Gradle 库都会根据需要自动打包到你的外部现有应用中。
B. 需要修改项目的插件
#某些插件需要你对项目的 Android 端进行一些修改。
例如,firebase_crashlytics 插件的集成说明要求手动修改你的 Android 包装项目的 build.gradle
文件。
对于完整的 Flutter 应用,这些修改是在你的 Flutter 项目的 /android/
目录中进行的。
对于 Flutter 模块,你的模块项目中只有 Dart 文件。请在你的外部现有 Android 应用中执行这些 Android Gradle 文件修改,而不是在你的 Flutter 模块中。
C. 合并库
#需要稍加注意的场景是,如果你现有的 Android 应用已经依赖于你的 Flutter 模块所依赖的相同 Android 库(通过插件间接依赖)。
例如,你现有应用的 Gradle 可能已经有
…
dependencies {
…
implementation("com.crashlytics.sdk.android:crashlytics:2.10.1")
…
}
…
你的 Flutter 模块也通过 pubspec.yaml
依赖于 firebase_crashlytics
…
dependencies:
…
firebase_crashlytics: ^0.1.3
…
…
此插件用法通过 firebase_crashlytics v0.1.3 自己的 Gradle 文件再次传递性地添加了一个 Gradle 依赖项
…
dependencies {
…
implementation("com.crashlytics.sdk.android:crashlytics:2.9.9")
…
}
…
这两个 com.crashlytics.sdk.android:crashlytics
依赖项的版本可能不同。在此示例中,宿主应用请求了 v2.10.1,而 Flutter 模块插件请求了 v2.9.9。
默认情况下,Gradle v5 通过使用库的最新版本来解决依赖项版本冲突。
只要版本之间没有 API 或实现上的破坏性更改,这通常是可以接受的。例如,你可能会在现有应用中按如下方式使用新的 Crashlytics 库
…
dependencies {
…
implementation("com.google.firebase:firebase-crashlytics:17.0.0-beta03")
…
}
…
这种方法行不通,因为 Crashlytics 的 Gradle 库版本 v17.0.0-beta03 和 v2.9.9 之间存在主要的 API 差异。
对于遵循语义版本控制的 Gradle 库,你通常可以通过在现有应用和 Flutter 模块插件中使用相同的主要语义版本来避免编译和运行时错误。