Gradle学习笔记
Posted 阳光照不到的王国
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Gradle学习笔记相关的知识,希望对你有一定的参考价值。
Gradle学习笔记
阅读《android Gradle 权威指南》一书。整理的笔记和在阅读过程中所遇到的问题汇总。
由于在练习的过程中,书中没有给出源码的路径。所以我在码云上新建了一个仓库,供大家学习交流。
注意事项
由于在操作的过程中,书中定义task时多次出现 <<
,我在编写的时候尝试带上此操作符发现会报以下错误:
* What went wrong:
A problem occurred evaluating project ':example36'.
> Could not find method leftShift() for arguments [build_565owqk7wezxvbgca5o3lr6xv$_run_closure1@2ba5c254] on task ':example36:ex36Hello' of type org.gradle.api.DefaultTask.
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
* Get more help at https://help.gradle.org
BUILD FAILED in 721ms
经过查阅资料发现,操作符 <<
在Gradle 4.x中被弃用(deprecated),并且在Gradle 5.0 被移除(removed)
解决方法是
1、回退gradle版本
2、直接删除<<
操作符号(推荐使用此方法,简单快捷)
环境设置
本机系统:macOS Big Sur 11.4
gradle版本:gradle-6.7
由于之前开发安卓的过程中已经下载过gradle,所以不需要再去gradle.org官网再下载了。找到本机的gradle目录,将其添加到系统环境变量中就可以使用gradle命令了。步骤如下
-
gradle 目录路径
/Users/wangbl/.gradle/wrapper/dists/gradle-6.7-all/cuy9mc7upwgwgeb72wkcrupxe/gradle-6.7
我的电脑中存在多个版本的gradle,所以我选择了本机最新的gradle-6.7版本进行学习。 -
添加到系统环境变量
vim ~/.zshrc 在.zshrc文件中添加以下内容 # Gradle Path GRADLE_HOME=/Users/wangbl/.gradle/wrapper/dists/gradle-6.7-all/cuy9mc7upwgwgeb72wkcrupxe/gradle-6.7 export PATH=$GRADLE_HOME/bin:$PATH # 添加完成之后保存退出并执行source ~/.zshrc
-
检验gradle环境是否配置成功;gradle -v 显示如下内容即表示gradle环境配置成功。
Wrapper理解
wrapper是对gradle的封装。可通过gradle wrapper来生成gradle目录、gradlew(Linux下的可执行脚本)、gradlew.bat(Windows下的执行脚本)。文件结构如下:
其中配置了gradle-wrapper.properties gradle的版本。在安卓开发过程中,这些生成的文件也会提交到git仓库中,这样当其它人员down下来我们的代码时会自动下载gradle-wrapper.properties中配置的gradle版本。
gradle-wrapper.properties内容说明
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\\://services.gradle.org/distributions/gradle-6.5-all.zip
字段名 | 说明 |
---|---|
distributionBase | 下载的Gradle压缩包解压后的存储的主目录 |
distributionPath | 相对于distributionBase的解压后的Gradle压缩包的路径 |
zipStoreBase | 同distributionBase,只不过存放的是zip的路径 |
zipStorePath | 同distributionPath,只不过存放的是zip的路径 |
distributionUrl | Gradle发行版压缩包的下载地址 |
字符串
Groovy可以用单引号和双引号定义字符串;单引号和双引号的区别在于,单引号中是纯粹的字符串,不能做运算;而双引号可以。例如:
task printStringVar
def name = "张三"
println '单引号的计算变量:$name'
println "双引号的计算变量:$name"
./gradlew printStringVar 执行上面的task输入的结果为:
List
与Java的区别就是Groovy的下标可以从-1开始,表示的就是最后一个元素;
1…3这种是一个范围索引,中间用两个’.'分开,表示访问第二个到第四个之间的元素,包含第二个和第四个。
//定义一个List
task printList
def numList = [1,2,4,5,6]
println numList.getClass().name
//访问第二个元素
println numList[1]
//访问最后一个元素
println numList[-1]
//访问倒数第二个元素
println numList[-2]
//访问第二个到第四个之间的元素,包含第二个和第四个
println numList[1..3]
//遍历List
numList.each
println it
函数
通过def定义个函数,如果函数有return值的话,默认可以不使用return语句。Groovy会把方法执行过程中的最后一句代码当做其返回值
//顶一个函数来比较两个数的大小,返回较大的那个数;并且不使用return,在Groovy中,我们定义有返回值的方法时,return语句是不必需的。当没有return语句时,Groovy会会把方法执行过程中的最后一句代码当做其返回值
def method2(int a,int b)
if (a < b)
b
else
a
闭包
一段被花括号包围的代码。
//定义一个List
task printList
def numList = [1,2,4,5,6]
println numList.getClass().name
//遍历List,常规写法
numList.each(println it)
//格式化一下,好看一点
numList.each(
println it
)
//Groovy规定如果方法的最后一个函数是闭包的话,可以将其放到外面
numList.each()
println it
//然后方法可以省略,就变成下面我们经常看到的样子
numList.each
println it
任务依赖
任务之间是可以有依赖关系的,这样我们能控制哪些任务先于哪些任务执行。
task firstTask
print "hello"
/**
* description
*/
task secondTask (dependsOn:firstTask)
doLast
println 'main'
task thirdTask
dependsOn firstTask,secondTask
doLast
println 'multiTask'
任务的onlyIf断言
断言就是一个条件表达式。onlyIf接受一个闭包作为参数,如果该闭包返回true则执行此任务,否则跳过。应用场景为多渠道分发应用时。
final String BUILD_APPS_ALL = "all";
final String BUILD_APPS_SHOUFA = "shoufa";
final String BUILD_APPS_EXCLUDE_SHOUFA = "exclude_shoufa";
task ex48QQRelease
doLast
println "打应用宝的包"
task ex48BaiduRelease
doLast
println "打百度的包"
task ex48HuaweiRelease
doLast
println "打华为的包"
task ex48MiuiRelease
doLast
println "打Miui的包"
task build1
group BasePlugin.BUILD_GROUP
description "打渠道包"
build1.dependsOn ex48QQRelease,ex48BaiduRelease,ex48HuaweiRelease,ex48MiuiRelease
ex48QQRelease.onlyIf
def execute = false;
if (project.hasProperty("build_apps"))
Object buildApps = project.property("build_apps")
if (BUILD_APPS_SHOUFA.equals(buildApps) || BUILD_APPS_ALL.equals(buildApps))
execute = true
else
execute = false
else
execute = true
execute
ex48BaiduRelease.onlyIf
def execute = false;
if (project.hasProperty("build_apps"))
Object buildApps = project.property("build_apps")
if (BUILD_APPS_SHOUFA.equals(buildApps) || BUILD_APPS_ALL.equals(buildApps))
execute = true
else
execute = false
else
execute = true
execute
ex48HuaweiRelease.onlyIf
def execute = false;
if (project.hasProperty("build_apps"))
Object buildApps = project.property("build_apps")
if (BUILD_APPS_EXCLUDE_SHOUFA.equals(buildApps) || BUILD_APPS_ALL.equals(buildApps))
execute = true
else
execute = false
else
execute = true
execute
ex48MiuiRelease.onlyIf
def execute = false;
if (project.hasProperty("build_apps"))
Object buildApps = project.property("build_apps")
if (BUILD_APPS_EXCLUDE_SHOUFA.equals(buildApps) || BUILD_APPS_ALL.equals(buildApps))
execute = true
else
execute = false
else
execute = true
execute
其中百度和应用宝是首发包,华为和Miui是非首发包。
-
打所有渠道的包时执行
gradlew :example48:build1
-
当需要打首发包时执行以下命令
gradlew -P build_apps=shoufa :example48:build1
-
当需要打非首发渠道的包时执行下面的命令
gradlew -P build_apps=exclude_shoufa :example48:build1
练习的代码会更新到码云仓库,需要的小伙伴也可以收藏下。
以上是关于Gradle学习笔记的主要内容,如果未能解决你的问题,请参考以下文章