【问题标题】:Why compile- and run-time dependency is important?为什么编译和运行时依赖很重要?
【发布时间】:2019-01-08 19:37:20
【问题描述】:

我知道here 讨论的两者之间的区别。

作为 Android 开发者,

  1. 我为什么要关心这个?
  2. 在 gradle 中,我为什么要使用 compileOnlyimplementation/api

【问题讨论】:

    标签: android android-gradle-plugin


    【解决方案1】:

    我为什么要关心这个?

    让您的应用能够构建但不附带不必要的东西。

    在 gradle 中,我为什么要使用 compileOnly vs implementation/api?

    compileOnly 的文档以一个用例为例:

    Gradle 仅将依赖项添加到编译类路径中(它不会添加到构建输出中)。当您创建 Android 库模块并且在编译期间需要依赖项时,这很有用,但在运行时存在是可选的。也就是说,如果你使用这个配置,那么你的库模块必须包含一个运行时条件来检查依赖是否可用,然后优雅地改变它的行为,这样如果没有提供它仍然可以运行。这有助于通过不添加不重要的临时依赖项来减少最终 APK 的大小。此配置的行为与提供的一样(现已弃用)。

    source

    例如,考虑一个支持 Firebase FCM 和 Amazon ADM 但两者都不需要的推送消息库。如果它将两者都作为传递依赖项提供,它将不必要地使应用程序膨胀。使用compileOnly 仍然可以构建库。使用该库的开发人员可以选择实际使用哪些依赖项。

    另一个例子是不需要随应用程序提供的编译时注释。

    【讨论】:

    • 谢谢@laalto。您能否分享一个实例,其中“您在编译期间需要依赖项,但在运行时存在是可选的。”
    • 编辑添加示例
    • 这是我正在寻找的答案。我会接受你的回答。还有一件事,如果我是使用该库的开发人员之一,我如何在我的应用程序中声明我想在该库中使用 FCM(或 ADM 或其他使用 compileOnly 的依赖项)?声明“实现 'com.google.firebase:firebase-core:16.0.1'”就足够了吗?
    • 这取决于库的构建方式,即它实际使用什么机制来确定启用哪些可选功能。构建工具只是一个促成因素。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    • 2015-10-22
    • 1970-01-01
    • 2014-02-18
    • 2011-06-09
    相关资源
    最近更新 更多