Gradle

Gradle

初识Gradle

在用AndroidStudio创建一个工程的时候,会发现工程目录中除了必须的工程代码以及各种资源文件外,还有一些后缀为.gradle的文件,这些就是gradle的配置文件,是基于gradle的构建脚本。

什么是Gradle

Gradle是一种项目自动化建构工具,基于Groovy语言,面向Java应用为主,它抛弃了基于XML的各种繁琐配置,取而代之的是一种基于Groovy的内部领域特定(DSL)语言, 而Groovy语言是一种基于jvm的动态语言。

Project和tasks

在grade中的两大重要的概念,分别是project和tasks。

Android studio中的project和Gradle中的project不是一个概念。

每一次构建都是有至少一个project来完成,每个project有至少一个tasks。每一个build.grade文件代表着一个project。tasks在build.gradle中定义,很像Java中的方法。在构建过程中,不同的Task各司其职。每个Task相当于一个Project对象的函数,专门用来干一件事。

不同的Task之间可以增加依赖,比如Task A依赖于B,那么要执行A首先会执行B。而一个任务可以依赖的任务不止一个。在每一个Project中都必须有一个build.gradle文件,这是一个构建脚本,类似于makefile,这个文件是整个Project构建的入口,可以在其中做一些配置,比如版本、插件、依赖等。

工作流程/生命周期

简单来说,Gradle的工作过程分为三个阶段:Initialization阶段、Configuration阶段以及Execution阶段。

  1. 初始化阶段:project实例在这儿创建,如果有多个模块,即有多个build.gradle文件,多个project将会被创建。

  2. 配置阶段:在该阶段,build.gradle脚本将会执行,为每个project创建和配置所有的tasks,会为所有的Task根据其依赖关系而建立一个有向图。

  3. 执行阶段:这一阶段,gradle会决定哪一个tasks会被执行,哪一个tasks会被执行完全依赖开始构建时传入的参数和当前所在的文件夹位置有关。

一旦一个tasks被执行,那么它不会再次执行了,不包含依赖的Tasks总是优先执行

为什么要选择Gradle

假如你是一个开发者,项目自动构建是你每天工作的一部分,难道你就不想让你的构建代码和你写的源代码一样可以扩展、测试和维护?Gradle的构建脚本是声明式的、可读的,可以清晰的表达意图。使用Groovy代替XML来写代码大大减少了构建代码的大小。更重要的是,Gradle集成了其他构建工具,比如Ant和Maven,使得原来的项目很容易迁徙到Gradle。

Gradle for Android

看看实际的Android工程中gradle是如何使用

配置

基于grade构建的项目通常至少有一个build.gradle,看看Android Studio默认的配置:


图片名称

Android工程中常用到的配置文件有:

  1. gradle-wrapper.properties文件

工程配置gradle,distributionUrl是指定你的gradle版本,你可以改变该url来改变你的gradle版本。

#Mon Dec 28 10:00:20 PST 2015
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip
  1. setting.gradle文件

setting.gradle文件将会在初始化时期执行,并且定义了哪一个模块将会被构建。

Android中一个项目中可以构建多个Module,会在setting.gradle文件中会有如下代码:(每构建一个module就要在这里配置一下,Android Studio会自动帮我们配好了)

include ':app', ':mylibrary'
  1. 图中框起来的两个build.gradle文件

根目录下的build.gradle文件是定义在这个工程下的所有模块的公共属性:

//这个就是实际构建开始的地方
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.3'

    }
}

