每一次构建都是有至少一个project来完成,每个project有至少一个tasks。每一个build.grade文件代表着一个project,tasks在build.gradle中定义,所以Android studio中的project和Gradle中的project不是一个概念。当初始化构建进程,gradle会基于build文件,集合所有的project和tasks,一个tasks包含了一系列动作对象,这些动作将会按照顺序执行,一个单独的动作对象就是一段待执行的代码,很像Java中的方法。
构建声明周期
执行一个gradle构建最简单的形式是,只执行任务中的动作,而这些任务又依赖于其他任务。为了简化构建过程,构建工具会新建一个动态模型流,叫做 Directed Acclic Grapht(DAG)。这意味着 所有任务都会被一个一个执行,不可能循环执行,一旦一个tasks被执行,那么它不会再次执行了,不包含依赖的Tasks总是优先执行,在构建配置阶段会生成依赖关系图,一次构建将会经历下列三个阶段:
1. 初始化阶段:project实例在这儿创建,如果有多个模块,即有多个build.gradle文件,多个project将会被创建。
2. 配置阶段:在该阶段,build.gradle脚本将会执行,为每个project创建和配置所有的tasks。
3. 执行阶段:这一阶段,gradle会决定哪一个tasks会被执行,哪一个tasks会被执行完全依赖开始构建时传入的参数和当前 所在的文件夹位置有关。
Task
gradlew task 命令 可以打印出所有可用的任务,在新建的android项目中,会包括Android tasks,build tasks,build setup tasks,help tasks,install tasks,verification tasks等多个任务。
• base任务:
android插件依赖于Java插件,而Java插件依赖于base插件。
base插件有基本的tasks生命周期和一些通用的属性。
base插件定义了assemble和clean任务,Java插件定义了check和buildtasks, 在base插件中,这些任务既不被实现,也 不执行任何操作。他们被用来定义插件之间的约定,即添加实际工作的任务。
这些任务约定如下:
· assemble: 集合项目所有的output
· clean: 清除所有的output
· check: 执行所有的checks检查,通常是unit测试和instrumentation测试
· build:同时运行assemble和check
Java插件同时也添加了source sets的概念。android插件构建于这些约定。
• android任务:
android插件扩展了basetasks,并且实现了他们的行为,
android环境下任务所做的事情:
· assemble :为每个构建版本创建一个apk
· clean: 删除所有的构建任务,如apk文件
· check :执行Lint检查 并且能够在Lint检测到错误后停止构建
· build :同时执行assemble和check
assemble tasks默认依赖于assembleDebug和assembleRelease,若添加了更多构建版本,那么就会有更多的任务。
除了这些tasks,android 插件也提供了一些新的tasks:
· connectedCheck :在测试机上执行所有测试任务
· deviceCheck:一个占位任务,专为其他插件在远端设备上运行测试。
· installDebug和installRelease 在设备上安装特定版本
· 所有的install task对应有uninstall 任务
build task依赖于check任务,而不是依赖于connectedCheck或者deviceCheck,执行check任会生成一份Lint报告,lint 报告会包含所有的警告和错误,以及一份详细的说明和一份相关文档的链接,这些报告可以在app/build/outputs目录下, 名为lint-results.html 中查看
As中有一个包含了所有可用任务的工具窗,该工具窗称之为Gradle,如下图:
可以通过双击任务名称来运行摸个任务,然后在Gradle conslose工具窗中跟进正在运行的任务进度。
也可以在Terminal 工具窗下 通过输入相关命令来执行。 为了能使用Gradle Wrapper需要先导航到项目的根目录。
自定义构建
当编写构建文件时,同步很重要。可通过 Tools -->android--> Sync Project with Gradle Files,同步实际上是运行了generateDebugSources 任务来生成所有必须的类。
as的project structure 对话框里可以修改基本的设置,以至于不必手动修改构建文件:
注意:在此界面所做的任何修改都会保存在gradle配置文件中。
BuildConfig 和资源
自SDK升级到17之后,构建工具会生成一个BuildConfig 的类,其包含一个按照构建类型设置值的DEBUG常量。如果有一部分代码指向在debugging时期运行,比如说logging,那么此时可以通过Gradle 来扩展该文件,这样在debug和release时,就会拥有不同的常量。这些常量可以用于切换URL和资源。 如:
字符串必须用转译双引号括起来,这样才会生成实际意义的字符串。添加buildConfigFile 行之后,就可以在java 代码中使用BuildConfig.API_RL 和BuildConfig.LOG_HTTP_CALLS.
或配置资源值:
android{ buildTypes{ debug{ resValue "String", "app_name","Example DEBUG" } releaase{ resValue "String", "app_name","Example" } } }
在这里可以不用加转译双引号因为资源值默认会被包装成value = “”。
本文参考文献: