android studio使用了gradle来自动执行和管理构建流程,gradle很灵活,除了使用基础的gradle闭包外,还可以自定义plugin。以下记录了gradle的初步使用。
1.mac命令行使用gradle
gradle需要且仅需要安装java运行环境,因为Android studio安装包自带了一个版本的gradle,在我的电脑上只需要把其加入系统变量即可.
studio自带的gradle可以在android studio右键-显示包内容中找到,找到后将其配置到环境变量的path目录即可。
Android Studio.app ▸ Contents ▸ gradle ▸ gradle-5.1.1
export PATH=$PATH:Applications/Android\ Studio.app/Contents/gradle/gradle-5.1.1
命令行输入gradle -v
能够显示gradle信息表示表示命令行gradle一切就绪。
2.gradle wrapper使用
加一个这个wrapper的作用是明确构建的gradle版本,wrapper中明确说明了所用的gradle版本,如果在
.gradle/wrapper/dists
下没有找到对应版本的gradle则会先下载再构建。
gradle wrapper在studio中是自己生成的,所用的gradle版本是Android studio内置的版本。AS的gradle视图下显示了gradle內建的很多task,可以在assembleRelease
task右击run
来构建release版的依赖库。
如果不依赖AS,需要生成wrapper的话,则需要执行gradle wrapper
命令,并且可选性的指定--gradle-version
和--distribution-type
,执行完后会生成如下结构目录,其中gradlew
命令和环境变量中的gradle
除版本可能不一样外,其它作用完全一样。在mac下需要使用./gradlew
而非gradlew
。
├── build.gradle
├── settings.gradle
├── gradle
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
└── gradlew.bat
3.build scans使用
build scans是用来生成详细的构建报告的,包括了主机信息、build的日志、构建每步耗时等详细信息,方便自己分析耗时点,或者用于向别人提问时附带的报告。这个功能有网页版和产品版,网页版免费,产品版收费。
使用起来非常简单,在项目根目录下执行:
./gradlew build --scan
然后输入yes
同意条款,等待网址出现,复制到浏览器,输入接收结果的邮箱,进邮箱查看即可。此外build scans还支持添加自定义的项,详细手册请参考官网介绍。
4.自定义task
gradle中Task有Type的概念,每一个特定的Type都有特定的属性和方法,按照我的理解,指定Task为一种type类似于java中类继承,就可以用该Type下的所有字段和方法了。
命令行中可以使用gradle tasks
查看所有的task列表,在AS中可以在gradle视图中直接可视化找到特定task。
Task闭包本身就有属性和方法,常见的属性有dependsOn、name、path
等,常见的方法有
doFirst、doLast、finalizedBy(paths)
等,doFirst表示task执行前执行,doLast表示执行后执行,finalizedBy我理解为将其它任务加入到该任务末尾执行(添加多个任务的haul,执行顺序和书写顺序无关,默认是alpha字母从小到大优先执行),三者顺序为doFirst-finalizedBy-doLast。Project闭包的afterEvaluate
表示gradle配置完成的回调监听,配置完成后表示可以执行task了。
以下假设A、B、C为Base库的三个独立的可选功能模块,现在自定义task将ABC和Base三个moudle打包release版本的aar出来,并复制到releaseAar目录里。
task buildAar(dependsOn: [':Base:assembleRelease']) {
//声明顺序不代表执行顺序,默认是alpha字母从小到大执行
finalizedBy ':C:assembleRelease', ':B:assembleRelease', ':A:assembleRelease'
}
task buildSdk(type: Copy, dependsOn: buildAar) {
from('A/build/outputs/aar') {
include '*-release.aar'
}
from('B/build/outputs/aar') {
include '*-release.aar'
}
from('C/build/outputs/aar') {
include '*-release.aar'
}
from('Base/build/outputs/aar') {
include '*-release.aar'
}
into 'releaseAar'
doLast {
println("sdk构建完成->${destinationDir}")
}
}
参考资料:
网友评论