一.gradle 是什么?
Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置,使的它更简洁,灵活而且gradle完全兼容maven和ivy。
二.gradle 在 AS 中的表现形式
AS 中的 Project 是一个工作空间,可以包含很多不同的 module,有些module是可以独立运行的,有些是公共库。 在AS 中project 会对应一个 build.gradle ,每个 modle
对应一个 build.gradle,这个 build.gradle 文件就是 gradle的配置文件。
这是一个android工程的project视图,上面那个是module下的build.gradle文件。下面那个是project下的build.gradle文件。这两个文件是有区别的,project下的build.gradle是基于整个project的配置,而module下的build.gradle是每个模块自己的配置。下面看下这两个build.gradle里面的内容:
project#build.gradle:
-
buildscript {
-
//构建过程依赖的仓库
-
repositories {
-
jcenter()
-
}
-
//构建过程需要依赖的库
-
dependencies {
-
//下面声明的是gradle插件的版本
-
classpath 'com.android.tools.build:gradle:1.1.0'
-
// NOTE: Do not place your application dependencies here; they belong
-
// in the individual module build.gradle files
-
}
-
}
-
//这里面配置整个项目依赖的仓库,这样每个module就不用配置仓库了
-
allprojects {
-
repositories {
-
jcenter()
-
}
-
}
module#build.gradle:
-
//声明插件,这是一个android程序,如果是android库,应该是com.android.library
-
apply plugin: 'com.android.application'
-
android {
-
//安卓构建过程需要配置的参数
-
compileSdkVersion 21//编译版本
-
buildToolsVersion "21.1.2"//buildtool版本
-
defaultConfig {//默认配置,会同时应用到debug和release版本上
-
applicationId "com.taobao.startupanim"//包名
-
minSdkVersion 15
-
targetSdkVersion 21
-
versionCode 1
-
versionName "1.0"
-
}
-
buildTypes {
-
//这里面可以配置debug和release版本的一些参数,比如混淆、签名配置等
-
release {
-
//release版本
-
minifyEnabled false//是否开启混淆
-
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//混淆文件位置
-
}
-
}
-
}
-
dependencies {
-
//模块依赖
-
compile fileTree(dir: 'libs', include: ['*.jar'])//依赖libs目录下所有jar包
-
compile 'com.android.support:appcompat-v7:21.0.3'//依赖appcompat库
-
}
defaultConfig中是一些基本配置,它会同时应用到debug/release版本上,下面列举了所有可配项及对应的值:
buildTypes结点很重要,这里可以配置构建的版本的一些参数,默认有两个构建版本release/debug,当然你可以自定义一个构建版本,比如叫foo,然后通过gradlew assembleFoo就可以生成对应的apk了。
buildTypes里还有很多可配置项,下面列举了所有可配项以及debug/release版本的默认值:
include ':module-a',':module-b'
-
maven{
-
url "..."
-
}
-
ivy{
-
url "..."
-
}
-
flatDir{
-
dirs 'xxx'
-
}
-
repositories{
-
mavenCentral()
-
jcenter()
-
mavenLocal()
-
}
-
assemble 构建项目输出
-
check 运行检测和测试任务
-
build 运行assemble和check
-
clean 清理输出任务
gradlew assemble
它通常会执行:
-
gradlew assembleDebug
-
gradlew assembleRelease
-
chmod +x gradlew
-
./gradlew assemble
gradlew tasks
列出所有可用的任务。在Android Studio中可以打开右侧gradle视图查看所有任务。
四.常见问题
1.导入本地jar包:跟eclipse不太一样,android studio导入本地jar除了将jar包放到模块的libs目录中以外,还得在该模块的build.gradle中进行配置,配置方式是在dependencies结点下进行如下声明:
compile files('libs/xxx.jar')
如果libs下有多个jar文件,可以这样声明:
compile fileTree(dir: 'libs', include: ['*.jar'])
2.导入maven库:compile 'com.android.support:appcompat-v7:21.0.3'
可见,格式为compile 'groupId:artifactId:version'
3.导入某个project:你的app是多模块的,假设有两个模块app和module-A,并且app模块是依赖module-A的,这时候我们就需要在app模块的build.gradle中的dependencies结点下配置依赖:
compile project(':module-A')
并且你需要在settings.gradle中把module-A模块包含进来:include ':module-A',':app'
此外,这种情况下module-A模块是作为库存在的,因而它的build.gradle中的插件声明通常应该是这样的:apply plugin: 'com.android.library'
而且,作为library的模块module-A的build.gradle文件的defaultConfig中是不允许声明applicationId的,这点需要注意。4.声明三方maven仓库:
可能你项目需要的一些库文件是在你们公司的私服上,这时候repositories中仅有jcenter就不行了,你还需要把私服地址配到里面来,注意,应该配到project的build.gradle中的allprojects结点下或者直接配到某个模块中如果仅有这个模块用到。
配置方式:
-
repositories{
-
maven{
-
url="http://mvnrepo.xxx.com"
-
}
-
}
compile 'com.aaa.xxx:core:1.0.1@aar'
6.将库项目导出为aar:
首先你的项目必须是一个库项目,build.gradle中进行配置:apply plugin : 'com.android.library'
然后你可以在命令行中进到项目目录,执行如下gradle任务:gradlew assembleRelease//确保该目录下有gradlew文件
生成的aar在/build/output/aar文件夹中
7.引用本地aar:首先将aar文件放到模块的libs目录下,然后在该模块的build.gradle中声明flat仓库:
-
repositories{
-
flatDir{
-
dirs 'libs'
-
}
-
}
-
dependencies{
-
compile (name:'xxx',ext:'aar')
-
}
当出现依赖冲突的时候可以通过排除依赖解决,具体方式如下:
-
compile (group:'xxx',name:'xxx',version:'xxx'){
-
exclude group:'xxx',module:'xxx'//module对应的就是artifactId
-
}
首先在build.gradle的buildConfig中增加如下配置:
multiDexEnabled true
接着,在dependencies结点下增加如下依赖:
-
dependencies{
-
compile 'com.android.support:multidex:1.0.0'
-
}
最后,让你的Application继承MultiDexApplication,如果你的应用没有声明Application,可以在manifest文件的application结点下增加name属性,值为android.support.multidex.MultiDexApplication。
详细内容参见官方文档。
10.自动移除不用资源
可以在buildTypes结点中增加如下配置:
-
buildTypes{
-
release{
-
minifyEnabled true
-
shrinkResources true
-
}
-
}
可以在build.gradle文件中的android结点下增加如下配置:
-
android{
-
lintOptions{
-
abortOnError false
-
}
-
}
可以在build.gradle文件中的android结点下增加如下配置:
-
compileOptions {
-
sourceCompatibility JavaVersion.VERSION_1_7
-
targetCompatibility JavaVersion.VERSION_1_7
-
}
首先在module的build.gradle中增加这些字段:
-
storeFiles:keystore文件存储位置,通常是.jks文件
-
storePassword 密码
-
keyAlias keystore别名
-
keyPassword 密码
首先在build.gradle的android结点下增加如下配置:
-
signingConfigs {
-
//debug版本的签名配置,通常不用配,因为有默认的debug签名
-
debug {
-
}
-
release {
-
storeFile file("key.jks")
-
storePassword "123456"
-
keyAlias "mykey"
-
keyPassword "123456"
-
}
-
}
signingConfig android.signingCongfigs.debug
位置为${home}\.android\debug.keystore
然后在buildTypes结点下的对应版本中添加上面的配置:
-
buildTypes{
-
release{
-
signingConfig signingConfigs.release
-
}
-
}
-
android {
-
signingConfigs {
-
debug {
-
storeFile file("debug.keystore")
-
}
-
myConfig {
-
storeFile file("other.keystore")
-
storePassword "android"
-
keyAlias "androiddebugkey"
-
keyPassword "android"
-
}
-
}
-
buildTypes {
-
foo {
-
debuggable true
-
jniDebuggable true
-
signingConfig signingConfigs.myConfig
-
}
-
}
-
}
-
RELEASE_STOREFILE=xxx.jks
-
RELEASE_STORE_PASSWORD=123456
-
RELEASE_KEY_ALIAS=mykey
-
RELEASE_KEY_PASSWORD=123456
-
storeFile file(RELEASE_STOREFILE)
-
storePassword RELEASE_STORE_PASSWORD
-
keyAlias RELEASE_KEY_ALIAS
-
keyPassword RELEASE_KEY_PASSWORD
在build.gradle中配置:
-
buildTypes{
-
release{
-
buildConfigField "string","type","\"release\""
-
}
-
debug{
-
buildConfigField "string","type","\"debug\""
-
}
-
}
-
//build/generate/source/buildConfig/release/包名/ 路径下的BuildConfig.java
-
public static final String type = "release"
-
//build/generate/source/buildConfig/debug/包名/ 路径下的BuildConfig.java
-
public static final String type = "debug"