Gradle
首先介绍一下 Gradle。
Gradle 是一个基于JVM的构建工具,这种工具使用的语言是 Groovy,即 build.gradle
里使用的语言。Gradle 能够配置一些编译的选项,也能添加一些开源库的引用。
扔一段维基的介绍:
Gradle 是一个基于 Apache Ant 和 Apache Maven 概念的项目自动化建构工具。它使用一种基于 Groovy 的特定领域语言来声明项目设置,而不是传统的XML。
当前其支持的语言限于Java、Groovy 和 Scala,计划未来将支持更多的语言。
Gradle Files 分析
当我们要创建一个android项目时,我们会打开Android Studio,新建一个 Project,然后会看到如下的目录结构:
黄色框住的区域是gradle相关的配置文件,本文就简单介绍一下剩下的 Gradle 相关的内容。
Gradle 有几个重要的文件,顶层的setting.gradle
、build.gradle
文件、每个 Module 自己的build.gradle
文件,gradle.properties
文件,local.properties
文件,gradle
目录。
为了以后的和谐相处,下面依次认识一下这几位 Gradle 家族成员:
1. setting.gradle:
include ':app'
这个 setting 文件定义了哪些 module 应该被加入到编译过程,对于 multi module 的项目我们需要这个文件,它告诉 gradle 要加载哪些 module。
对于一个新建的纯净项目,里面只定义了默认的 app
module,后续有新的 module 的话都会自动在此处添加,当然也可以手动删掉。
* setting.gradle
里也可以用 Groovy 语言写一些方法,这些方法在初始化项目时就被执行,做一些编译前的处理。
2. 顶层的build.gradle:
buildscript {
repositories {
jcenter()
maven { url 'https://dl.google.com/dl/android/maven2/' }
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
}
}
allprojects {
repositories {
jcenter()
}
}
- buildscript:
repositories
引用了一些代码仓库,比如jcenter()
就是一个著名的 Maven 仓库,也可以用自定义的 url 来引用一些其他的仓库。dependencies
引用了一些 Android 插件,此处是 gradle 插件。 - allprojects:其中定义的属性会被应用到所有的 module 中。
3. module里的的build.gradle:
apply plugin: 'com.android.application'
#apply plugin: 'com.android.library'
android {
compileSdkVersion 26
buildToolsVersion "26.0.1"
defaultConfig {
applicationId "com.morning.android.glory"
minSdkVersion 21
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:26.+'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12'
}
-
apply plugin: 这一行代码应用了一些 android 应用的插件,此处的
'com.android.application'
表示这个 module 是主工程,对于子工程,对应要用'com.android.library'
-
android 代码块:这里有对此 module 的所有配置,例如版本号,应用id,编译配置等。
-
defaultConfig:就是程序的默认配置,注意,如果在AndroidMainfest.xml里面定义了与这里相同的属性,会以这里的为主。
特别说明一下,applicationId
定义了包名,这里的定义只作为程序的唯一识别 ID。而AndroidManifest.xml
中定义的package="com.morning.android.glory"
才会影响R
文件的路径名。 - buildTypes:定义了编译类型,针对每个类型我们可以有不同的编译配置。默认的有debug、release 的类型。
-
defaultConfig:就是程序的默认配置,注意,如果在AndroidMainfest.xml里面定义了与这里相同的属性,会以这里的为主。
-
dependencies:属于gradle 的依赖配置。它定义了当前项目需要依赖的其他库。一般我们在 github 上遇到喜欢的库想用到项目中,就可以在这里添加引用了。
这里特别说一下引用库的版本号,一般不要用26.+
这种版本号的写法,因为‘+‘号会导致每次编译时都会查询有没有更新版本,导致编译速度变慢,而且会用到一些不稳定的 beta 版。对于公司的正经项目,就还是不要去冒这个险了,需要升级的话手动升级就可以。
4. gradle.properties:
org.gradle.parallel=true
org.gradle.daemon=true
org.gradle.configureondemand=true
org.gradle.jvmargs=-Xmx4608m -XX:MaxPermSize=1g -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 -XX:-UseParNewGC -XX:-UseConcMarkSweepGC -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC
COMPILE_SDK_VERSION=26
BUILD_TOOLS_VERSION=26.0.1
SUPPORT_LIBS_VERSION=26.0.1
这个里面可以配置参数,然后在其他build.gradle中引用
5. local.properties:
sdk.dir=/Users/zhouying/Library/Android/sdk
这里主要定义了sdk和ndk的路径,这个文件一般不会提交到公共仓库中,可以保留一些本地的配置。
6. gradle 目录
在讲 gradle 目录之前,我们需要先了解一下 Gradle Wrapper 的概念。如下。
Gradle Wrapper
Gradle 可以在没有安装 Gradle 的情况下使用,这时候就需要 Gradle Wrapper 了。Gradle Wrapper 其实就是一个脚本文件,它会在没有安装 Gradle 的情况下为我们下载Gradle,之后我们就可以使用 gradlew
命令了。
创建 Gradle Wrapper 文件
使用 gradle wrapper 来创建一组 Wrapper 文件。Gradle 官方建议我们在所有 Gradle 项目中都创建 Wrapper 文件,方便没有安装 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 版本。
Andorid Studio 创建项目时,已经替我们做了这一步,即生成了最上图黄色框中的 6. gradle 目录,所以我们不需要自己运行命令来创建 graldle wrapper 文件。
设置 Wrapper版本
使用 gradle wrapper --gradle-version 3.2.1
来设置Wrapper的版本。或者也可以直接编辑 gradle/wrapper/gradle-wrapper.properties
文件来修改版本。
文件内容如下,可以修改最后面的 "gradle-3.5-bin.zip" 来配置版本。
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-3.5-bin.zip
小结
Gradle 的存在就是为了构建。我们知道 java 代码需要经过编译生成 ·class
文件,然后打包成 dex,最后得到一个可以安装的 apk 包。Gradle 就是执行这一过程的构建工具。
除了构建,Gradle 还有一些其他“副业”,比如对于项目各种打包选项的配置,是生成 debug 包还是 release 包,对于各 Module 的管理,使用一些 jcenter 或 maven 的开源项目等。这些功能都使 Gradle 变得更加丰富,也为开发者提供了更多便利。