Gradle 学习

Gradle 学习

Gradle是一个基于Apache AntApache Maven概念的项目自动化构建工具。它使用一种基于Groovy特定领域语言(DSL, domain-specific language )来声明项目设置,而不是传统的XML。

gradle是一个自动化工具。配置gradle时,使用的是Groovy语言。Groovy的语法与Java类似。

Gradle可以构建多个project,一个build.gradle代表一个project,每个project包含多个task。每个task里面可以包含多个action。

构建过程分为三步:

  • 初始化阶段:创建 Project 对象,如果有多个build.gradle,也会创建多个project.
  • 配置阶段:在这个阶段,会执行所有的编译脚本,同时还会创建project的所有的task,为后一个阶段做准备。
  • 执行阶段:在这个阶段,gradle 会根据传入的参数决定如何执行这些task,真正action的执行代码就在这里.

Groovy语法

在一些情况下,可能需要我们自己定义task。而Gradle其实使用的是groovy语言,因此,在定义task之前需要先了解groovy语法。而groovy与Scala、Kotlin语言一样,都是一种JVM语言。

闭包

闭包(英语:Closure),又称词法闭包(Lexical Closure)或函数闭包(function closures),是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。

使用闭包的groovy代码

def hash = ["name":"Andy", "age":25]
    hash.each{ key, value ->
        println "${key} : ${value}"
    }

没用闭包的Java代码

Map<String, String>map = new HashMap<String, String>();
map.put("name", "Andy");
map.put("age","20");
               
for(Iterator iter = map.entrySet().iterator(); iter.hasNext();){
    Map.Entry entry = (Map.Entry)iter.next();
    System.out.println(entry.getKey() + " : " +     entry.getValue());
}

虽然在迭代上使用闭包的机会最多,但闭包确实还有其他用途。因为闭包是一个代码块,所以能够作为参数进行传递(Groovy 中的函数或方法不能这样做)。

Groovy 中可以像在 Java 代码中一样定义类。不过不需要使用 public 修改符,而且还可以省略方法参数的类型。

例如,我们可以创建一个User类,它有姓名和年龄属性。

class User{
    def name
    def age
}

与java不同的是,groovy会自动生成User类的getter和setter方法。

Groovy in Gradle

在配置文件中的apply plugin: 'com.android.application'转化为groovy语法为:

project.apply([plugin: 'com.android.application'])

apply()是Project类的方法,参数是map集合。

build.gradle文件中的依赖配置。

dependencies {
    compile 'com.google.code.gson:gson:2.3'
}

转化为groovy语法为:

project.dependencies({
    add('compile', 'com.google.code.gson:gson:2.3', {
        // Configuration statements
    })
})

构建Android项目

Android应用构建流程.PNG

Gradle 和 Android 插件可以完成以下方面的构建配置:

  • buildTypes:在模块级 build.gradle 文件的 android {} 代码块内部创建和配置buildTypes。
android {
    ...
    defaultConfig {...}
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }

        debug {
            applicationIdSuffix ".debug"
        }

        /**
         * The 'initWith' property allows you to copy configurations from other build types,
         * so you don't have to configure one from the beginning. You can then configure
         * just the settings you want to change. The following line initializes
         * 'jnidebug' using the debug build type, and changes only the
         * applicationIdSuffix and versionNameSuffix settings.
         */

        jnidebug {

            // This copies the debuggable attribute and debug signing configurations.
            initWith debug

            applicationIdSuffix ".jnidebug"
            jniDebuggable true
        }
    }
}
  • productFlavors:与配置buildTypes类似,将配置添加到productFlavors {}代码块中。
android {
    ...
    defaultConfig {...}
    buildTypes {...}
    productFlavors {
        demo {
            applicationIdSuffix ".demo"
            versionNameSuffix "-demo"
        }
        full {
            applicationIdSuffix ".full"
            versionNameSuffix "-full"
        }
    }
}

