前言
本文章主要针对Gradle讲解,从入门到实战(Android Studio),让你快速上手Gradle。
一、什么是构建工具?
一个可编程的工具,能够以可执行和有序的任务来表达满足需要的自动化过程。
以Java为例,要得到一个简单可运行的Jar文件,需要下面几步:
- 编译源代码
- 运行测试(前提是你有测试)
- 拷贝Class文件到目标目录
- 打包Class文件为Jar文件
这是一个完整的可自动化的过程,在没有构建工具之前,是由谁来做?IDE。一个强大的IDE,以上的步骤都只需要按几个按钮,这让开发人员的生活变得很美好,完全集中在写出优秀的代码。
二、Java世界的构建工具
在Java的世界里,目前在被使用的常用构建工具有三个:Ant,Maven,Gradle。
Ant的核心是由Java编写,采用XML作为构建脚本,这样就允许你在任何环境下,运行构建。Ant基于任务链思想,任务之间定义依赖,形成先后顺序。缺点是使用XML定义构建脚本,导致脚本臃肿,Ant自身没有为项目构建提供指导,导致每个build脚本都不一样,开发人员对于每个项目都需要去熟悉脚本内容,没有提供在Ant生态环境内的依赖管理工具。
Maven团队意识到Ant的缺陷,采用标准的项目布局,和统一的生命周期,采用约定由于配置的思想,减少构建脚本需要的编写内容,活跃的社区,可以方便找到合适的插件,强大的依赖管理工具。缺点是采用默认的结构和生命周期,太过限制,编写插件扩展麻烦,XML作为构建脚本。
如果有一个构建工具可以折中,同时拥有Ant和Maven的优点,是不是很爽?告诉你有,那就是Gradle。
三、Gradle 构建
Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具。它使用一种基于Groovy的特定领域语言来声明项目设置,而不是传统的XML。
1、Gradle-Wrapper
Gradle可以在没有安装Gradle的情况下使用,这时候就需要Gradle Wrapper了。Gradle Wrapper其实就是一个脚本文件,它会在没有安装Gradle的情况下为我们下载Gradle,之后我们就可以使用gradlew命令,像使用gradle一样来使用Gradle了。
创建项目完毕之后,会发现我们的项目中有如下一些文件:
gradlew (Unix Shell 脚本)
gradlew.bat (Windows批处理文件)
gradle/wrapper/gradle-wrapper.jar (Wrapper JAR文件)
gradle/wrapper/gradle-wrapper.properties (Wrapper属性文件)
我们就可以像使用gradle命令一样使用gradlew了。Gradle Wrapper会自动为我们下载合适的Gradle版本。默认情况下,下载位置是$USER_HOME/.gradle/wrapper/dists,如果设置了GRADLE_USER_HOME环境变量,那么就会下载到GRADLE_USER_HOME/wrapper/dists下。
上面是gradle-wrapper.properties文件中的内容,可以直接编辑文件修改Wrapper的版本,或者使用
gradle wrapper --gradle-version 3.2.1来设置Wrapper的版本
2、 build的生命周期
Gradle的构建脚本生命周期具备三大步,如下:
可以看见,生命周期其实和上面构建脚本Build script的执行流程是可以关联上的。(上面关于Task方面的内容本文中不会使用。)
3、设置脚本Settings script
在对工程进行配置(譬如多项目树构建)时Settings实例与settings.gradle文件一一对应,它用来进行一些项目设置的配置。这个文件一般放置在工程的根目录。譬如:
多模块项目,就是在settings.build 中添加模块名称。 例如:
4、顶层build.gradle文件
构建的时候默认会配置上一个JCenter() 仓库,也可以加上其他的仓库,比如,BRVAH这个第三方框架,就没有放在JCenter里面,因为这个仓库发布的流程比较复杂,时间也比较久,所以就发布在https://jitpack.io 仓库上,所以在使用BRVAH的时候就要在allprojects 中添加jitpack仓库地址。
进入实战
1.BuildConfig和资源
通过配置灵活切换不同环境的接口地址
相信用eclipse开发的时候我们都是用的以下这种方法来切换接口地址的:
这种写法应该都不陌生,那在Gradle构建中,有没有可能用更好的方法来解决这个问题咧?
答案是有可能的!
自SDK工具版本升级到17之后,构建工具都会生成一个叫作BuildConfig的类,该类包含一个按照构建类型设置值的DEBUG常量,可以定义其他的一些属性,Gradle提供了一个buildConfigField 方法 ,下面就是顶一个String类型的BASE_URL常量,值为"http://debug.example.com/api”。
这里要注意的是添加String类型的数据的时候要添加转义的引号,不然是创建不成功的,例如:
在这里还有一个问题,如果开发的是一个多模块项目,那么在library中定义这种属性,默认是不区分debug和release版本的。缺省情况下,无论你选用什么Build variant ,库工程都只会打出release包,这是由于Gralde语言的限制造成的,但如果想强制使用debug,可以如下指定:
2. Gradle修改资源文件信息
配置不同环境的资源文件
同样的Gradle也提供了一个resValue() 方法,下面就是定义了一个app_name的string资源。
但是上面这种定义是错误的,build的时候会报以下这种错误:
提示定义了重复的资源,所以在用resValue()的时候不要在.xml文件定义相同名字的资源数据。
3.gradle.properties 文件
解决频繁同步问题
相信大家在尝试上面的方法的时候有这样一个问题,那就是我们每修改一下.gradle文件,AS工具就提示要”Sync Now”,这样是不是有点麻烦了咧? 下面就可以用到gradle.properties文件来进一步的优化。
4.Gradle配置生成apk文件名
防止release覆盖问题,便于保存历史release记录
参考资料:
http://blog.csdn.net/yanbober/article/details/49314255
http://benweizhu.github.io/blog/2015/01/31/deep-into-gradle-in-action-1/
http://blog.csdn.net/u011054333/article/details/53999590
http://blog.csdn.net/xude1985/article/details/51548245
扩展资料:
http://blog.csdn.net/ljchlx/article/details/43059467