Gradle
gradle入门:liuwangshu.cn/application…
使用as创建gradle插件项目:blog.csdn.net/a646796992/…
是什么:是一个编程工具 做什么:构建项目的工具
gradle执行流程图
-
初始化阶段:首先执行setting.gradle文件,读出工程有几个project,为所有的project构建对象
-
在配置阶段:解析所有projects对象中的task,生成有向无环图(task的依赖关系图)
主要监听配置阶段,是gradle执行的核心
-
执行阶段:执行所有task及其以来的task
生命周期监听
//配置阶段开始前
this.beforeEvaluate {
println '配置阶段开始前'
}
//配置阶段完成后
this.afterEvaluate {
println '配置阶段开始hou '
}
//gradle执行完毕后
this.gradle.buildFinished {
println 'gradle执行完毕后 '
}
this.gradle.beforeProject {
println 'beforeProject '
}
this.gradle.afterProject {
println 'afterProject '
}
复制代码
执行build(是一个task),要先执行他所依赖的task
所有的都是project
module也是project,每个poject所有一个build.gradle 文件
查看项目的所有project执行
./gradlew project
根project下多个子project
根project:管理子project
子project:对应输出,例如上面的app 会对应输出一个apk,Alibrary会对应一个aar的输出
如果是Java项目每个子project对应一个jar包的生成
project API
得到所有project
this.getAllprojects()
注意:所有build.gradle和setting.gradle的代码或方法都是在配置阶段执行的
得到当前项目的所有子project
this.getSubprojects()
得到当前项目的父project
this.getParent().name
得到当前项目的根project
this.getRootProject().name
在根project的gradle文件里,寻找指定的子project方法
project('子project名字')
也可以在父project里完成对子project的配置,一般不这样做
配置当前project以及他下面的所有子project
allprojects{}
配置当前project下面的所有子project
subprojects {}
apply from: 导包project 属性api
默认属性
定义变量
扩展属性
在父project里通过subprojects给所有子project定义扩展属性
直接在根project定义扩展属性
使用根project的属性
this.rootProject.xxx,也可以直接使用父类属性(继承关系)
把所有属性定义在一个gradle文件里,然后引入
引入gradle文件使用属性
在gradle.properties里定义扩展属性
使用 注意:定义在这里的属性直接拿到的时候object,要转一下类型才能用 xxx.toInteger() xxx.toBoolean()file文件api
注意:只支持在同一个项目里进行copy,不能脱离这个项目 跨工程可以用groove的方法
获取目录路径
file(path)
注意这个方法传入的是相对路径拷贝
文件拷贝
copy {
from file("src/main/AndroidManifest.xml")
into getRootDir()
}
复制代码
文件夹拷贝
拷贝其他操作
文件树遍历
遍历apk目录下的所有文件,打印每一个文件的名字(element是文件节点) 并且把每一个文件拷贝到test文件夹里面的
依赖相关api
buildscript
一般都是闭包的简略写法,这里为了理解,全部把参数写出来
配置仓库地址
简单写法buildscript {
ext.kotlin_version = '1.3.10'
repositories {
google()
jcenter()
}
复制代码
Maven仓库配置
简写
buildscript里的dependencies为工程引入插件地址
与project里的dependencies不同,为程序引入第三方库地址
依赖冲突
compile和provided的区别
compile 在打包后,会把依赖内容达到apk里 provided (占位编译)只会在编译器使用这个依赖,不会打包到apk里 一个使用场景是
- 只在编译器起作用,不在运行期起作用
- 如果主工程所依赖的库工程中的依赖库已经在主工程中已用过了,那么在库过程中就不需要再次通过compile引入这个依赖了,而是应该通过占位编译方式provided,让在编译过程中通过,但是在不要打包到apk,因为最后使用的是主工程里的依赖 ,减少apk大小
执行外部命令
Task
Task定义和配置
查看项目中的task
./gradlew tasks
定义Task
方式一:直接通过Task函数创建
task helloTask{
print('I am a Task...')
}
复制代码
执行Task
.gradlew xxxtask
this.tasks.create(name:'HelloTask2'){
print('I am a Task2...............')
}
复制代码
TaskContainer 管理-查找-添加-创建Task
查询Task
创建Task
配置Task
group 分为一个组
其他配置
在Gradle执行阶段执行代码 doFirst doLast
执行顺序:先外部在内部一个例子:计算build执行时长
在系统的task执行前后使用doFirst doLast,执行我们自己的语句
####为什么第一个task是preBuild
build Task 执行了多少task
执行顺序,依赖指定方法
方式一:静态指定,定义时候就知道要依赖哪一个task==>通过dependsOn
指定了依赖之后,执行taskZ,会先执行taskX,taskY 也可以通过下面的方法来指定依赖方式二:动态指定,开始定义不知道要依赖哪一个,通过代码输出来指定依赖===>内部通过dependsOn方法
依赖所有以lib开头的task
小例子
解析这个xml文件,把每个xml节点输出到一个文件里
开始写task
再写一个task测试上面的task
修改
执行结果
task输入输出
input :是所有的数据类型和文件
output:只能是文件输入输出例子
主要看这里 会先执行输出属性,在执行输入属性 先writeTask再readTask
新建一个测试task,依赖了两个task,而readTask和writeTask之间有输入输出关系,依赖先执行,输出先执行,再执行输入
方式三 执行顺序 mustRunAfter
可以指定多个 数组方式
如何将自己的task插入到系统的构建task之间
自己的manifestTask在processManifest之后运行 processResources还依赖了manifestTask 那么manifestTask在processResources和processManifest之间运行task总结
持续集成工具 Jenkins
安装
- 一 创建环境变量
2. 下载、执行war包默认的安装目录不好
3. 浏览器输入localhost:8080,输入密码即可
配置
安装下面几个插件
点击安装完成之后,配置一个新的账户密码(不再用之前的那个密码的给你录了),然后下一步
开始配置
JDK 配置jdk地址为
其他插件配置都类似
新建任务
其他
SourceSet
约定大于配置 不配置就是用约定
- jni目录默认在jinlibs里,修改为libs
2.创建多个资源文件夹,分模块
也可以在外部添加sourceset代码android对gradle的扩展
公共属性
Application变体的属性
修改apk名字获取变体的task variant.taskname
例子
比较靠前的task checkMenifestgradle 迁移
两种方式,一般用第二种改造
迁移
直接迁移,会自动生成以下的配置,指定新的源码、资源等的位置
改造
直接把eclipse项目的源码、资源、lib复制到新的gradle项目中对应的位置