gradle深入理解以及在android studio中的使用

浏览: 79 发布日期: 2016-12-27 分类: android

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

 

返回顶部