本文Demo的完整工程代码, 参考这里的StudyPackage
目录
什么是Gradle
虽然原文定义又长又晦涩, 但是为了准确性, 还是引用Wiki中Gradle的定义如下
Gradle is an open source build automation system that builds upon the concepts of Apache Ant and Apache Maven and introduces a Groovy-based domain-specific language (DSL) instead of the XML form used by Apache Maven of declaring the project configuration.[2] Gradle uses a directed acyclic graph ("DAG") to determine the order in which tasks can be run.
介绍完"学院派"的定义, 我们来看看"世俗派"的定义
Gradle是一种构建工具, 它可以帮你管理项目中的差异, 依赖, 编译, 打包, 部署......, 你可以定义满足自己需要的构建逻辑, 写入到build.gradle中供日后复用
更多可以参考如何通俗地理解 Gradle?
就我个人的理解
Gradle就是用来解决除Coding以外对开发的所有常见需求(差异, 依赖, 编译, 打包, 部署......)
为什么是Gradle
工具总是会有很多种, 那为什么偏偏就是Gradle呢? Gradle官方的解释如下
-
Polyglot Builds - 支持多种语言(例如Java, Scala, Python, C/C++, Android, IOS and many many more)
-
Tool Integrations - 集成开发工具
-
Robust Dependency Management - 强大的依赖管理
-
Powerful Yet Concise Logic - 简洁但强大的逻辑
-
High Performance Builds - 高性能构建
-
Build Reporting - 编译结果报告
介绍完"自卖自夸"的定义, 其实Marven与Gradle最核心的分歧在于
Marven基于XML, 而Gradle基于Groovy的DSL(Domain Specific Language) -- 一种图灵完备的构建语言
所以Gradle的表达更加
- 简洁 - XML依赖的写法很繁琐, 而Gradle只要一句话, 例如
compile 'com.android.support:appcompat-v7:24.2.0'
- 智能 - 例如Gradle支持动态版本依赖, 例如
testCompile ‘junit:junit:4.+'
Gradle的安装
使用Android Studio构建项目时, IDE会帮我们下载和安装Gradle
-
Mac上会默认下载到/Users/<用户名>/.gradle/wrapper/dists目录
-
Windows平台会默认下载到C:\Documents and Settings<用户名>.gradle\wrapper\dists目录
由于Gradle无法"正常访问"导致Android Studio会经常"假死", 所以可以离线下载(参考AndroidDevTools), 然后拷贝至相应目录
Gradle项目结构
使用Android Studio创建的Gradle项目的典型目录结构如下
gradle_01.png其中与Gradle相关的文件主要有
gradle_02.pngGradle相关文件
build.gradle
build.gradle是Gradle的核心配置文件, 它一般分为两种
- 根目录配置文件, 例如build.gradle(Project: StudyPackage)
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
根目录配置文件中定义的是所有子模块的公共配置, 例如: 仓库源为jcenter(), android gradle plugin的版本
- 模块的配置文件, 例如build.gradle(Module: app)
apply plugin: 'com.android.application' // 声明是Android程序
android {
compileSdkVersion 24 // 编译SDK的版本
buildToolsVersion "24.0.2" // build tools的版本
defaultConfig {
applicationId "com.example.yuanlin.studypackage" // 应用包名
minSdkVersion 21
targetSdkVersion 24
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']) // 编译libs目录下的所有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:24.2.0'
testCompile 'junit:junit:4.12'
}
模块的配置文件中定义的都是当前模块的Gradle配置
settings.gradle
这是全局的项目配置文件, 里面声明了需要加入gradle的module, 例如
include ':app'
gradle.properties
gradle.properties是gradle的配置文件
其中可以定义一些常量供build.gradle使用, 比如可以配置签名相关信息如keystore位置, 密码, keyalias等, build.gradle就可以直接引用, 因此
gradle中的一些配置参数建议写到gradle.properties
例如google/iosched的gradle.properties中配置了
###############################################################################
# App variables.
###############################################################################
# If versions end in odd numbers they are development builds, even versions are release candidates.
# The AndroidManifest.xml must also be updated currently.
version_code = 333
version_name = 3.3.3
......
模块中的build.gradle就可以这样引用
......
android {
compileSdkVersion 23
buildToolsVersion "23.0.1"
defaultConfig {
version "${version_code}"
versionName "${version_name}"
minSdkVersion 14
targetSdkVersion 22
......
}
}
......
local.properties
该文件描述的是SDK的路径, 例如
sdk.dir=/Users/yuanlin/Workspace/android-sdk
需要注意的是
- Android Studio会自动生成该该文件, 所以一般需要配置该文件, 只有当不使用Android Studio时, 才自己配置
该文件不需要添加到版本控制系统中
Gradle Wrapper
为什么要使用Gradle Wrapper
如果开发者配置了Gradle Wrapper, 那么在其他开发者构建该项目时, 可以直接执行如下命令
./gradlew [task] // Mac OS/Linux
gradlew [task] // Windows
当用户第一次执行上面的命令时, Wrapper会自动地下载并安装对应版本的Gradle, 这样
用户不必自己下载、安装、配置Gradle; 用户进行项目构建时能够确保使用正确的Gradle版本
Gradle Wrapper需要哪些文件
在配置了Wrapper的Gradle项目中, 有以下文件
|--gradle
|---- wrapper
|---- gradle-wrapper.jar
|---- gradle-wrapper.properties
|--gradlew (Mac OS/Linux)
|--gradlew.bat (Windows)
其中gradler-wrapper.properties文件的内容大概如下
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip
以上文件都需要添加到版本控制系统中
Gradle Wrapper的基本使用
-
./gradlew -v - 版本信息
-
./gradlew clean - 清除build和app/build目录
-
./gradlew build - 检查依赖并编译打包(注意这里会将debug、release包都打出来)
-
./gradlew assembleDebug - 编译并打Debug包
-
./gradlew assembleRelease - 编译并打Release的包
关于更多GradleWrapper的使用, 可以参考帮助: ./gradlew -h
Gradle编译优化
这里的优化方法主要参考Making Gradle builds faster
配置编译选项
-
--dry-run: Runs the builds with all task actions disabled
-
--configure-on-demand: Only relevant projects are configured in this build run. This means faster build for large multi-project builds
-
--daemon: Uses the Gradle daemon to run the build. Starts the daemon if not running
-
--parallel: Build projects in parallel. Gradle will attempt to determine the optimal number of executor threads to use
这些配置选项还可以添加系统全局配置文件~/.gradle/gradle.properties中
echo 'org.gradle.configureondemand=true' >> ~/.gradle/gradle.properties
echo 'org.gradle.daemon=true' >> ~/.gradle/gradle.properties
echo 'org.gradle.parallel=true' >> ~/.gradle/gradle.properties
经过实际测试, 对编译速度有明显提升的主要还是--daemon
使用最新版本的Gradle
Offline work
如果项目的Gradle和依赖没有更新, 还可以勾选Offline work来加快编译速度
gradle_03.png参考
更多文章, 请支持我的个人博客
网友评论