Gradle 创建的Build Variants数量等于每个productFlavors中的Flavor数量与配置的buildTypes数量的乘积。

  • dependencies:
dependencies {
    // The 'compile' configuration tells Gradle to add the dependency to the
    // compilation classpath and include it in the final package.

    // Dependency on the "mylibrary" module from this project
    compile project(":mylibrary")

    // 远程二进制依赖
    compile 'com.android.support:appcompat-v7:27.1.1'

    // Local binary dependency
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

Gradle 与Android Gradle Plugin

Gradle作为一个异常强大的构建工具,为了满足不同平台的需求,比如:Java平台有Java构建逻辑,Android平台有Android构建逻辑。Gradle务必是要支持自定义构建的,这个功能正是由Gradle Plugin提供,而对应于Android工程的构建逻辑就是由Android Gradle Plugin实现的了。

自定义Gradle插件

自定义插件的目录结构

plugin
└── src
    └── main
    |   ├── groovy
    |   |   └── com
    |   |          └── package
    |   |               └── name
    |   └── resources
    |       └── META-INF
    |           └── gradle-plugins
    |_ build.gradle

由上述插件结构可知,自定义插件大致可分为三个部分。groovy目录,resources目录和build.gradle配置文件。

build.gradle

apply plugin: 'groovy'
apply plugin: 'maven'

dependencies {
    implementation gradleApi()
    implementation localGroovy()
}

META-INF/gradle-plugins

在META-INF/gradle-plugins 目录下添加一个属性文件,主要用来使得Gradle找到该插件。

implementation-class=com.nxiangbo.plugin.main.CustomPlugin

Groovy 目录

为了创建Gradle插件,我们必须创建一个实现Plugin接口的类。当我们将自定义的插件应用到项目时,Gradle就会创建这个类的实例,并调用这个类的apply()方法。而project作为该方法的参数,因此插件可以使用project的配置。下面我们在groovy目录下创建CustomPlugin.groovy。

 class CustomPlugin implements Plugin<Project> {
    @Override
    void apply(Project project) {
        def extension = project.extensions.create("customPlugin", CustomExtension)
        project.task("demo"){
            project.afterEvaluate{
       
                    println("versionName=${extension.versionName}   versionCode=${extension.versionCode}")
            }
        }


    }
}
class CustomExtension {
    String versionName
    String versionCode

}

发布插件

只需要在build.gradle文件中添加uploadArchives task就可以将插件发布到本地。

afterEvaluate { project ->
    uploadArchives {
        repositories {
            mavenDeployer {
                repository(url: uri('D:/repo'))
            }
        }
    }
}

应用插件

在需要使用该插件的项目中的build.gradle 文件中,添加如下代码

apply plugin: 'customplugin'

customPlugin {
    versionName='version'
    versionCode='1.1.0'
}

Gradle插件调试

首先,在Android Studio 中设置Edit Configurations -> +号 -> Remote -> 填写Host和端口号

gradle调试.png

然后,运行gradle :app:clean -Dorg.gradle.debug=true --no-daemon

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

推荐阅读更多精彩内容

  • Gradle 是一款构建系统工具,它的 DSL 基于 Groovy 实现。Gradle 构建的大部分功能都是通过插...
    任教主来也阅读 3,042评论 3 6
  • 本篇主要是个人学习gradle的笔记总结 一.开始之前 1. 为什么学习Gradle 采用DSL(Doma...
    zyq_neuq阅读 1,487评论 2 12
  • 用过android studio的对gradle应该都不陌生了,gradle文件的基本配置大同小异,略做了解使用应...
    微凉一季阅读 27,413评论 18 185
  • 什么是Gradle Gradle 是新一代的自动化构建工具,它是一个独立的项目,跟 AS、Android 无关,类...
    Mr槑阅读 564评论 0 2
  • Android默认使用Gradle[https://www.gradle.org/]作为构建工具。 Why Gra...
    goodl阅读 937评论 0 1