Gradle依赖配置:实现vs api vs runonly vs compileonly

LMT*_*LMT 6 android gradle android-studio-3.0

无法理解gradleAndroid Studio 3.0实现,api,compileonly和runtimeonly 中引入的最新依赖配置.

Gau*_*ngh 13

请参阅android开发者官方网站上提供的链接:Android Studio 3.0 New Gradle Configuration.

根据上面链接中提到的描述:

  • 实现:当您的模块配置实现依赖项时,它让Gradle知道模块不希望在编译时将依赖项泄漏给其他模块.也就是说,依赖性仅在运行时可用于其他模块.使用此依赖项配置而不是api或compile可以显着缩短构建时间,因为它减少了构建系统需要重新编译的项目数量.例如,如果实现依赖项更改其API,则Gradle仅重新编译该依赖项以及直接依赖于它的模块.大多数应用和测试模块都应使用此配置.
  • api:当模块包含api依赖项时,它让Gradle知道模块想要将该依赖项传递到其他模块,以便它们在运行时和编译时都可用.此配置的行为与compile(现在已弃用)类似,您通常只应在库模块中使用它.这是因为,如果api依赖项更改其外部API,Gradle将重新编译在编译时有权访问该依赖项的所有模块.因此,拥有大量的api依赖项可以显着增加构建时间.除非您希望将依赖项的API公开给单独的测试模块,否则应用程序模块应该使用实现依赖项.
  • compileOnly: Gradle仅将依赖项添加到编译类路径中(它不会添加到构建输出中).这在您创建Android库模块时非常有用,并且在编译期间需要依赖项,但在运行时可以使用它是可选的.也就是说,如果使用此配置,那么库模块必须包含运行时条件以检查依赖项是否可用,然后优雅地更改其行为,以便在未提供时仍可以正常运行.这有助于通过不添加不重要的瞬态依赖项来减小最终APK的大小.此配置的行为与提供的一样(现已弃用).
  • runtimeonly: Gradle仅将依赖项添加到构建输出,以便在运行时使用.也就是说,它不会添加到编译类路径中.此配置的行为与apk(现已弃用)相同.

  • 目前尚不清楚“implementation”和“runtimeOnly”之间的区别。请参阅/sf/ask/3578919571/ Between-implementation-and-runtime (2认同)