Androidstudio不仅可以让你为你的app和依赖库创建模块,还可以为Androidwear、AndroidTV、GoogleAppEngine等,以及这些单独的Modules又可以在单独的项目中使用。例如,在应用开发的后期阶段,您可能需要使用GoogleCloud或AndroidWear。在这种情况下,您的项目下可以有三个模块:app、googlecloud和AndroidWearintegration。了解如何在一个项目下构建多个模块将加快您的开发周期。在本章中,我们将学习多模块构建,并展示一些实用且有用的示例:多模块构建结构将模块添加到项目中建议的多模块构建结构通常,一个项目包含多个模块,这些模块将位于父目录文件夹。为了告诉gradle项目的结构以及哪些子文件夹包含模块,你需要提供一个settings.gradle文件。每个模块都可以提供其独立的build.gradle文件。我们已经了解了setting.gradle和build.gradle是如何正常工作的,现在我们只需要学习如何使用它们。这是多模块工程的结构图:project├────setting.gradle├────build.gradle├────app│└────build.gradle└────library└────build.gradle这是创建多模块项目最简单直接的方法。setting.gradle文件声明了项目下的所有模块,应该是这样的:include':app',':library'这样可以保证app和library模块会被包含在构建配置中。您需要做的就是为您的模块添加子文件夹。为了将库模块作为依赖项添加到您的应用程序模块,您需要将以下内容添加到应用程序的build.gradle文件中:dependencies{compileproject(':library')}要将模块作为依赖项添加到您的应用程序,你需要使用project()方法,这个方法的参数是模块路径。如果你的模块还包含子模块,gradle可以满足你的要求。例如,你可以定义你的目录结构如下:project├────setting.gradle├────build.grade├────app│└────build.gradle└────libraries├────library1│└────build.gradle└────library2└────build.gradle应用模块仍然位于根目录,但现在项目有2个不同的依赖项。这些依赖模块并不位于项目的根目录下,而是位于特定的依赖文件夹中。根据这个结构,你需要在settings.xml中定义如下:include':app',':libraries:library1',':libraries:library2'你会注意到在子目录中声明模块非常容易。所有路径都围绕根目录,即当你添加一个位于子文件夹的模块作为另一个模块的依赖包时,你应该将路径设置为根目录。也就是说,如果上面例子中的app模块要依赖library1,build.gradle文件需要声明:dependencies{compileproject(':libraries:library1')}如果在子目录下声明依赖,所有路径都应该是相对的到根目录。这是因为gradle是根据你项目的根目录来定义你的依赖的。构建生命周期了解构建过程可以轻松理解多模块构建。我们很久以前就讨论过构建生命周期。所以现在你应该知道了基本的过程,但是一些重要的细节你可能不是很清楚。在第一步,初始化阶段,gradle会找到settings.grade文件。如果该文件不存在,则gradle将假定您只有一个构建模块。如果您有多个模块,settings.gradle文件会定义这些模块所在的位置。如果这些子目录包含它们自己的build.gradle文件,gradle将运行它们并将它们合并到构建任务中。这就解释了为什么需要在相对于根目录的模块中声明依赖关系。一旦理解了构建任务如何将所有模块组合在一起,就很容易理解构建多个模块的几种不同策略。您可以在根build.gradle中配置所有模块。这使您可以轻松浏览到整个项目的配置,但这可能会变得一团糟,尤其是当您的模块需要不同的插件时。另一种方法是将每个模块的配置分开。这种策略保证了各个模块之间不会相互干扰。它还可以更轻松地跟踪对构建的更改,因为您不需要指出哪些更改导致了哪些模块中的错误等。gradle的最佳策略是混合。可以在根目录下定义一个构建文件,为所有模块定义相同的熟悉度,然后在每个模块中的构建文件中配置只属于该模块的参数。Androidstudio遵循这个原则,在根目录下创建一个build.gradle文件,然后在每个module文件夹下创建另一个build文件。模块任务当你的项目中有多个模块时,你需要在运行任务之前考虑一下。当您从命令行运行任务时,gradle会找出哪个模块将执行该任务。例如,当您有一个移动应用程序模块和一个AndroidWear模块时,您可以运行gradlewassembleDebug任务。当您更改其中一个模块的文件夹位置时,gradle将只运行该特定模块,即使您在根目录中使用gradle包装器也是如此。例如,当您在Androidwear模块目录中运行../gradlewassembleDebug时,它只会构建Androidwear模块。在不同的文件夹之间切换以执行不同的任务可能会令人沮丧,幸运的是,还有其他方法。您可以准备一个特殊任务来执行您的模块。例如,要仅构建AndroidWear模块,只需从根目录运行gradlew:wear:assembleDebug。将模块添加到项目中在AndroidStudio中添加新模块很容易,视图还会为您创建构建文件。如下图所示:添加Java依赖库当你创建一个新的Java模块时,build.grade文件将如下所示:applyplugin:'java'dependencies{compilefileTree(dir:'libs',include:['*.jar'])}Java模块使用了Java插件,这意味着许多Android功能在这里无法使用,因为您不需要它们。构建文件也有基本的库管理,你可以在libs文件夹中添加jar文件。可以根据第三章的内容添加更多的依赖库。将Java模块添加到您的应用程序模块很容易,不是吗?dependencies{compileproject(':javalib')}这告诉gradle导入一个名为javelin的模块,如果您将此依赖项添加到您的应用程序模块,那么javalib模块将始终在您的应用程序模块构建之前构建。添加Android依赖库同样,我们使用Androidstudio的GUI创建一个Android模块,然后它的构建文件如下:包含Android资源,例如清单和字符串,以及布局文件。导入该模块后,您可以使用该模块的所有类和资源文件。建议我对多模块项目有一点建议,有些事情你应该注意,这会节省你的时间。Androidstudio运行模块任务当你有多个模块时,Androidstudio会分析它们并在cradle:grade图形中显示它们,方便你在模块之间运行任务,但它不会同时运行所有模块的任务,所以如果你想这样做,最快的方法是使用命令行。加速你的多模块构建当你构建你的多模块项目时,gradle会顺序执行所有模块。当您的计算机有足够的内存时,将构建过程设置为多线程会更快。这个特性在gradle中已经存在,但是默认是关闭的。所以如果你想开始并行构建,你需要在grade.properties文件中配置如下属性:org.gradle.parallel=truegradle会选择尽可能多的线程来执行你的构建过程,每个线程会执行一个模块。parallel执行独立的模块,也就是你的模块是独立的。模块耦合意味着你可以在一个模块中引用其他模块的属性,但我不建议你这样做。我们可以在根目录下的构建文件中定义这些属性。总结我们学习了如何在项目中构建多个模块,以及添加新模块如何影响构建任务的执行。我们学习了相关的例子并提出了一些建议。在下一章中,我们将学习测试以及如何使用gradle使您的测试更轻松。我们将学习如何在jvm中运行单元测试,以及如何在手机上运行测试。
