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

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的构建文件中有一些是必需的:

apply 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版本的包,当然也可以自定义你想要的任何构建类型;














最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,688评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,559评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,749评论 0 226
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,581评论 0 191
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,741评论 3 271
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,684评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,122评论 2 292
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,847评论 0 182
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,441评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,939评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,333评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,783评论 2 236
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,275评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,830评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,444评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,553评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,618评论 2 249

推荐阅读更多精彩内容