一、Gradle背景
不同于Eclipse,Android Studio是采用Gradle来构建项目的。Gradle是一种依赖管理工具,基于Groovy语言,面向Java应用为主,它抛弃了基于XML的各种繁琐配置,取而代之的是一种基于Groovy的内部领域特定(DSL)语言。
Gradle特性:
- 是一个构建工具
- 以Groovy语言为基础的
- 主要面向的是Java语言
打开Android Studio内置的终端Terminal,在输入如下命令查看gradle版本:
gradlew -v
如果是第一次运行这个命令,系统会帮我们下载gradle到本地,下载到的路径是:
输入上述命令后,查看到gradle的版本2.14.1,如下图所示:
二、Gradle基础配置
使用过Android Studio应该都知道,新建一个工程后,默认会生成两个build.gradle文件,一个位于项目根目录下,一个位于app目录下,还有一个也唯一项目根目录下setting.gradle。下面依次说明这几个文件。
1.setting.gradle
这个文件是全局的项目配置文件,里面主要声明一些需要加入gradle的module,例如:
include ':library', ':app'
2.project/build.gradle
这个文件是整个项目的gradle基础配置文件,一般用来存储构建脚本的版本来源及工程的仓库来源,如下:
buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.2.2' } } allprojects { repositories { jcenter() } }
首先,两处repositories的闭包中都声明了jcenter()这行配置,jcenter其实是个代码托管仓库,很多Android开源项目都会将代码托管到jcenter上,声明了这行配置后,我们就可以在项目中轻松引用任何jcenter上的开源项目了。
接下来,dependencies闭包中使用classpath声明了一个Gradle插件。为什么要声明这个插件呢?因为Gradle并不是专门为构建Android项目而开发的,Java、C++等很多项目都可以使用Gradle来构建,因此如果我们想要使用它来构建Android项目,则需要声明com.android.tools.build:gradle:xxx这个插件。
3.app/build.gradle
该文件面向的是对应的module,一般需要指定module的类型,Android相关信息以及依赖库,如下:
//module类型,常用的如:'com.android.application'、'com.android.library'、'java'、'maven'等。 apply plugin: 'com.android.application' //Android常用配置 android { //编译版本 compileSdkVersion 22 //构建工具版本 buildToolsVersion "22.0.1" //默认配置 defaultConfig { //应用包名 applicationId 'com.xyy.example' //最小版本 minSdkVersion 15 //目标版本 targetSdkVersion 22 //应用版本号 versionCode 1 //应用版本名称 versionName "1.0" } //指定编译版本 compileOptions{ sourceCompatibility JavaVersion.VERSION_1_7 targetCompatibility JavaVersion.VERSION_1_7 } //lint检查配置,默认关闭 lintOptions { abortOnError false } //渠道指定 productFlavors { } //签名配置 signingConfigs { //debug版本 debug { storeFile file('×.keystore') storePassword ××× keyAlias ×××× keyPassword ××× } //release版本 release { //签名文件目录指定,相对于该module storeFile file('×.keystore') storePassword ××× keyAlias ×××× keyPassword ××× } } //构建类型配置 buildTypes { debug { buildConfigField("boolean", "LOG_DEBUG", "true") versionNameSuffix "debug" minifyEnabled false zipAlignEnabled false shrinkResources false signingConfig signingConfigs.debug } release { //添加buildConfig配置字段,可以设置日志打印开关字段,方便发布时自动关闭打印日志 buildConfigField("boolean", "LOG_DEBUG", "false") //在生成的release版本APK后缀中添加"release"字段 versionNameSuffix "release" //是否混淆(特别注意:如果混淆文件未配置使用false) minifyEnabled false //是否支持Zip Align zipAlignEnabled true //是否清理无用资源 shrinkResources true //混淆文件指定 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' //签名指定 signingConfig signingConfigs.release } } } //依赖配置 dependencies { //本地依赖文件树 compile fileTree(dir: 'libs', include: ['*.jar']) //远程依赖 compile '...' //本地依赖文件 compile files('...') //本地依赖工程 compile project('...') }
接下来逐行分析:
1、apply plugin:指明模块的类型,常用的如:com.android.application(表示这是一个应用程序模块,可以直接运行)和com.android.library(表示这是一个库模块,作为代码库依附于别的应用程序模块来运行)。
2、android闭包:在这个闭包中可以配置项目构建的各种属性。compileSdkVersion用于指定项目的编译版本,这里指定成25表示使用Android7.1系统的SDK编译。buildToolsVersion用于指定项目构建工具的版本。
3、defaultConfig闭包:defaultConfig闭包中可以对项目的更多细节进行配置。其中applicationId用于指定项目的包名,minSdkVersion用于指定项目最低兼容的Android系统版本,这里指定成18表明最低兼容到Android4.3系统。targetSdkVersion指定的值表示你在该目标版本上已经做了充分的测试,系统将会为你的应用程序启用一些最新的功能和特性。比如说Android6.0系统中引用了运行时权限这个功能,如果你将targetSdkVersion指定成23或者更高,那种系统就会为你的程序启动运行时权限功能,而如果你将targetSdkVersion 指定成22,那么说明你的程序最高只在Android5.1系统上做过充分的测试,Android6.0系统中引入的新功能自如就不会启用。versionCode用于指定项目的版本号,versionName用于指定项目的版本名。
4、buildTypes闭包:buildTypes闭包中用于指定生成安装文件的相关配置,通常会有两个子闭包,一个是debug(可以忽略不写),一个是release。debug闭包用于生成测试版安装文件的配置,release闭包用于生成正式版安装文件的配置。下面来,看看release闭包中的具体内容,minifyEnabled用于指定是否对项目的代码进行混淆,proguardFiles用于指定混淆时使用的规则文件,这里指定了两个文件,第一个proguard-android.txt是Android SDK目录下的,里面是所有项目通用的混淆规则,第二个proguard-rules.pro是当前项目的根目录下的,里面可以编写当前项目特有的混淆规则。
5、lintOptions闭包:该闭包用于lint检查的配置。
6、productFlavors闭包:该闭包用于渠道指定。
7、signingConfigs闭包:该闭包用于签名配置,一般有两个子闭包,一个debug,一个release。
8、dependencies闭包:这个闭包功能非常强大,它可以指定当前项目的所有依赖关系。通常有三种依赖方式:本地依赖、库依赖、远程依赖。本地依赖可以对本地的jar包添加依赖关系,库依赖可以对项目中的库模块添加依赖关系,远程依赖则可以对jcenter库上的开源项目添加依赖关系。
compile fileTree(dir: 'libs', include: ['*.jar']):表示将libs目录下所有.jar后缀的文件都添加到项目的构建路径中。
compile [group]:[name]:[version]:就是一个标准的远程依赖库格式,例如compile "com.android.support:appcompat-v7:24.2.1",其中 com.android.support是域名部分,用于和其他公司的库作区分,appcompat-v7是组名称,用于和同一公司中不同的库做区分;24.2.1就是版本号了,用于和同一个库不同的版本做区分。
compile project(':库模块名字'):是库依赖声明的基本格式,例如有一个库模块的名字叫library,那么添加这个库的依赖关系只需要加入compile project(':library')
compile files('libs/xxx.jar'):是对本地文件夹下的jar包进行依赖。
三、Gradle常用命令
- gradlew -v 版本号
- gradlew build 检查依赖并编译打包
- gradlew assembleDebug 编译并打Debug包
- gradlew assembleRelease 编译并打Release的包
- gradlew installRelease Release模式打包并安装
- gradlew uninstallRelease 卸载Release模式包