跳转至正文

在混合应用中管理 plugin 和依赖

学习如何在现有应用中使用 plugin,并共享 plugin 的依赖库。

本指南介绍如何设置你的项目以使用 plugin,以及如何在你现有的 Android 应用与 Flutter 模块的 plugin 之间管理 Gradle 库依赖。

A. 简单场景

#

在简单的情况下:

  • 你的 Flutter 模块使用的 plugin 没有额外的 Android Gradle 依赖,因为它只使用 Android OS API,例如 camera plugin。

  • 你的 Flutter 模块使用的 plugin 有 Android Gradle 依赖,例如 video_player plugin 中的 ExoPlayer,但你现有的 Android 应用并不依赖 ExoPlayer。

无需额外步骤。你的 add-to-app 模块将与纯 Flutter 应用以相同的方式工作。无论你使用 Android Studio、Gradle 子项目还是 AAR 进行集成,传递依赖的 Android Gradle 库都会按需自动打包进你外层的现有应用中。

B. 需要修改项目的 plugin

#

有些 plugin 需要你对项目的 Android 端做一些修改。

例如,firebase_crashlytics plugin 的集成说明要求手动修改你的 Android 包装项目的 build.gradle 文件。

对于纯 Flutter 应用,这些修改是在你的 Flutter 项目的 /android/ 目录中完成的。

对于 Flutter 模块,你的模块项目中只有 Dart 文件。请在你外层的现有 Android 应用上执行这些 Android Gradle 文件修改,而不是在你的 Flutter 模块中。

C. 合并库

#

需要稍加注意的场景是:如果你现有的 Android 应用已经依赖了与你的 Flutter 模块(通过 plugin 传递依赖)相同的 Android 库。

例如,你现有应用的 Gradle 中可能已有:

ExistingApp/app/build.gradle.kts
kotlin

dependencies {
    
    implementation("com.crashlytics.sdk.android:crashlytics:2.10.1")
    
}

ExistingApp/app/build.gradle
groovy

dependencies {
    
    implementation "com.crashlytics.sdk.android:crashlytics:2.10.1"
    
}

而你的 Flutter 模块也通过 pubspec.yaml 依赖了 firebase_crashlytics

flutter_module/pubspec.yaml
yaml

dependencies:
  
  firebase_crashlytics: ^0.1.3
  

这种 plugin 用法会通过 firebase_crashlytics v0.1.3 自身的 Gradle 文件 再次传递依赖式地添加一个 Gradle 依赖:

"firebase_crashlytics_via_pub/android/build.gradle
groovy

dependencies {
    
    implementation "com.crashlytics.sdk.android:crashlytics:2.9.9"
    
}

这两个 com.crashlytics.sdk.android:crashlytics 依赖可能版本不同。在本例中,宿主应用请求的是 v2.10.1,而 Flutter 模块 plugin 请求的是 v2.9.9。

默认情况下,Gradle v5 解决依赖版本冲突 的方式是使用该库的最新版本。

只要各版本之间没有破坏性的 API 或实现变更,这通常没有问题。例如,你可能会在现有应用中按如下方式使用新的 Crashlytics 库:

ExistingApp/app/build.gradle.kts
kotlin

dependencies {
    
    implementation("com.crashlytics.sdk.android:crashlytics:2.10.1")
    
}

ExistingApp/app/build.gradle
groovy

dependencies {
    
    implementation "com.google.firebase:firebase-crashlytics:17.0.0-beta03"
    
}

这种方式行不通,因为 Crashlytics 的 Gradle 库 v17.0.0-beta03 与 v2.9.9 之间存在重大的 API 差异。

对于遵循语义化版本的 Gradle 库,你通常可以通过在现有应用和 Flutter 模块 plugin 中使用相同的主版本号,来避免编译和运行时错误。