使用Gradle构建Android工程

Gradle是以Groovy语言为基础,基于DSL语法的构建工具,它通过插件的方式定制工程构建过程。Google开发了Android Gradle插件,使用Gradle构建Android工程。
Gradle构建Android工程,我们可以在Android studio中使用,也可以在命令行中使用,也可以集成到持久化集成工具中。
 
Gradle构建Android工程的配置文件名是build.gradle,存放在工程的根目录下。
一个Android工程(Project)是由一个或多个组件(Module)组成,工程和组件都分别有各自的build.gradle
 
Android工程的build.gradle
一般情况下,我们不需要修改Android工程的build.gradle,工程级别的build.gradle定义gradle的基本配置。
buildscript->dependencies 中声明gradle依赖的Android插件以及版本号
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.3.0'

// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}

allprojects {
repositories {
jcenter()
}
}
 
Android组件的build.gradle
一般情况下,我们用到的Android组件有两种,Application和library
下面是构建Application的build.gradle的例子 
apply plugin: 'com.android.application'

android {
compileSdkVersion 23
buildToolsVersion "21.1.2"

defaultConfig {
applicationId "com.han.myexampleapp2"
minSdkVersion 8
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:23.0.1'
}
 
在上面例子中,
apply plugin: 'com.android.application' 表示gradle要使用Android插件来构建。
android{} 中定义android相关的构建选项
compileSdkVersion 表示要使用的Android sdk的版本
buildToolsVersion 表示编译工具的版本,编译工具使用SDK Manager管理(Android studio->Tools->Android->SDK Manager)
defaultConfig 用来配置基本的构建属性和manifest(AndroidManifest.xml)属性。可以配置的属性如下表所示,如果属性在defaultConfig配置,相应的AndroidManifest.xml中的设置项会被覆盖。
applicationId "com.han.myexampleapp2" applicationId属性用来标识Android application的唯一标识。
关于build.gradle中的applicationId与AndroidManifest.xml的packageName的不同,可以参考这篇文章
https://chaosleong.gitbooks.io/gradle-for-android/content/appendix/applicationid_versus_packagename.html


下表是defaultConfig可以配置的属性:
Property Name  Default value in DSL object  Default value
 versionCode  -1  value from manifest if present
 versionName  null  value from manifest if present
 minSdkVersion  -1  value from manifest if present
 targetSdkVersion  -1  value from manifest if present
 applicationId  null  value from manifest if present
 testApplicationId  null  applicationId + “.test”
 testInstrumentationRunner  null  android.test.InstrumentationTestRunner
 signingConfig  null  null
 proguardFile  N/A (set only)  N/A (set only)
 proguardFiles  N/A (set only)  N/A (set only) 

buildTypes配置怎样构建和打包组件,默认情况下,gradle会构建两种类型: release和debug
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
proguardFiles 声明使用的Proguard文件,
getDefaultProguardFile('proguard-android.txt')包含了默认的Proguard配置。
在'proguard-rules.pro'文件中,我们可以添加自定义的proguard配置,
'proguard-rules.pro'文件在组件根目录下。
minifyEnabled 控制gradle在构建时是否进行代码混淆,true为构建时执行代码混淆

下表是buildTypes可以配置的属性
 Property name  Default values for debug  Default values for release / other
 debuggable  true  false
 jniDebuggable  false  false
 renderscriptDebuggable  false  false
 renderscriptOptimLevel  3  3
 applicationIdSuffix  null  null
 versionNameSuffix  null  null
 signingConfig  android.signingConfigs.debug  null
 zipAlignEnabled  false  true
 minifyEnabled  false  false
 proguardFile  N/A (set only)  N/A (set only)
 proguardFiles  N/A (set only)  N/A (set only)

dependencies元素声明了要构建的组件依赖关系。
compile fileTree(dir: 'libs', include: ['*.jar']) 表示依赖libs目录下的所有.jar文件
compile 'com.android.support:appcompat-v7:23.0.1' 标识依赖版本是23.0.1的android support库
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:23.0.1'
}
 
依赖support-v4库的例子
compile 'com.android.support:support-v4:23.0.1'
 
依赖library组件的例子
library路径是工程根目录下的lib文件夹
 compile project(":lib")
 
 
Signing配置
声明signingConfigs.release的签名配置,
在buildTypes.release 中使用签名
android {
signingConfigs {
release {
storeFile file('release.keystore')
}
}

    buildTypes {
release {
...
signingConfig signingConfigs.release
}
}
}
 
Product Flavor
当同一个app组件需要构建两种不同版本时,需要用到Product flavor,
下面的例子,声明了两种product flavor,demo和full,
两种product flavor构建不同的app,包名分别是"com.buildsystemexample.app.demo"和"com.buildsystemexample.app.full"
 
android {
    ...
    defaultConfig { ... }
    signingConfigs { ... }
    buildTypes { ... }
    productFlavors {
        demo {
            applicationId "com.buildsystemexample.app.demo"
            versionName "1.0-demo"
        }
        full {
            applicationId "com.buildsystemexample.app.full"
            versionName "1.0-full"
        }
    }
}
 
productFlavors和defaultConfig是相同的类型,也就是可配置的属性相同。在实际应用中,defaultConfig配置flavor相同的属性,
flavor不同的属性在各自flavor中声明。
 
Build Variant
Product flavor + Build type = BuildVariant
gradle根据用户选择的BuildVariant,进行构建
比如Product flavor 有 flavor1 和 flavor2 两种,
Build type 有debug 和 release 两种,
则 build variant 会有四种, 分别是 flavor1Debug, flavor1Release,  flavor2Debug, flavor2Relese
 
如果工程没有定义product flavor, gradle会使用默认的flavor, build variant就是 build type名字。
 
源文件目录
src/main 默认的源文件目录
src/<buildType> 构建<buildType>时用到的源文件目录,可选的
src/<productFlavor> 构建<productFlavor>时用到的源文件目录, 可选的
 
build.gradle与Android Studio的关系
 
在Android studio 右键选中组件,如下图所示
android studio 展示的组件属性跟build.gradle是对应的,修改了android studio中的配置,会自动更新到build.gradle;反之也一样。
执行构建
Gradle执行构建有两种方法
1. 在Android studio中,选择Gradle选项卡,双击assemble<build_type>,执行构建。
比如本文的例子,在app组件下,选择assembleDebug,构建debug版本的apk
选择assembleRelease,构建release版本的apk
2. 在命令行中执行构建
在terminal中,cd到工程的根目录下
执行./gradlew :app:assembleDebug , 构建app组件的debug版本。
一个工程下可能有多个组件,所以使用:<组件名>来选择构建哪个组件
 
构建整个工程,执行./gradlew assembleDebug
 
执行clean
./gradlew clean
 
查看所有任务
./gradlew tasks
 
 
原文地址:https://www.cnblogs.com/tonyhan/p/4819767.html