Android干货分享Android 历程Gradle

抓重点学Gradle

2016-09-08  本文已影响1702人  adison

原文链接

前言

网上关于Gradle的教程很多,但很多都是以“面”切入— 通过大量讲解其用法及其API分类来阐述。但Gradle API使用技巧众多,API更是成千上百,臣妾记不住呀。个人深信,技术之道与练功之道是一致的,"想要旷世武功,先练内功"。本文尝试以“点”切入,阐述一下学习Gradle的门路。

为什么使用Gradle

所谓构建,简单来说就是根据不同的输入信息,执行不同的任务,得到不同的输出的过程。而构建工具就是把这些过程自动化、管理执行不同的任务来满足不同需求。常见的构建工具有Ant、maven等。但它们都有一些缺点:

而Gradle可以说是集大成者,比Ant 语法精简, 比Maven灵活,抛弃了XML的繁琐配置,极其强大的依赖管理,基于Groovy动态语言而使得自定义行为十分方便。

关于为什么使用Gradle这个问题,官方也作出了解释:

why-gradle

简单翻译总结,就是使用Gradle很方便很灵活。

好吧,前面的都是“废话”,作为Android开发者,你不用Gradle编译试试...

Gradle

要学好Gradle,最重要的是学会查文档、查文档、查文档...重要的事情说三遍!

Groovy

由于Gradle是基于Groovy,所以要学习Gradle,必须要掌握一定的Groovy基础。

Groovy是什么

简单来说,Groovy是拓展了Java语言的一种动态语言,可以作为Java平台的脚本语言使用,拥有类似PythonRubySmalltalk中的一些特性。

Groovy学习

当然,第一步肯定是配置环境,关于Groovy的环境搭建,具体可以参见Groovy官网,特别简单,不在此重复说明。然后,创建一个test.groovy文件,里边只有一行代码:

println  "hello groovy"

运行一下:

hello

是不是感觉和python好类似

作为一门语言,Groovy是复杂的。要深入研究的话,不会比学任一语言要简单。但是作为一名普通开发者,个人觉得掌握其中一点—Closure(闭包),足矣。

Gradle

Gradle是什么

​ Gradle是基于Groovy定义了一套DSL,所谓DSL(领域专用语言),就是专门针对某一特定问题的计算机语言。而Gradle我们可以认为是经过“定制”的Groovy,专门用于项目构建的语言。

Gradle学习— TaskProject,Plugin

虽然使用Android Studio开发的话,Gradle环境在IDE会自动下载集成,但要学好Gradle,建议还是自己部署一下环境。从Gradle官网下载gradle后,配置一下环境变量。Gradle的环境就搭建起来了。

和Groovy同理,要深入Gradle的话,要学的东西也不会少,但是作为普通的开发者,个人觉得把三个概念搞懂就可以了:TaskProject,Plugin

Gradle进阶— 自定义插件

​ Gradle允许开发者自定义插件来实现项目一些特殊的构建需求。譬如说:动态注入代码。我们可以直接在build.gradle定义自己的插件,但一般很少这么干,毕竟插件更多是为了项目复用的。更多情况,Gradle插件是以独立插件工程的形式开发的。下面以一个简单例子来介绍一下开发一个独立Gradle插件基本步骤:

假设现在我们开发一个直接输出输入内容的插件:

  1. 建立插件工程

    由于Gradle是基于Groovy开发的,所以我们建立的必然是Groovy工程,项目目录结构如下

    plugin

    build.gradle如下:

    apply plugin: 'groovy'
    apply plugin: 'maven'
    version = '1.0.0'//插件version
    group = 'com.adison.gradleplugin'//插件groupId
    archivesBaseName = 'TestPlugin'//插件artifactId
    
    dependencies {
        compile gradleApi()//gradle sdk
        compile localGroovy()//Groovy sdk
    }
    
    //发布配置
    uploadArchives {
        repositories.mavenDeployer {
          //发布到本地
            repository(url: 'file:repo/')
        }
    }
    
  2. 编写插件

    • 实现Plugin接口

      package com.test
      import org.gradle.api.Plugin
      import org.gradle.api.Project
      class TestPlugin implements Plugin<Project> {
          @Override
          void apply(Project target) {
          }
      }
      

      这是插件的入口类

    • 定义输入信息扩展类

      package com.test
      class TestExtension {
          String message;
      }
      
    • 定义插件id

      Gradle定义插件id需要建立这样一个目录结构:/resources/META-INF/gradle-plugins,然后在其底下创建一个properties文件:print-message.properties文件名即是插件id,也是apply plugin: 'xxx'使用的名字,在文件中输入插件入口类:

      implementation-class=com.test.TestPlugin
      
    • 完善插件

      package com.test
      
      import org.gradle.api.Plugin
      import org.gradle.api.Project
      
      class TestPlugin implements Plugin<Project> {
      
          public static final String EXTENSION_NAME = "printMessage";//扩展别名
      
          @Override
          void apply(Project target) {
            //创建扩展
         TestExtension extension=  target.extensions.create(EXTENSION_NAME,TestExtension)
              target.task("printMessage")<< {
                  println extension.message
              }
          }
      }
      

  3. 发布插件

    命令行执行:

    ./gradlew clean uploadArchives
    

    会在当前repo目录生成插件文件

  4. 插件使用

    • 插件文件导入项目,譬如导入项根目录/gradleplugin

    • 引入本地仓库

      buildscript {
          repositories {
              jcenter()
              mavenCentral()
              //本地仓库
              maven {
                  url 'gradleplugin'
              }
          }
          dependencies {
              classpath 'com.android.tools.build:gradle:1.5.0'
                 //自定义插件
              classpath 'com.adison.gradleplugin:TestPlugin:1.0.0'
          }
      }
      
    • 应用插件

      apply plugin: 'print-message'
      printMessage{
          message="test"
      }
      
      命令行输入:
      ./gradlew printMessage
      输出:
      test
      

    举这个列子只是为了描述了一下自定义Gradle插件的流程,结合Groovy和Gradle内建的Task,可以实现更复杂实用的插件。

Android Gradle使用

从上述可以得知,Android其实就是写了两个插件:com.android.applicationcom.android.library,应用这两个插件就可以实现Android APP和Android Library的构建了,所以也没啥好说的,不知道怎么配置?查文档:Gradle Plugin User Guide

这里简单分享几个有用的经验:

Gradle Wrapper使用很简单:

  使用gradle:
  gradle tasks
  使用gradle wrapper
  ./gradlew tasks

小结

至此,相信大家对gradle已经有一定认识。我在上述并没有对一些细节展开论述,而仅仅对我个人认为比较重要的点进行了阐述,是因为我觉得对于Gradle的学习,掌握理解其重要的概念远比记住其API重要。万变不离其宗,掌握了“点”,“面”只是时间的问题。最后,再重申一句,学会查文档真很重要

参考文章

http://www.infoq.com/cn/articles/android-in-depth-gradle

http://benweizhu.github.io/blog/2015/03/31/deep-into-gradle-in-action-6/

上一篇下一篇

猜你喜欢

热点阅读