implementation和api的区别是:1、Implementation和API的依赖范围;2、使用建议。”implementation”关键字用于将依赖的库隐藏在当前模块内,只能在当前模块中访问,不会传递给其他依赖该模块的模块。而”api”关键字用于将依赖的库的公共接口暴露给其他模块,可以在其他依赖该模块的模块中直接访问。
一、Implementation(实现)
- 在Gradle中,”implementation”是一种依赖配置,用于指定项目对外部库的实际依赖。
- 当我们在项目中使用”implementation”关键字引入外部库时,这些库的实现细节将只在当前模块中可见,并且不会传递给依赖当前模块的其他模块。
- 这意味着,如果你的模块A依赖于库X并使用”implementation”关键字引入,而另一个模块B依赖于模块A,则模块B无法直接访问库X。这样可以避免库的冲突和隐藏实现细节,提高代码的模块化和隔离性。
二、API(应用程序接口)
- “api”是Gradle中另一种依赖配置,它用于指定项目对外部库的公共接口。
- 当我们在项目中使用”api”关键字引入外部库时,这些库的接口将对所有依赖当前模块的其他模块可见。
- 换句话说,如果你的模块A依赖于库X并使用”api”关键字引入,那么模块B也可以直接访问库X,并使用它所提供的公共接口。这样做可以实现库的共享和交互,但也要注意可能造成的依赖传递和版本冲突问题。
三、区别与用途
- Implementation和API的依赖范围: “implementation”关键字用于将依赖的库隐藏在当前模块内,只能在当前模块中访问,不会传递给其他依赖该模块的模块。而”api”关键字用于将依赖的库的公共接口暴露给其他模块,可以在其他依赖该模块的模块中直接访问。
- 使用建议: 通常情况下,推荐使用”implementation”关键字来声明项目对外部库的依赖,这样可以降低库的耦合性,减少潜在的冲突。只有当确实需要在其他模块中访问库的公共接口时,才使用”api”关键字。
延伸阅读
不同依赖配置的用途与示例
compileOnly(仅编译时依赖): 该配置用于在编译时引入外部库,但不会打包到生成的APK中。这对于一些只在编译期需要的库非常有用,可以减小APK的体积。示例:
compileOnly 'com.example:library:1.0.0'
testImplementation(测试依赖): 该配置用于在单元测试和Android测试中引入外部库,只在测试时有效,不会影响应用的正常运行。示例:
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
- implementation和api的对比示例:
考虑一个Android项目,有两个模块:app和library。其中,app模块依赖于library模块,而library模块又依赖于外部库”com.example:utils:2.0.0″。
在app模块的build.gradle中使用implementation:
implementation project(':library')
在library模块的build.gradle中使用implementation:
implementation 'com.example:utils:2.0.0'
使用implementation和api的区别在于,如果在library模块中使用了implementation,则外部库”com.example:utils:2.0.0″的实现细节对app模块是不可见的,app模块无法直接访问该库的内容。而如果使用了api,则app模块可以直接访问该库的公共接口。