tags: [android,gradle,CI/CD]
categories: gradle
top: true
toc: true
cover: true
img: /featureImg/gradle.png
summary: 进入自动化构建的世界
—-
Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,目前也增加了基于Kotlin语言的kotlin-based DSL。
关于自动化构建
为什么要使用自动化构建工具
想当年java刚入门的时候,先写一个文件,然后javac编译,再执行看看结果。javac就是一个构建工具,它从源代码生成一个可以执行的程序,但是它并不是自动化的,学习的时候一个个文件手动去编译还情有可原,但是真到工作中,一个项目上千个文件都是少的,而且不会有什么项目是从零开始一点点手写的,肯定要依赖很多现成的代码库,这样不仅要编译,还需要去处理依赖库的版本冲突,单纯靠手动构建肯定寸步难行。
所以各个语言都有各自的自动化构建工具来将我们从源代码生成程序的过程中解放出来。java有ant、maven、gradle等,js有Grunt,c/c++这种偏底层的语言也有cmake,学习这些工具可以让我们更进一步的了解编译的过程发生了什么,我们也可以做一些自定义构建来提升自己的开发效率。
gradle的优势
还在使用eclipse开发android的黑暗时代,经常会碰到库和主工程中的 android-support-v4.jar 版本不统一编译不过。这就是因为eclipse默认使用的是ant进行构建,而ant没有管理依赖的功能,这也是当时这些痛苦的源头
maven作为一个构建工具我暂时没使用过,但是它相比ant增加了依赖管理的功能,gradle中也充分继承了maven的优势,可以无缝使用现有的maven仓库
gradle相对于ant/maven还有一个更重要的优点,ant/maven处理自定义的构建需求使用的是xml,而gradle使用的是groovy/kotlin/java这种完备的语言,在自定义构建的过程中就可以使用java中大部分的代码资源作为支持。
gradle的表达能力要强过ant/maven非常多,所以也是在AndroidStudio带着gradle在android开发领域流行开来之后,各种构建过程中的奇技淫巧才百花齐放
Gradle in Android
简单介绍下android项目中gradle的基础配置的含义
setting.gradle
include ':app'
主要用来配置项目结构
root build.gradle
//针对的是构建工具也就是gradle的配置,而不是项目本身buildscript {//配置了一个全局的变量ext.kotlin_version = '1.3.41'//配置gradle依赖的中央仓库repositories {google()jcenter()//本地maven库mavenLocal()//如果被墙了依赖下不下来,可以使用阿里的中央仓库maven{ url 'https://maven.aliyun.com/repository/google'}maven{ url 'https://maven.aliyun.com/repository/jcenter'}maven{ url 'https://maven.aliyun.com/repository/gradle-plugin'}}//配置构建过程需要依赖的代码库//这些库只在构建过程中起作用,不会打到apk中dependencies {classpath 'com.android.tools.build:gradle:3.4.2'classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"}}//配置所有项目依赖的中央仓库,module中依赖的库都会从配置的中央仓库中找并下载allprojects {repositories {google()jcenter()//本地maven库mavenLocal()//如果被墙了依赖下不下来,可以使用阿里的中央仓库maven{ url 'https://maven.aliyun.com/repository/google'}maven{ url 'https://maven.aliyun.com/repository/jcenter'}}}//自定义了一个名为clean的tasktask clean(type: Delete) {delete rootProject.buildDir}
app build.gradle
//apply plugin: 'xxx'表示这个module使用了某个gradle插件//会在项目初始化的时候根据插件的功能去做一些事情apply plugin: 'com.android.application'apply plugin: 'kotlin-android'apply plugin: 'kotlin-android-extensions'//android的相关配置android {compileSdkVersion 28buildToolsVersion "29.0.2"//默认配置,可以根据variant不同有不同的配置defaultConfig {applicationId "me.sunhapper.myapplication"minSdkVersion 16targetSdkVersion 28versionCode 1versionName "1.0"//指定自动化测试的Runner,后期的文章应该会介绍到testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"}//根据不同的buildType处理不同的配置buildTypes {release {//是否进行资源压缩、混淆minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}}//依赖dependencies {//普通的依赖implementation fileTree(dir: 'libs', include: ['*.jar'])implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"implementation 'com.android.support:appcompat-v7:28.0.0'implementation 'com.android.support.constraint:constraint-layout:1.1.3'implementation 'com.android.support:design:28.0.0'//java自动化测试的依赖testImplementation 'junit:junit:4.12'//android自动化测试的依赖androidTestImplementation 'com.android.support.test:runner:1.0.2'androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'}
gradle还可以用来做什么
除了进行工程配置/依赖管理之外gradle还能做什么呢?其实只要是在编译期可以完成的工作,gradle几乎都可以做到,这里简单列举几个例子
- 多渠道打包
- 代码生成(aop/依赖注入/orm等)
- 自动发布
- 资源压缩
- 混淆处理
- 增量编译
- 静态检查
- 自动化测试
- ……
to be continue
下篇文章将介绍一些android中配置gradle的进阶用法,包括依赖版本冲突的处理,如何使用本地maven库等
