Gradle简介
Google 推荐使用的 Android Studio采用 Gradle 来构建项目。Gradle 是一个非常先进的项目构建工具。
一、Gradle
Gradle 是用了一种基于 Groovy 的领域特定语言(DSL,Domain Specific Language)来声明项目设置,摒弃了 XML(如 ANT 和 Maven)的各种繁琐配置。
我们通过Android Studio创建的项目中,一般会出现1个settings.gradle和2个或者多个build.gradle 文件,
在Project视图模式下,一个在根目录下,一个在 app 目录下。
1、settings.gradle
这个 settings.gradle文件定义了哪些module 应该被加入到编译过程,对于单个module 的项目可以不用需要这个文件,但是对于 multimodule 的项目我们就需要这个文件,否则gradle 不知道要加载哪些项目。这个文件的代码在初始化阶段就会被执行。
rootProject.name='ActivityTest'
include ':app'
2、根目录下的 build.gradle
(1)repositories 闭包,声明了 jcenter() 的配置。那么这个jcenter是什么意思呢?其实它是一个代码托管仓库,
很多Android 开源项目都会选择将代码托管到jcenter上,声明了这行配置之后,我们就可以在项目中轻松引用任何jcenter上的开源项目了;
(2)dependencies 闭包,使用classpath声明了一个 Gradle 插件。 为什么要声明这个插件呢?因为Gradle并不是专广门为构建Android项目而开发的,Java、 C++等很多种项目都可以使用Gradle来构建。
因此如果我们要想使用它来构建Android项目,则需要声明com.android.tools.build:gradle:3.6.1这个插件。
其中,最后面的部分是插件的版本号,也就是AndroidStudio的版本的版本号,目前使用的AndroidStudio的版本是3.6.1。
// Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.6.1' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { google() jcenter() } } task clean(type: Delete) { delete rootProject.buildDir }
3、app 目录下的build.gradle
这个文件中的内容就要相对复杂一些了,下面我们一行行地进行分析。
(1)apply plugin,声明是 Android 应用程序还是库模块,有两种值可选:
- com..android.application:表示这是一个应用程序模块;
- com.android.library:表示这是一个库模块。
应用程序模块和库模块的最大区别在于,一个是可以直接运行的,一个只能作为代码库依附于别的应用程序模块来运行。
(2)android 闭包,配置构建项目的各种属性
- compileSDKVersion:用于指定项目的编译 SDK 版本;
- buildToolsVersion:用户指定项目构建工具的版本,如果有更新的版本时,Android Studio会进行提示;
- defaultConfig闭包:默认配置:
- applicationId 用于指定项目的包名,前面我们在创建项目的时候其实已经指定过包名了,如果你想在后面对其进行修改,那么就是在这里修改的;
- minSdkVersion用于指定项目最低兼容的Android 系统版本,这里指定成15 表示最低兼容到Android 4.0系统;
- targetSdkVersion 指定的值表示你在该目标版本上已经做过了充分的测试,系统将会为你的应用程序启用一些最新的功能和特性。比如说Android 6.0系统中引入了运行时权限这个功能,如果你将targetSdkVersion指定成23或者更高,那么系统就会为你的程序启用运行时权限功能,而如果你将targetSdkVersion指定成22,那么就说明你的程序最高只在Android5.1系统上做过充分的测试,Android 6.0系统中引人的新功能自然就不会启用了;
- versionCode 用于指定项目的版本号;
- versionName 用于指定项目的版本名,这两个属性在生成安装文件的时候非常重要,我们在后面都会学到;
- buildTypes闭包:指定生成安装文件的配置,通常只会有两个子闭包,一个是debug,一个是release。 debug闭包用于指定生成测试版安装文件的配置,release闭包用于指定生成正式版安装文件的配置。另外,debug闭包是可以忽略不写的,因此我们看到上面的代码中就只有一个release闭包。下面来看一下release闭包中的具体内容吧,minifyEnabled用于指定是否对项目的代码进行混淆,true 表示混淆,false表示不混淆。proguardFiles 用于指定混淆时使用的规则文件,这里指定了两个文件,第一个proguard-android-optimize.txt是在Android SDK目录下的,里面是所有项目通用的混淆规则,第二个proguard-rules.pro是在当前项目的根目录下的,里面可以编写当前项目特有的混淆规则。需要注意的是,通过Android Studio直接运行项目生成的都是测试版安装文件,关于如何生成正式版安装文件我们将会在以后学习。
(3)dependencies 闭包,这个闭包的功能非常强大,它可以指定当前项目所有的依赖关系。
通常Android Studio项目一共有3种依赖方式:本地依赖、库依赖和远程依赖。
本地依赖可以对本地的Jar包或目录添加依赖关系,库依赖可以对项目中的库模块添加依赖关系,远程依赖则可以对jcenter库上的开源项目添加依赖关系。
apply plugin: 'com.android.application' android { compileSdkVersion 29 buildToolsVersion "29.0.2" defaultConfig { applicationId "com.sdbi.activitytest" minSdkVersion 22 targetSdkVersion 29 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'androidx.appcompat:appcompat:1.1.0' testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test.ext:junit:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' }
二、Gradle Wrapper
wrapper的意思是“包装”,这是gradle包装。其实是这样的,因为gradle处于快速迭代阶段,经常发布新版本,如果我们的项目直接去引用,那么更改版本等会变得无比麻烦。
而且每个项目又有可能用不一样的gradle版本,这样去手动配置每一个项目对应的gradle版本就会变得麻烦,gradle的引入本来就是想让大家构建项目变得轻松,如果这样的话,
岂不是又增加了新的麻烦?所以android想到了包装,引入gradle-wrapper,通过读取配置文件中gradle的版本,为每个项目自动的下载和配置gradle,就是这么简单。
这样我们就不用关心如何去下载gradle,如何去配置进项目来。
Gradle 会根据build 文件的配置生成不同的task,我们可以直接单独执行每一个task。通过./gradlew tasks列出所有task。
如果通过同时还想列出每个task 对应依赖的其他task,可以使用./gradlew tasks -all。
Android tasks
有四个基本的 task,Android 继承他们分别进行了自己的实现:
(1)assemble:对所有的 buildType 生成 apk 包。
(2)clean:移除所有的编译输出文件,比如apk
(3)check:执行lint检测编译。
(4)build:同时执行assemble和check命令
这些都是基本的命令,在实际项目中会根据不同的配置,会对这些task 设置不同的依赖。比如,默认的 assmeble 会依赖 assembleDebug 和assembleRelease,
如果直接执行assmeble,最后会编译debug,和release 的所有版本出来。如果我们只需要编译debug 版本,我们可以运行assembleDebug。
除此之外还有一些常用的新增的其他命令,比如 install命令,会将编译后的apk 安装到连接的设备。
(5)install:将编译后的apk 安装到连接的设备
(6)uninstall:卸载apk