Gradle For Android(1)--使用AndroidStudio开始Gradle

Gradle基础

build.gradle是为了构建Android项目的脚本。Gradle构建脚本并不是使用传统的XML,而是基于Groovydomain-specific language (DSL),而这种动态语言是为了JVM使用的。也就说明,我们可以使用任何一种基于JVM的语言来写自定义的插件。

Project与Task

每一个构建都至少会有一个Project。每个Project都包含一个或者多个Task。每个build.gradle文件都代表着一个Project。Task都可以很简单的定义在这个build.gradle文件中。

当初始化一个构建时,Gradle编译Project以及Task都依赖一个build文件。一个Task对象都是由一系列的Action对象列表组成,按照顺序执行。一个Action对象是一个可执行的代码块,就像Java中的函数。

构建生命周期

执行一个Gradle构建以最简单的形式来执行,仅仅只是执行各个依赖的Tasks中的Action。为了更简单的构建流程,BuildTool创建了一个DAG(Directed Acyclic Graph)动态模型的工作流。

这也就意味着,所有的Task都只会是一个接着一个,而不会重复执行。一旦一个Task已经被执行了之后,它将不会再被调用。没有依赖的任务总是会被优先执行。依赖关系的图(The Dependency Graph)是在生成配置阶段的时候被确定的。

一个Gradle构建会有三个阶段:

  • 初始化:该阶段会生成Project对象。如果现在有多个Module的话,每一个都会有自己的build.gradle文件,多个Project对象都会被创建。
  • 配置:在这个阶段,build脚本会被执行,创建并且为每一个创建的Project对象配置所有的任务。
  • 执行:这个阶段就是Gradle决定哪些Task会被执行。而这些要被执行的Task取决于开始执行之前所传递的参数以及它的目录。

Build配置文件

为了配置一个Project,总会存在一个build.gradle的脚本文件。该脚本文件中的部分配置如下:

buildscript {
       repositories {
           jcenter() 
       }
       dependencies {
           classpath 'com.android.tools.build:gradle:1.2.3'
      }
}

这是一个真实的build脚本配置。在repositories的块中,jcenter()作为代码仓库的依赖。JCenter是一个预配置的不需要其他配置的Maven仓库。这个仓库中提供了很多Gradle的服务,并且它也很容易把你本地以及远程的仓库添加到这个仓库中。

这个build脚本也定义了一个Android Build Tools的依赖(depencencies),通过classpath的Maven Artifact提供了Android Plugin的来源。Android Plugin提供了构建以及测试的所有东西,每一个Android Project都需要通过:

apply plugin: 'com.android.application'

来应用Android Plugin。Plugin通常用来集成了Gradle的build脚本能力。应用一个Plugin到Project使得编译脚本可以去定义Properties,并且使用已经定义在这个Plugin中的Tasks。

如果要build一个Library,则需要使用apply 'com.android. library'。Library和Application的插件不能同时存在于一个Module中,否则会编译出错,一个Module可以是Library,也可以是Application,但是不能同时存在。

当使用Android插件的时候,Android中指定的值能够非常简便的进行配置。以下的代码块可以在插件中定义,并且应用到每一个Project中。

android {
       compileSdkVersion 26
       buildToolsVersion "26.0.1"
}

只有compileSdkVersion以及buildToolsVersion属性会被应用。最好使用最高版本的Android API作为编译版本。还有其他的更多属性后续再介绍。

使用Gradle Wrapper

使用Gradle Wrapper是一个避免问题并且可以使得构建可以重用的好方法。

Gradle Wrapper在Windows上提供了一个Batch文件,而在其他的操作系统上提供了一个Shell脚本。当执行这个脚本时,Required版本的Gradle会被下载,然后自动的开始构建。而这个方案是开发者以及自动化系统需要这个构建任务可以直接执行这个Wrapper,而不用关心剩下的工作。这种方案不需要在机器上手动的安装正确的Gradle版本。因此,推荐将wrapper文件添加到VCS(版本控制管理)中。

执行Gradle Wrapper文件与执行Gradle一致,只需要在Mac或者Linux上执行gradlew命令(而不是gradle命令),Windows上执行gradlew.bat即可。

将Gradle下载完成,并且配置到环境变量后,在项目中创建build.gradle文件

task wrapper(type: Wrapper) {
       gradleVersion = '2.4'
}

在通过gradle wrapper --gradle-version 2.4命令执行过后,项目中生成多个文件:

myapp/
   ├── gradlew
   ├── gradlew.bat
   └── gradle/wrapper/
       ├── gradle-wrapper.jar
       └── gradle-wrapper.properties

Gradle Wrapper有三部分:

  • 一个Batch文件,或者一个gradlew的shell脚本
  • 一个Jar包:供Batch以及Shell脚本使用的
  • 一个Properties文件

其中Properties文件中会存有

   distributionBase=GRADLE_USER_HOME
   distributionPath=wrapper/dists
   zipStoreBase=GRADLE_USER_HOME
   zipStorePath=wrapper/dists
   distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip

也可以通过修改distributionUrl中的版本来使用自定义的Gradle

执行基础的Build任务

在Terminal中,进入Project的目录,并且使用gradlew tasks将会打印出来一系列的可用的Task列表。如果添加了--all的参数,会打印出来每个任务的依赖关系。

如果需要打包一个Debug版本的包,则可以使用gradlew assembleDebug执行任务。默认会在MyApp/app/build/outputs/apk路径中保存Apk。

还有三个其他的基本Task:

  • check:执行所有的check任务,通常是用来执行那些Test任务的
  • build:执行assemble以及check任务
  • clean:清理Project的output目录

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java沉淀

build.xml: 33: Class not found: javac1.8的解决办法

19230
来自专栏好好学习吧

testng中使用reportng报告

19320
来自专栏运维咖啡吧

LDAP落地实战(四):Jenkins集成OpenLDAP认证

安装方法:登录Jenkins --> 系统管理 --> 插件管理 --> 可选插件 --> 搜索LDAP --> 选中 --> 直接安装 --> 安装完成重启

29310
来自专栏电光石火

获得PHP版本信息及版本比较

version_compare是一个版本比较工具,当然也可以作为其他的版本比较工具:

9830
来自专栏积累沉淀

struts2国际化

在struts2中需要做国际化的有: jsp页面的国际化,action错误信息的国际化,转换错误信息的国际化,校验错误信息的国际化 jsp页面的国际化 第一步 ...

24150
来自专栏Python爬虫与数据挖掘

在Windows下如何创建虚拟环境(默认情况下)

很多小伙伴平时在使用Python的时候,有的项目需要使用Python2来进行开发,有的项目则是需要Python3来进行开发。当不清楚怎么分开环境的时候,...

6210
来自专栏Ken的杂谈

CentOS 7 下Jenkins安装部署教程

Jenkins是一个开源的支持自动化构建、部署等任务的平台。基本上可以说是持续集成(CI)、持续发布(CD)不可或缺的工具。

52120
来自专栏吴柯的运维笔记

【技术帖】LDAP网络用户的实现

LDAP网络用户的实现: >>为一组客户机集中提供可登陆的用户账号 -网络用户:用户名、密码信息存储在LDAP服务端 -这些客户机都加入同一个LDAP域 加入...

30450
来自专栏java相关

Redis学习笔记02--主从数据库配置

13040
来自专栏小狼的世界

Memcache的安装与配置

因为单位要求修复Memcached的DDOS漏洞,整理了本文。之前的文章防止Memcached的DDOS攻击另外一个思路 提到了解决方案,我们使用的版本较低,因...

13710

扫码关注云+社区

领取腾讯云代金券