Gradle基础介绍

什么是 Gradle ?

所谓构建工具就是对你的项目进行编译、运行、签名、打包、依赖管理等一系列功能的合集,传统的构建工具有 Make、Ant、Maven、Ivy等,而 Gradle 是新一代的自动化构建工具。

上面说了,Gradle 是新一代的自动化构建工具,它是一个独立的项目,跟 AS、Android 无关,官方网站:https://gradle.org/, 类似 Ant、Maven这类构建工具都是基于 xml 来进行描述的,很臃肿,而 Gradle 采用的是一种叫做 Groovy 的语言,语法跟 Java 语法很像,但是是一种动态语言,而且在 Java 基础上做了不少改进,用起来更加简洁、灵活,而且 Gradle 完全兼容 Maven、Ivy,这点基本上宣布了 Maven、Ivy 可以被抛弃了,Gradle 的推出主要以 Java 应用为主,当然目前还支持 Android、C、C++。

Gradle 与 Android Studio 的关系

上面也提到,Gradle 跟 Android Studio 其实没有关系,但是 Gradle 官方还是很看重 Android 开发的,Google 在推出 AS 的时候选中了 Gradle 作为构建工具,为了支持 Gradle 能在 AS 上使用,Google 做了个 AS 的插件叫 Android Gradle Plugin ,所以我们能在 AS 上使用 Gradle 完全是因为这个插件的原因。在项目的根目录有个 build.gradle 文件,里面有这么一句代码:

classpath ‘com.android.tools.build:gradle:2.3.3’

这个就是依赖 gradle 插件的代码,后面的版本号代表的是 android gradle plugin 的版本,而不是 Gradle 的版本,这个是 Google 定的,跟 Gradle 官方没关系。

Gradle基本组件

每一个build.gradle文件代表着一个Project。Tasks在build.gradle中定义。当初始化构建进程时,gradle会基于build文件,集合所有的Project和Tasks,一个Tasks包含了一系列动作,然后它们将会按照顺序执行,一个动作就是一段被执行的代码,很像Java中的方法。

Project

每一个待编译的工程(可以是一个jar包,一个web应用,或者一个android app等)都称为一个Project。

Task

每一个Project在构建的时候都包含一系列的Task。一个Task其实就是构建过程中一个原子性的操作。比如一个Android APK的编译可能包含:Java源码编译Task、资源编译Task、JNI编译Task、lint检查Task、打包生成APK的Task、签名Task等。

Plugin

Gradle是一个框架,作为框架,它负责定义流程和规则。而具体的编译工作则是通过插件的方式来完成的。比如编译Java有Java插件,编译Groovy有Groovy插件,编译Android APP有Android APP插件,编译Android Library有Android Library插件。

简单来说,插件就是一系列任务的集合,主要作用是把一些重复利用的逻辑打包,这样就可以在不同的项目中可以重复的使用。

要使用插件,可以通过引入依赖的方式添加。

As如何依赖Gradle让Gradle作为自身的构建工具呢?

Google开发了一个Gradle插件,让As项目依赖这个插件,就相当于让Gradle作为自身的的构建工具。

现在比如我们新建一个As项目,打开项目的根目录的gradle.build文件。有如下代码:

buildscript {

     repositories {

               jcenter()    //表示编译过程中依赖的仓库

     }

     dependencies {

              classpath 'com.android.tools.build:gradle:2.2.0'     //依赖android开发使用的gradle插件

      }

}

而要引入Android APP插件,就需要在build.gradle引用Android APP插件:

//申明使用插件,表明要编译的内容和产物

apply plugin: 'com.android.application'

//配置插件属性

android {

        compileSdkVersion 24

        buildToolsVersion "24.0.1"

        defaultConfig {

                applicationId "zhj.gradledemo"

                minSdkVersion 15

                targetSdkVersion 24

                versionCode 1

                versionName "1.0"

                testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

         }

         buildTypes {

               release {

                      minifyEnabled false

                      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

               }

          }

}

Android其实就是写了两个插件:com.android.application 和 com.android.library 

应用这两个插件就可以实现Android APP和Android Library的构建。

.gradle文件夹

.gradle文件夹 是gradle 运行以后生成的缓存文件夹。

Project中的build.gradle文件

project下的build.gradle是基于整个project的配置,主要配置gradle 版本及全局依赖仓库、库或者其他全部参数。

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {

        repositories {

                //这里依赖的jcenter仓库是gradle脚本自身需要的资源

                jcenter()

        }

        dependencies {

                classpath 'com.android.tools.build:gradle:2.2.0'

                 // NOTE: Do not place your application dependencies here; they belong

                 // in the individual module build.gradle files

         }

}

allprojects {

         repositories {

                 //这里依赖的jcenter仓库是项目所有模块需要的资源

                 jcenter()

         }

}

task clean(type: Delete) {

       delete rootProject.buildDir

}

module中build.gradle文件

//申明使用插件,表明要编译的内容和产物

apply plugin: 'com.android.application'

android {

         compileSdkVersion 24

         buildToolsVersion "24.0.1"

         //默认配置,会同时应用到debug和release版本上

         defaultConfig {

                  applicationId "zhj.gradledemo"

                  minSdkVersion 15

                  targetSdkVersion 24

                  versionCode 1

                  versionName "1.0"

                  testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

         }

         buildTypes {

                  release {

                           minifyEnabled true  //是否混淆

                           proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' //混淆文件的位置

                  }

                  debug {

                           minifyEnabled false

                  }

         }

         // 多渠道

         productFlavors {

         //可以设置不同渠道渠道号,应用名称

                  pro {

                  }

                  fre {

                  }

         }

}

