Android构建01-前言

说明

开发Android应用,就离不开基于Gradle的Android构建系统。刚开始做Android开发的时候,遇到编译问题,一般上网搜索解决之。但一般很难知道问题产生的深层次原因,也不知道以后如何避免,更不知道如何快速解决一般性的编译异常问题。想去学习,但一般的博客或书籍的内容与Android开发者官网介绍的内容相似,没有关于Groovy和Gradle的内容,让人很难理解,只知道是这样,而不知道为什么是这样。于是,一直想对Android构建系统做一个系统性的学习和总结,最近终于能够抽出一些空来做这件事。

本来只想写一篇文章,但写到Gradle之后,发现篇幅太长,故分开写,当做一个系列。

核心问题

当我执行./gradlew assemble命令时,我需要知道Gradle做了哪些事情?它是如何做的(即源码是如何写的)?

学习目标
对于Android Build System,我们应该掌握哪些知识或技能点呢?

  1. Groovy。语言基础,尤其是闭包概念,API快速查阅等。
  2. Gradle。项目构建流程、基础概念、基本命令行指令、插件、API和Reference的查阅等。
  3. Android Plugin。基础概念、Reference的查阅等。
  4. Android应用构建(编译和打包)流程。

文章也将主要按照这个学习流程来写。

参考资料
主要参考官方文档

  1. Groovy 官网
  2. Gradle官网
  3. Android开发者官网-Configure your build


Android构建系统与三大知识块

Android构建系统
Android构建系统,即Android Build System,它的作用是编译app资源和源代码,并将它们打包成APK。之后我们可以对APK进行测试、部署、签名和发布。

The Android build system compiles app resources and source code, and packages them into APKs that you can test, deploy, sign, and distribute


三大知识块
整个Android Build System基于三大知识块:

  • Apache Groovy
    一种功能强大的JVM语言,包含脚本编写、DSL(特定领域语言)创建、运行时和编译时元编程以及函数编程等功能。
  • Gradle
    一种项目自动化构建工具。综合了Ant和Maven的一些特点,并使用Groovy的DSL来声明项目设置,而不是传统的XML。包含插件(Plugin)等功能。

提示:目前Gradle可以使用Kotlin语言来编写脚本,但建议初学者以Groovy为主,毕竟遗留项目以及当前大多数项目的Gradle脚本都是使用Groovy来编写的。

  • Android Plugin
    Gradle的插件,用于增加一些特定于构建Android应用的功能。


开发环境

  1. 主流操作系统。Gradle能够运行在所有的主流操作系统上,我的系统是masOS High Sierra Version 10.13.6

  2. Java JDK 7+。Gradle基于Groovy,Groovy需要Java开发环境,Gradle官网说Gradle运行的最低Java JDK版本是7。

    我的Java版本如下

$ java -version
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)
  1. Gradle。Gradle环境中包含Groovy,因此安装Gradle之后就不需要单独安装Groovy了。各平台以及不同安装方式见官网 Installing Gradle。macOS上可以使用Homebrew快速安装$ brew install gradle,安装成功后,查看版本信息如下:
$ gradle -v
------------------------------------------------------------
Gradle 4.8.1
------------------------------------------------------------

Build time:   2018-06-21 07:53:06 UTC
Revision:     0abdea078047b12df42e7750ccba34d69b516a22

Groovy:       2.4.12
Ant:          Apache Ant(TM) version 1.9.11 compiled on March 23 2018
JVM:          1.8.0_91 (Oracle Corporation 25.91-b14)
OS:           Mac OS X 10.13.6 x86_64


Hello World示例

创建一个简单的Gradle项目:包含一个build.gradle文件的目录。

$ mkdir hello-world
$ cd hello-world
$ vim build.gradle

build.gradle文件

task helloworld {
  doLast {
      println'Hello World!'
  }
}

执行任务

$ gradle helloworld
# 输出如下:
Starting a Gradle Daemon (subsequent builds will be faster)
> Task :helloworld
Hello World!
BUILD SUCCESSFUL in 2s
1 actionable task: 1 executed

简单解释下 build.gradle文件:

  1. build.gradle是Gradle的编译脚本,在构建过程中Gradle会据此生成一个Project的Java实例。
  2. taskGradle DSL的关键字,用于添加任务到当前那项目中。helloworld是任务的名称。后面连接的一个Groovy闭包,构建时,会返回一个名为‘helloworld’的任务。
  3. 闭包中的doLastTask的方法,根据闭包的语法,省略了方法的对象,写全的话是owner.doLast。表示向任务中添加一个打印'Hello World!'字符串的Action到任务的Action列表的最后。
  4. 一个任务(Task)可以包含很多Action,执行任务的时候,顺序执行Action


参考

  1. Groovy 官网
  2. Gradle官网
  3. [Android开发者官网-Configure your build
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念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
  • 说明 本文主要介绍和Gradle关系密切、相对不容易理解的配置,偏重概念介绍。部分内容是Android特有的(例如...
    jzj1993阅读 15,564评论 1 62
  • 某个继发的下午,我特别想找个老朋友聊聊天。于是翻了一下通讯录,可以随时老友寥寥无几。默默退出,翻了翻珍藏的老...
    芥个小粟粟阅读 510评论 0 1
  • 夏天四月的时候,司徒王允联合吕布一起杀了董卓。董卓的部将李傕、郭汜杀了王允并攻击吕布,吕布被打败了,向东逃...
    于士淋阅读 195评论 0 0
  • -1- 刚满三十的女生一个人来咨询,因为在一起八年、年底就要结婚的男友出轨了。男生出轨得甚至有些大大方方。和女同事...
    DrChen_爱偕老阅读 1,074评论 11 17