使用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 { |
Android组件的build.gradle
一般情况下,我们用到的Android组件有两种,Application和library
下面是构建Application的build.gradle的例子
apply plugin: 'com.android.application' |
在上面例子中,
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 { |
依赖support-v4库的例子
compile 'com.android.support:support-v4:23.0.1' |
依赖library组件的例子
library路径是工程根目录下的lib文件夹
compile project(":lib") |
Signing配置
声明signingConfigs.release的签名配置,
在buildTypes.release 中使用签名
android { buildTypes { } |
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;反之也一样。
![](https://app.yinxiang.com/shard/s51/res/0e67730c-f97c-40f9-b363-f1056d4906b4/%E9%80%89%E5%8C%BA_005.png?resizeSmall&width=894)
执行构建
Gradle执行构建有两种方法
1. 在Android studio中,选择Gradle选项卡,双击assemble<build_type>,执行构建。
比如本文的例子,在app组件下,选择assembleDebug,构建debug版本的apk
选择assembleRelease,构建release版本的apk
![](https://app.yinxiang.com/shard/s51/res/da5cc5e2-0619-4448-8b75-380a1f12e08f/%E9%80%89%E5%8C%BA_006.png?resizeSmall&width=894)
2. 在命令行中执行构建
在terminal中,cd到工程的根目录下
执行./gradlew :app:assembleDebug , 构建app组件的debug版本。
一个工程下可能有多个组件,所以使用:<组件名>来选择构建哪个组件
构建整个工程,执行./gradlew assembleDebug
执行clean
./gradlew clean
查看所有任务
./gradlew tasks
./gradlew tasks