Gradle 是Android 项目的默认构建工具,每个Android 朋友都知道它。但真正了解Gradle的人并不多。接下来,小婷会讲一下Gradle比ant、Maven等传统构建工具有何优势,以及Gradle是什么以及它包含哪些内容。这可以让您对Gradle 构建项目有一个整体的看法和理解。
Gradle、ant、maven有什么区别?
Gradle比ant或maven强大得多。 Ant和Maven是XML配置。 Gradle使用Groovy编程语言,这使得它具有可编程性并且更加灵活。作为一种编程语言,你可以开发插件,并且有很多第三方插件库。
Gradle执行流程
Gradle执行过程涉及三个部分:初始化、配置、运行。
初始化:解析所有项目并构建项目对象。运行settings.gradle 文件。
配置:分析项目中的所有任务并构建任务拓扑图。
运行:运行所有任务。
监控执行过程:如果想要监控Gradle执行过程并在适当的时候注入处理逻辑,则需要以下接口。
beforeEvalueate {} 或gradle.beforeProject {} //在配置阶段之前运行
afterEvaluate {} 或gradle.afterProject {} //在配置阶段之后运行
gradle.buildFinished {} //执行阶段后执行
gradle.addListener //添加自定义监听器
等级配置
Gradle 由三部分组成:Groovy、构建脚本块和Gradle API。
Groovy 语言是Gradle 使用的编程语言,具有可编程、灵活、方便的特点。
构建脚本块:这意味着如果您想要执行某些功能,则需要使用Groovy 语言创建脚本块。
Gradle API 是Gradle 提供的一组API,旨在使构建过程的编程变得更加容易。
摇篮API
包括项目、任务、属性、文件、Gradle 生命周期等。
项目
build.gradle对应的是Project对象。
任务
您可以创建在Gradle 执行期间在特定时间运行逻辑的任务。
意义:
task hello(group: 'hello', description:'hello task') {println 'hello task!' //配置阶段运行doFirst {println 'task group is:' + group //执行阶段运行}} 示例:统计打包时间
def startBuildTime, endBuildTimethis.afterEvaluate { Project project -//确保您要查找的任务已设置def preBuildTask=project.tasks.getByName(''preBuild)preBuildTask.doFirst {startBuildTime=System.currentTimeMillis() }def buildTask=project.tasks.getByName('build')buildTask.doLast {endBuildTime=System.currentTimeMillis()println "Build time is : ${endBuildTime - startBuildTime}"}} 扩展:基于统计打包,可以按顺序删除一些测试任务以优化构建时间。
任务执行顺序:
由于构建APK 需要使用许多任务,因此任务的运行顺序决定了哪些任务先运行,哪些任务后运行。
task task1 {doLast {println 'task1'}}task task2 {doLast {println 'task2'}}task task3(dependsOn: [task1, task2]) { //dependentOn 应该在闭包中写为doLast {println 'task3'}您还可以}任务输入和输出:
task writeTask { //指定任务的输入inputs.property('versionCode', this.versionCode)inputs.property('versionName', this.versionName)//指定任务的输出Outputs.file destFiledoLast { def data=input.getProperties ()File file=Outputs.getFiles().getSingleFile()//将map转换为实体对象def versionMsg=new VersionMsg(data)def stringWriter=new StringWriter()def xmlBuilder=new MarkupBuilder(stringWriter )if (file.text !=null file.text.size()=0) {//文件没有内容xmlBuilder.releases {release {versionCode(versionMsg.versionCode)versionName(versionMsg.versionName)}} file.withWriter {writer - Writer.append( stringWriter .toString())}}}} 将自定义任务挂钩到构建过程中:
this.project.afterEvaluate { project -def buildTask=project.tasks.getByName('build')if (buildTask==null) { throw GradleException('未找到构建任务')}buildTask.doLast {writeTask.execute( )} }环境
settings.gradle 文件对应于Settings 对象。 Gradle初始化过程执行该文件。
源集
该功能是改变Gradle默认约定的文件位置。 Gradle 要求规则大于配置。也就是说,如果不更改配置,它将遵循默认规则。例如,从java文件夹中获取源代码,从res文件夹中获取资源。但是,您可以通过SourceSet 更改代码、资源等的位置。
android {.sourceSets {main {jniLibs.srcDirs=['libs'] //更改SO库存储位置res.srcDirs=['src/main/res','src/main/res-ad ','src/main/res-pay'] //更改资源存储位置}}} 插件
1.定义插件类
class ExamplePluginimplements PluginProject {@Overridevoid apply(Project project) {println ‘Hello ’ + project.nameproject.extensions.create(‘Custom Alias’, Custom Class)}} 自定义任务类必须继承自DefaultTask 类。
class ExampleTask extends DefaultTask {ExampleTask() {group='amy'description='example'} //Gradle执行阶段运行的代码@TaskActionvoid doAction() {.}} 2.在配置文件中指定插件类
3.添加到build.gradle文件
plugin: ‘插件名称’ 应用自定义别名{……}Android 和Java 插件扩展到Gradle
Android 对Gradle 的扩展主要是配置变体。
android {.} 配置脚本块设置是变体设置。还可以通过检索Android 项目的变体来获取此信息。
Java 的Gradle 扩展比Android 简单得多,主要是在jar 打包等功能方面。
现在,这就是Gradle 的全部内容。通过上面的介绍,希望您已经对Gradle有了一个大概的了解。后续我会写一篇文章介绍构建apk的整个任务流程,敬请期待。
版权声明:本文由今日头条转载,如有侵犯您的版权,请联系本站编辑删除。