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的路径
distributionUrlGradle发行版压缩包的下载地址

字符串

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学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

Gradle学习笔记

Gradle学习笔记之Groovy

gradle 教程学习笔记

gradle 教程学习笔记

Gradle学习笔记

Android Gradle 学习笔记1