1.1 Gradle概念
Gradle是一个基于Apache ant和Apache maven概念的项目自动化构建工具。它使用一种基于Groovy的特定领域语言来声明项目设置,而不是传统的xml,当前其支持的语言限于java、groovy和scala[3],计划未来将支持更多的语言。
1.2 Gradle的优势
1:自动处理包相依关系;
2:自动处理布署问题;
3:条件判断写法直觉;
过去 Java 开发者常用 Maven 和 Ant 等工具进行封装布署的自动化,或是两者兼用,不过这两个包彼此有优缺点,如果频繁改变相依包版本,使用 Ant 相当麻烦,如果琐碎工作很多,Maven 功能不足,而且两者都使用 XML 描述,相当不利于设计 if、switch 等判段式,即使写了可读性也不佳,而 Gradle 改良了过去 Maven、Ant 带给开发者的问题,至今也成为 Android Studio 内置的封装布署工具。
1.3 Gradle基础
在gradle中最重要的两个概念是 项目 和 任务 ,每一次构建都包括至少一个项目,每个项目又包括一个或者多个任务。每一个build.gradle文件就代表着一个项目,任务定义在项目的构建脚本里,当初始化构建过程时,gradle会基于build文件自动组装项目和任务对象。一个任务对象包含一系列的动作对象,这些动作对象之后会按照顺序执行。一个单独的动作对象就是一个待执行的代码块。
1.3.1 构建生命周期
一个gradle的构建通常有如下三个阶段
a:初始化-项目实例会在该阶段被创建。
如果一个项目有多个模块,并且每一个模块都有其对应得build.gradle文件,那么就会创建多个项目实例;
b:配置-在该阶段,构建脚本会被执行,并为每个项目实例创建和配置任务;
c:执行-在该阶段,gradle将决定哪个任务会被执行,哪些任务会被执行取决于开始该次构建的参数配置和该gradle文件的当前目录;
1.3.2 构建配置文件
每一个基于gradle构建的项目,都会有一个build.gradle文件,android的构建文件中有一些是必需的:
aaply plugin: 'com.android.application'
buildscript{
repositories{
jcenter()
}
dependencies{
classpath 'com.android.tools.build:gradle:1.2.3'
}
}
1.3.3 项目结构
/src/main/java -- 应用的源代码
/src/main/res -- 应用相关的资源文件
/libs --外部库
/build -- 构建过程的输出
1.4 Gradle wrapper入门
gradle是一个不断发展的工具,新版本可能会打破向后兼容性,而使用gradle wrapper可以避免这个问题,并能确保构建是可复用的;
我们打开android studio可以看见有一个gradle文件夹,如图1所示
(图1)
这里的gradle-wrapper.properties文件就是用来指定当前项目构建使用的gradle地址;
当项目中使用的不是最新的Gradle版本时,android studio就会显示一个提醒,提示并建议你自动更新gradle版本,原理是android studio修改了gradle-wrapper.properties的配置并触发了一次构建,这样最新的Gradle就会被下载;
1.5 基本自定义构建
1.5.1 理解gradle文件
当使用studio创建一个新项目时,会默认生成三个gradle文件。其中的两个文件--setting.gradle和build.gradle文件位于项目的根目录,另外一个build.gradle文件则在android app模块内,下边我们分别介绍这几个gradle文件的用途;
a:setting.gradle -setting文件在gradle初始化阶段被执行,并且定义了哪些模块应该被包含在构建中,新建android项目时默认只有 app一个模块,对于多模块项目必须要有setting.gradle文件,否则,gradle不知道哪个模块应该被包含在构建内;
b:根项目的build.gradle文件,默认情况下其包含如下两个代码块
buildscript{
repositories{
jcenter()
}
dependencies{
classpath 'com.android.tools.build:gradle:1.2.3'
}
}
allprojects{
repositories{
jcenter()
}
}
其中jcenter是一个很有名的maven库,denpendenies代码块用于配置构建过程中的依赖包;
c:模块的构建文件,包含以下文件
1:插件
apply plugin : 'com.android.application',
2: android脚本
android{
compileSdkVersion 22
buildToolsVersion "22.0.1"
defaultConfig{
applicationid "com.baidu.cn"
versionName "1.0"
versionCode 1
}
buildTypes {
release{
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'
}
}
}
3: 依赖包
依赖包是标准gradle配置的一部分,其定义了一个应用或依赖项目的所有依赖包,默认情况下,一个新的android应用,在libs文件夹下对所有jar文件构成依赖。
1.5.2 任务讲解
任务包括基础任务(java基础插件提供基础服务支持)和android任务(android插件扩展了java基础插件提供android任务支持);
基础任务包括 :
assemble:集合项目的输出;
clean :清理项目的输出;
check:运行所有检查,通常是单元测试和集成测试;
build:同时运行assemble和check;
android任务包括:
build:同时运行assemble和check任务,可以生成若干apk文件;
help:
install:安装apk文件到移动设备或者模拟器;
other:
verification:
1.5.3 自定义构建
1.5.3.1 操控manifest文件
我们可以在项目的build.gradle文件下边配置applicationid,minSdkVersion,targetSdkVersion,versionCode,versionName,signingConfig,proguardFile等任务。
在该文件下配置的选项默认会被构建进系统中,当没有被配置时才会去manifest文件查找;
1.5.3.2 BuildConfig和资源文件
自android sdk升级到17以后,构建工具会自动生成一个BuildConfig的类,该类包含一个按照构建类型设置值的DEBUG常量,如果有些功能只需要在debugging时期运行,那么我们就可以根据此常量来区分,示例代码如下:
android{
buildTypes{
debug{
buildConfigField "String", "api_uirl","/"http://com.example.com/api/""
buildConfigField "boolean", "LOG_HTTP_CALLS","true"
resValue "string","app_name","example debug" // (修改应用在桌面的现实名称)
}
release{
buildConfigField "String", "api_uirl","/"http://com.example.com/api/""
buildConfigField "boolean", "LOG_HTTP_CALLS","true"
resValue "string","app_name","example" //(修改应用在桌面的现实名称)
}
}}
1.5.3.3 项目属性,ext代码块
ext {
supportVersion ='25.0.1'
frescoVersion ='0.14.1'
}
下边我们就可以直接应用定义的属性
dependencies {
compile"com.android.support:percent:${supportVersion}"
compile"com.android.support:recyclerview-v7:${supportVersion}"
compile"com.android.support:appcompat-v7:${supportVersion}"
compile"com.android.support:support-v4:${supportVersion}"
compile"com.android.support:design:${supportVersion}"
}
1.5.3.4 默认的任务
如果没有指定任何任务而运行gradle的话,其会运行help任务,我们在顶层build.gradle文件中加入一行,可用来指定默认任务:
defaultTasks 'clean' ,'assembleDebug'
当你运行没有任何参数的gradle wrapper时,他会运行clean和assembledebug任务;
1.6 创建构建Variant
构建variant是用来提供多渠道多版本apk的一种实现方式,影响它的因数有两个:
1:Product Flavor (定制产品);
productFlavors {
memebox_pc_download {
buildConfigField"String","UMENG_CHANNEL_ID","/"com_flexable_cn/""
buildConfigField"String","TALK_CHANNEL_ID","/"com_flexable_cn/""
buildConfigField"String","CHANNEL_NAME","/"com_flexable_cn/""
applicationid "com.example.flavor1"
versionCode 20
versionName "3.40.7"
}
}
2:Build Types(构建类型);
buildTypes {
debug {
minifyEnabled false
debuggable true
signingConfig signingConfigs.release
}
release {
buildConfigField"boolean","LOG_DEBUG","false"
debuggable false
shrinkResources false
minifyEnabled true
zipAlignEnabled true
signingConfig signingConfigs.release
proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'
}
staging{
applicationIdSuffix ".staging"
versionName
}
}
每一个渠道都会生成debug和release版本的包,当然也可以自定义你想要的任何构建类型;
来自:http://www.jianshu.com/p/1680700a974f