compile
不推荐使用Gradle 关键字,而推荐使用api
and implementation
关键字来配置依赖项。
using 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
使用api
配置dependencies{}
如下:
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 (and you shouldn't)
System.out.println(InternalLibrary.giveMeAString());
这样,模块MyLibrary
可能会“泄漏”某些东西的内部实现。您不应该(不能)使用它,因为它不是您直接导入的。
该implementation
引入的配置,以防止这一点。所以现在,如果您使用implementation
而不是api
in MyLibrary
:
dependencies {
implementation project(':InternalLibrary')
}
您将无法再调用InternalLibrary.giveMeAString()
您的应用代码。
这种装箱策略使Android Gradle插件知道,如果您在其中进行编辑InternalLibrary
,则它只能触发重新编译MyLibrary
而不是整个应用程序的重新编译,因为您无权访问InternalLibrary
。
当您有很多嵌套的依赖项时,此机制可以大大加快构建速度。(请观看最后链接的视频,以全面了解此内容)
结论
当您切换到新的Android Gradle插件3.XX时,应将所有关键词替换compile
为(1 *)。然后尝试编译和测试您的应用程序。如果一切正常,则将代码保留原样,如果遇到问题,则可能是依赖项有问题,或者您使用的是现在私有的且无法访问的东西。Android Gradle插件工程师Jerome Dochez的建议(1)*)implementation
如果您是图书馆管理员,则应使用图书馆api
公共API所需的每个依赖项,同时使用implementation
测试依赖项或最终用户不得使用的依赖项。
有用的文章展示了实现和api之间的区别
参考
(这是为节省时间而分割的同一视频)
Google I / O 2017-如何加快Gradle构建速度(FULL VIDEO)
Google I / O 2017-如何加快Gradle的构建速度(仅限NEW GRADLE PLUGIN 3.0.0部分)
Google I / O 2017-如何加快Gradle构建(参考1 *)
Android文档