Gradle compile 关键字已被弃用,取而代之的是 api 和 implementation 关键字来配置依赖项。
使用api 等同于使用已弃用的compile,因此如果将所有compile 替换为api,一切都会照常运行。
要理解 implementation 关键字,请考虑以下示例。
示例
假设您有一个名为 MyLibrary 的库,它在内部使用另一个名为 InternalLibrary 的库。像这样的:
// 'InternalLibrary' module
public class InternalLibrary {
public static String giveMeAString(){
return "hello";
}
}
// 'MyLibrary' module
public class MyLibrary {
public String myString(){
return InternalLibrary.giveMeAString();
}
}
假设MyLibrary build.gradle 在dependencies{} 中使用api 配置,如下所示:
dependencies {
api project(':InternalLibrary')
}
您想在您的代码中使用MyLibrary,因此在您的应用程序的build.gradle 中添加此依赖项:
dependencies {
implementation project(':MyLibrary')
}
使用api 配置(或已弃用的compile),您可以在应用程序代码中访问InternalLibrary:
// Access 'MyLibrary' (granted)
MyLibrary myLib = new MyLibrary();
System.out.println(myLib.myString());
// Can ALSO access the internal library too (but you shouldn't)
System.out.println(InternalLibrary.giveMeAString());
以这种方式,模块MyLibrary 可能会“泄漏”某些东西的内部实现。您不应该(能够)使用它,因为它不是您直接导入的。
引入了implementation 配置来防止这种情况。
所以现在如果你在MyLibrary 中使用implementation 而不是api:
dependencies {
implementation project(':InternalLibrary')
}
您将无法再在您的应用代码中调用InternalLibrary.giveMeAString()。
这种装箱策略让 Android Gradle 插件知道,如果您在 InternalLibrary 中编辑某些内容,它必须只触发重新编译 MyLibrary 而而不是重新编译整个应用程序,因为你无权访问InternalLibrary。
当您有很多嵌套依赖项时,这种机制可以大大加快构建速度。 (观看最后链接的视频以全面了解这一点)
结论
-
当您切换到新的 Android Gradle 插件 3.X.X 时,您应该将所有 compile 替换为 implementation 关键字 *(1)。然后尝试编译和测试您的应用程序。如果一切正常,请保持代码不变,如果您遇到问题,您的依赖项可能有问题,或者您使用了现在私有且不易访问的东西。 *Android Gradle 插件工程师 Jerome Dochez 的建议(1))
-
如果您是库管理员,您应该对库的公共 API 所需的每个依赖项使用 api,而对最终用户不得使用的测试依赖项或依赖项使用 implementation。
Useful article 展示实现和api
的区别
参考文献
(这是为节省时间而拆分的同一视频)
Google I/O 2017 - How speed up Gradle builds (FULL VIDEO)
Google I/O 2017 - How speed up Gradle builds (NEW GRADLE PLUGIN 3.0.0 PART ONLY)
Google I/O 2017 - How speed up Gradle builds (reference to 1*)
Android documentation