allprojects {
    repositories {
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

该文件主要包含了两个方面:在仓库地址中,我们使用了jcenter,jcenter可以理解成是一个中央远程仓库,一个仓库代表着你的依赖包的来源,兼容maven中心仓库。构建脚本也定义了一个Android构建工具,声明了android gradle plugin的版本。

app目录下的build.gradle:

//构建脚本也定义了一个Android构建工具,Android plugin提供了所有需要去构建和测试的应用。每个Android应用都需要这么一个插件:
apply plugin: 'com.android.application'

//当使用Android 插件的时候,Android标签将可以被使用
android {
    //编译该app时候,你想使用到的api版本
    compileSdkVersion 24
    //构建工具的版本号
    buildToolsVersion "25.0.2"
    
    //defaultConfig方法包含了该app的核心属性,该属性会重写在AndroidManifest.xml中的对应属性。
    defaultConfig {
        //app包名
        applicationId "com.lipy.gradledemo"
        //sdk相关配置
        minSdkVersion 22
        targetSdkVersion 24
        //版本相关配置
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    
    //构建相关设置,用于构建不同版本的app
    buildTypes {
        release {
            //是否开启混淆
            minifyEnabled false
            //混淆文件位置
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

//依赖
dependencies {
    //将libs文件夹中所有的jar文件视为依赖包
    compile fileTree(dir: 'libs', include: ['*.jar'])
    //声明依赖库
    compile 'com.android.support:appcompat-v7:24.2.1'
}

以上配置是在android studio创建android项目的时候默认配置好的。

我们还可以自定义配置:

  1. 全局设置
    多模块在一个工程下,可以这样定义:
allprojects {
       apply plugin: 'com.android.application'
       android {
           compileSdkVersion 24
           buildToolsVersion "25.0.2"
       }
 }
 

如果model不是application的话,可以这样:
在跟gradle.build中添加

ext {
    allprojectCompileSdkVersion=24
    allprojectBuildToolsVersion="25.0.2"
}

然后在具体的model中引用:

android {
    compileSdkVersion allprojectCompileSdkVersion
    buildToolsVersion allprojectBuildToolsVersion
}
  1. 配置应用签名信息
android {
       buildTypes {

        debug {
            signingConfig signingConfigs.debug
        }
    }

    signingConfigs {
        debug {
            storeFile file('debug.keystore')//签名证书文件
            keyAlias 'debug.keystore'//别名
            storePassword "123456789"//证书的密码
            keyPassword "123456789"//key的密码
        }
    }

  1. 依赖

依赖配置的关键字:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:24.2.1'
    compile project(':mylibrary')
    provided 'com.google.code.gson:gson:2.2.4'
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    testCompile 'junit:junit:4.12'
}
  • compile //包含所有的依赖包,都会写入apk
  • provided//提供编译支持,但是不会写入apk
  • apk//apk中存在,但是不会加入编译中
  • testCompile//添加额外的library支持针对测试
  • androidTestCompile//添加额外的library支持针对测试

在Gradle中添加依赖,仅仅只需添加一行代码在你的build文件,Gradle会自动从远程仓库为你下载相关的jar包。依赖包会在你执行build构建的时候从这些远程仓库下载,然后会在本地保留缓存。

Gradle会默认定义三个maven仓库:Jcenter和mavenCentral以及本地maven仓库

repositories {
       mavenCentral()
       jcenter()
       mavenLocal()
   }

我们也可以使用Jcenter和mavenCentral之外的远程仓库:

repositories {
       maven {
           url "http://repo.acmecorp.com/maven2"
       }
}

如果有密码:

repositories {
       maven {
           url "http://repo.acmecorp.com/maven2"
           
           credentials {
               username 'user'
               password 'secretpassword'
           }
       }
}

使用aar文件:
在构建library项目时,会在 build/output/aar/下生成aar文件。创建一个文件夹aars文件夹,把它拷贝到该文件夹里,然后依赖:

repositories {
    flatDir {
        dirs 'aars' 
    }
}

也可以单独依赖某个

dependencies {
       compile(name:'libraryname', ext:'aar')
}

使用基本的构建命令

使用命令行,导航到你的项目,然后输入:

gradle tasks

这一命令将会列出所以可运行的tasks

在开发的时候,构建项目,你需要运行

gradle assembleRelease

通过debug配置,该任务将会创建一个debug版本的app,同时会将其保存在./app/build/outputs/apk目录下。

其他常用命令:

gradle clean //清除....../app目录下的build文件夹

gradle build //检查依赖并编译打包,会把debug、release环境的包都打出来

gradle assembleRelease //编译并打Release的包

gradle installRelease //Release模式打包并安装

gradle installDebug//Debug模式打包并安装

gradle uninstallRelease //卸载Release模式包

我们也可以不使用命令行,Android studio有其对应的工具:

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

推荐阅读更多精彩内容