当前位置: 代码迷 >> 综合 >> Android的Gradle技巧 2.5项目间的共享设置
  详细解决方案

Android的Gradle技巧 2.5项目间的共享设置

热度:26   发布时间:2024-01-19 16:02:45.0
2.5项目间的共享设置
问题
您要从多个模块中删除重复的设置。
解
使用顶级Gradle构建文件中的所有项目或子项目块。
讨论
当您在Android Studio中创建新的Android项目时,IDE将创建一个具有两个构建文件的Gradle多项目构建:一个在顶层,一个在一个名为app的模块中。顶层build.gradle文件通常有一个称为allprojects的块,如例2-24所示。
实例2-24。 allprojects在顶层Gradle构建文件中阻塞

allprojects {
repositories {
jcenter()
}
}

这个块来自Gradle DSL,因此适用于所有基于Gradle的项目,而不仅仅是Android项目。 allprojects属性来自Gradle中的Project API,它是org.gradle.api.Project类的属性。该属性由一个包含当前项目及其所有子项目的集合组成。还有一个相同名称的方法,它允许您配置当前项目及其所有子项目。

Gradle API中通常有一个具有相同名称的属性和方法。上下文确定您正在使用哪个。
行为是将闭合参数应用于allprojects集合返回的每个项目,对于默认项目,意味着顶级项目和应用程序模块。在这种情况下,它只是意味着你不需要在应用程序模块中重复仓库块,因为它已经设置。
另一种方法是使用子项目块。例如,如果您有多个Android库项目,每个都需要在自己的构建文件中应用库插件。如果所有子项目都是Android库,则可以通过在顶级应用插件来删除重复项,如示例2-25所示。
实例2-25。在顶级构建文件中使用子项目块
subprojects {
apply plugin: 'com.android.library'
}


正如您所期望的,subprojects属性返回一组子项目,而子项目方法将提供的闭包应用于每个子项目。
高级注意事项
如果使用Gradle DSL引用检查Project中的allprojects方法的文档(参见配方6.2中的文档链接),您会发现该方法将参数org.gradle.api.Action作为参数。
更具体地,在实施例2-26中给出了所有项目方法的签名。
实例2-26。项目中所有项目方法的完整签名
void allprojects(Action <?super Project> action)
文档说,此方法对此项目及其每个子项目执行给定的Action。 Action <T>是一个具有单个方法的接口,称为execute,它接受一个通用参数,因此文档似乎暗示您必须创建一个实现Action接口的类,实例化它,并将结果提供为论据。在Java(在Java SE 8之前),这通常作为一个匿名内部类(示例2-27)。
实例2-27。在Java中实现所有项目,使用一个匿名内部类
project.allprojects(new Action<Project>() {
void execute(Project p) {
// do whatever you like with the project
}
});
在Groovy中,您可以通过提供一个闭包作为参数来实现单方法接口。然后闭包将成为该方法的实现。所有项目和子项目方法的Gradle实现是调用集合中每个项目的闭包参数。
如果查看示例2-24中的块,您可以看到结果:代码为allprojects方法提供了一个闭包,说明配置存储库块以使用jcenter()作为其存储库。
注意,Java SE 8引入了以类似方式工作的lambdas。 Java 8 lambdas可以分配给所谓的功能接口,这些接口是仅包含单个抽象方法的接口。 Groovy从语言的开始就已经关闭了。
Gradle 2.0及以上版本支持Java SE 8.然而,Android SDK仍然没有,虽然一些lambda功能计划为Android N以及支持它的Android Studio版本2.1。
  相关解决方案