//依赖第三方库

dependencies {

         //编译libs目录下所以jar包

         compile fileTree(include: ['*.jar'], dir: 'libs')  //导入所有的jar包

         androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {

                  exclude group: 'com.android.support', module: 'support-annotations'

         })

         compile 'com.android.support:appcompat-v7:24.2.0'

         compile 'com.android.support:design:24.2.0'

         testCompile 'junit:junit:4.12'

         proCompile 'com.android.support:recyclerview-v7:24.2.0'

}

Project中setting.gradle

这个文件是全局的项目配置文件,里面主要声明Project中所包括的所有module

//一个Project中所包括的所有module

include ':Gotobus', ':android-support-v7-appcompat'

include ':google-play-services_lib'

include ':TakeTours'

include ':Common'

include ':CompanyCommon'

Project中gradle.properties

//编译版本信息

APPLICATION_ID = com.jin.myAPP

COMPILE_SDK_VERSION = 23

BUILD_TOOLS_VERSION = 23.0.1

MIN_SDK_VERSION = 15

TARGET_SDK_VERSION = 1

VERSION_CODE = 1

VERSION_NAME = 1.0.0.0

//keystore信息

STORE_FILE = ../app/mykey.keystore

STORE_PASSWORD = your password

KEY_ALIAS = your alias

KEY_PASSWORD = your password

配置应用的签名信息

在android.signingConfigs{}下定义一个或者多个签名信息,然后在buildTypes{}配置使用即可。比如这里:

android {

        signingConfigs {

                  release {

                           storeFile file("release.keystore")

                           keyAlias "release"

                           keyPassword "123456"

                           storePassword "123456"

                  }

                  debug {

                           ...

                  }

         }

         buildTypes {

                 release {

                           signingConfig signingConfigs.release

                  }

                  debug {

                           signingConfig signingConfigs.debug

                  }

          }

}

storeFile是签名证书文件,keyAlias是别名,keyPassword是key的密码,storePassword是证书的密码。配置好相关信息即可在buildTypes配置使用。

一般重要的信息,例如签名信息,可以直接将信息写到gradle.properties,然后在然后在build.gradle中引用即可。

buildTypes是指建构的类型,一般只用两种默认类型 debug 和 release ,顾名思义 debug 用来配置开发过程中的一些内容;release 用来配置正式发布版本的内容。有时我们需要发布介于debug与release之间的preview 版本。

Build Variant 差异管理

比如app生成不同版本(免费,收费),适配特殊机型,多渠道等需要发多个包,最终能编译出的apk的数量是由Product Flavor(产品种类)与Build Type(构建类型)决定的,

公式:Build Variant = Build Type x Product Flavor

BuildType(构建类型)

默认有debug和release两种,标示编译的类型,通常在混淆代码、可调式、资源压缩上做一些区分。

Product Flavor(产品种类)

为了满足“同一个project,根据一个很小的区分,来打不同的包”这个需求。实现多渠道打包。注意:这里的Flavor名如果是数字开头,必须用引号引起来。

调整module的目录结构sourceSets

默认情况下,java文件和resource文件分别在src/main/java和src/main/res目录下,在build.gradle文件的andorid{}里面添加下面的代码,便可以将java文件和resource文件放到src/java和src/resources目录下。

sourceSets {

         main {

                  manifest.srcFile 'AndroidManifest.xml'

                  //设置java文件的位置

                  java.srcDirs = ['src']

                  resources.srcDirs = ['src']

                  aidl.srcDirs = ['src']

                  renderscript.srcDirs = ['src']

                  res.srcDirs = ['res']

                  assets.srcDirs = ['assets']

        }

}

全局变量定义及引用

可以在顶层build.gradle脚本中定义一些全局变量,提供给子脚本引用

ext {

        // global variables definition

        compileSdkVersion = 'Google Inc.:Google APIs:23'

        buildToolsVersion = "23.0.3"

        minSdkVersion = 14

        targetSdkVersion = 23

}

子脚本引用

android {

        compileSdkVersion rootProject.ext.compileSdkVersion

        buildToolsVersion rootProject.ext.buildToolsVersion

        defaultConfig {

                minSdkVersion rootProject.ext.minSdkVersion

                targetSdkVersion rootProject.ext.targetSdkVersion

         }

}

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,423评论 25 707
  • 参考资料:http://gold.xitu.io/post/580c85768ac247005b5472f9htt...
    zhaoyubetter阅读 10,977评论 0 6
  • 1.介绍 如果你正在查阅build.gradle文件的所有可选项,请点击这里进行查阅:DSL参考 1.1新构建系统...
    Chuckiefan阅读 12,115评论 8 72
  • Gradle对于很多开发者来说有一种既熟悉又陌生的感觉,他是离我们那么近,以至于我每天做项目都需要他,但是他又是离...
    阿_希爸阅读 9,566评论 10 199
  • 21天践行打卡 Day12 【静心】缓吸和急吸 【动身】服装店 【成长】坚持怎样做人 【助人】物美价廉卖给顾客衣服...
    石头缝里的小嫩芽变大树阅读 322评论 0 1