Gradle for Android中文版(txt+pdf+epub+mobi电子书下载)


发布时间:2020-06-14 10:57:47

点击下载

作者:凯文·贝利格里姆斯 (Kevin Pelgrims)

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Gradle for Android中文版

Gradle for Android中文版试读:

前言

Android应用的构建过程是一个非常复杂的过程,涉及很多工具。首先,所有的资源文件都会被编译,并且在一个R文件中引用。然后Java代码被编译,之后通过dex工具转换成dalvik字节码。最后这些文件会被打包成一个APK文件,这个应用被最终安装在设备中之前,APK文件会被一个debug或者release的key文件签名。

这些步骤如果由人工去完成,不仅烦琐,而且费时。幸运的是,Android开发小组致力于提供关注这一打包过程的开发者工具,2013年他们推出了Gradle,作为Android应用新的首选构建系统。Gradle设计的方式使得它可以很容易地扩展构建和插入到现有的构建过程中。它提供了一套类Groovy的DSL语言,用于申明构建和创建任务,让依赖管理变得更加简单。此外,它还是完全免费和开源的。

现在,许多Android开发者已经切换到Gradle,但是仍有大部分人不知道如何很好地利用它,不清楚为什么几行代码就可以实现。本书旨在帮助那些开发人员,将他们变成Gradle的使用者。本书从Gradle基础知识开始,然后介绍依赖、构建variants、测试、创建任务等。本书涵盖内容

第1章,Gradle和Android Studio入门,解释为什么Gradle很有用、如何利用Android Studio开始工作,以及Gradle Wrapper是什么。

第2章,基本自定义构建,深入到Gradle构建文件和任务,展示如何做简单的自定义构建过程。

第3章,依赖管理,展示如何使用依赖,包括本地和远程依赖,并解释了依赖相关的概念。

第4章,创建构建Variants,介绍构建类型和product flavors,解释其不同之处,并展示如何使用签名参数。

第5章,管理多模块构建,解释如何管理应用、依赖库、测试模块,以及如何集成它们。

第6章,运行测试,介绍了一些用于单元测试和功能测试的测试框架,以及如何进行自动化测试并获得测试覆盖率报告。

第7章,创建任务和插件,解释Groovy的基础知识,并展示了如何创建自定义任务,以及如何将其hook到Android构建进程。本章还介绍了如何创建一个可重用的插件。

第8章,设置持续集成,使用最常用的CI系统,提供自动化构建指导。

第9章,高级自定义构建,展示一些提示和技巧来缩小APK的大小,加快构建进程,基于密集度或平台来分割APK。你还需要什么

为了演示所有的例子,你需要一台装有Windows、Mac OS X或者Linux的电脑。你还需要安装Java开发组件,建议你安装Android Studio,因为其在大部分章节都有提及。这本书是为谁而写的

这本书是为了那些想更好地理解构建系统、成为构建进程能手的Android开发者而编写的。我们将从Gradle的基础知识讲起,然后是创建自定义任务和插件,再到自动生成构建进程。我们假设你熟悉Android平台的开发。约定

在本书中,你会发现很多文本样式用于区分不同的信息。下面是这些样式的一些例子和它们的含义。

文本中的代码词汇、数据库表名、文件夹名、文件名、文件扩展、路径名称、假设的URL地址、用户输入以及Twitter用户定位如下所示。(每个build.gradle文件代表着一个项目。)

代码块的样式如下:buildscript { repositories { jcenter() } dependencies { classpath ‘com.android.tools.build:gradle:1.2.3’ } }

每个命令行输入或输出命令如下所示:$ gradlew tasks

新的术语和重要的单词将会是黑体。例如,你在屏幕上看到的单词,例如菜单或弹窗,将会这样显示:“在Android Studio中,你可以通过在屏幕上点击Start a new Android Studio Project”开始一个新的项目。警告或重要注释将会像这样在一个框中显示。提示和技巧会像这样显示。用户反馈

非常欢迎读者的反馈。这可以让我们了解你对本书的看法—哪些你喜欢,哪些你不喜欢。读者的反馈可以帮助我们调整内容,从而使读者能够获得更多收益。

准备发送给我们的一般的反馈,只需发送电子邮件到feedback@packtpub.com,并在邮件内容中指出书名即可。

如果你在某个方面有所专长,并且你有兴趣写书或者为一本书贡献内容,请阅读我们的作者向导:www.packtpub.com/authors。客户支持

现在,你可以自豪地说你是一本Packt发行的书的主人了,并且,我们还有很多东西可以帮助你充分利用它。下载源码

你可以在http://www.packtpub.com站点上使用你的账号下载所有你购买过的书籍的示例代码。如果你是在其他地方购买的本书,那么你可以访问http://www.packtpub.com/support,注册后,我们会把代码发送给你。勘误

尽管我们已经尽力确保我们内容的准确性,但错误在所难免。如果你发现我们书中的错误—可能是文字错误或者代码错误—如果你将它报告给我们,我们将不胜感激。这样做,不仅可以让其他读者免于受挫,还能帮助我们改进本书的后续版本。如果你发现任何错误,请访问http://www.packtpub.com/submit-errata进行报告,在以上链接的网站中,选择书名,然后单击Errata Submission表单链接,填写你所发现的错误细节。一旦你发现的错误被确认,你提交的内容将会被接受,勘误信息将被上传到我们的网站或者添加到对应标题相关的勘误小节列表中。

如果想查询以前提交的勘误信息,请访问https://www.packtpub.com/books/content/support,并在搜索区域填写书名。需要的信息将会出现在勘误列表中。侵权

互联网上的盗版问题是所有媒体一直存在的问题。对于Packt,我们非常重视保护我们的版权。如果你从互联网上遇到任何我们产品的非法拷贝,请立即为我们提供网址或者网站名称,以便我们寻求补救。

请通过电子邮件copyright@packtpub.com联系我们并附带盗版资料的链接。

非常感谢你帮助保护我们的作者,而我们将为你带来有价值的内容。问题

如果你对本书有任何方面的疑问,都可以通过电子邮件questions@packtpub.com联系我们,我们将尽最大的努力解决这个问题。1 Gradle和Android Studio入门

当谷歌推广Gradle和Android Studio的时候,他们立下了一些目标。他们想让代码复用、构建variant、配置和定制构建过程变得更加简单。最重要的是,他们想整合一个好用的IDE,让构建系统不再依赖于IDE,并使得通过命令行或者持续集成服务器运行Gradle生成的结果,和在Android Studio中执行构建生成的结果一致。

整本书我们都会谈到Android Studio,因为其常常提供一些构建项目的简单方式,以及构建variant等。如果你还没有安装Android Studio,那么你可以通过Android开发者网站下载:http://developer.android.com/sdk/index.html。

本章我们将讲解以下内容:● 了解Android Studio● 理解Gradle基础● 创建新的项目● 开始使用Gradle wrapper● 从Eclipse迁移到Android Studio1.1 Android Studio

2013年5月,谷歌发布了Android Studio开发工具(作为前期可访问的预览版),并对Gradle进行了支持。Android Studio基于JetBrains 的IntelliJ IDEA,但是其针对Android开发进行了相关的特定设计。其不仅适用于Linux、Mac OS X和Microsoft Windows操作系统,而且还是免费的。

与Eclipse相比,Android Studio拥有更好的用户交互界面、更好的内存监视器、更好的字符串翻译编辑器,对可能出现的Android的特定问题给出警告,并提供了一系列针对Android开发者的特性。除了常用的Project视图和Packages视图外,Android Studio还针对Android项目提供了Android视图。该视图对Gradle脚本、drawables和其他资源进行了分组。随着Android Studio稳定版1.0的发布,谷歌不再针对Eclipse的ADT进行更新,并建议所有开发者都将开发工具转移到Android Studio上。这意味着谷歌不再为Eclipse提供新的功能。目前,所有IDE相关工具的开发都已基于Android Studio,如果你还在使用Eclipse,那么是时候改变了,只有这样才不会被时代抛在身后。

一个简单的Android应用项目在Android Studio中的样子如图1-1所示。图1-1 Android Studio保持版本更新

Android Studio有四个不同的更新途径:● 金丝雀版为最新版,但是可能包含bug。● 开发版每个月或多或少都需要更新。● 测试版有完整的更新,但是仍然可能包含bug。● Android Studio默认为稳定版,作为功能全面测试的版本,它应

该没有bug。

默认情况下,Android Studio会在每次启动的时候,检查是否有版本更新,并且及时通知你。

当你第一次启动Android Studio时,它会打开向导来帮助你设置环境变量,确保你有最新的Android SDK以及必要的Google依赖库。它也会让你选择是否创建虚拟机(Android Virtual Device,AVD),创建虚拟机后,你就可以在虚拟设备上运行App了。1.2  理解Gradle基础

如果你想用Gradle构建你的Android项目,那么你需要创建一个构建脚本,这个脚本通常被叫作build.gradle。注意,当我们学完Gradle基础后你会发现,Gradle有约定优于配置的原则,即为设置和属性提供默认值。这使得相比Ant或者Maven,它更容易上手使用,而Ant在Android项目的构建上存活了很长时间。你大可不必完全遵循这些约定,通常情况下,它们都是可覆盖的。

Gradle构建脚本的书写没有基于传统的XML文件,而是基于Groovy的领域专用语言(DSL)。Groovy是一种基于Java虚拟机的动态语言。Gradle团队认为,基于动态语言的DSL语言与Ant或者任何基于XML的构建系统相比,优势都十分显著。

这并不意味着在我们开始学习构建脚本之前,需要学习Groovy。Groovy代码非常易读,如果你学习过Java,那么学习Groovy的曲线不会陡峭。如果你想创建自己的任务和插件(这些我们会在稍后的章节谈到),那么对Groovy有更深层次的理解就显得尤为重要。然而,因为其是基于Java虚拟机的,所以你完全可以用Java或者其他基于Java虚拟机的语言来编写你的自定义插件。1.2.1 项目和任务

在Gradle中,最重要的两个概念是项目和任务。每一次构建都包括至少一个项目,每一个项目又包括一个或多个任务。每个build.gradle文件都代表着一个项目,任务定义在构建脚本里。当初始化构建过程时,Gradle会基于build文件组装项目和任务对象。一个任务对象包含一系列动作对象,这些动作对象之后会按顺序执行。一个单独的动作对象就是一个待执行的代码块,它和Java中的方法类似。1.2.2 构建生命周期

执行一个Gradle构建的最简单的形式是,只执行任务中的动作,而这些任务又依赖于其他任务。为了简化构建过程,构建工具会新建一个动态的模型流,叫作Directed Acyclic Graph (DAG)。这意味着所有的任务都会被一个接一个地执行,循环是不可能的。一旦一个任务被执行,其就不会被再次执行。那些没有依赖的任务通常会被优先执行。在构建的配置阶段会生成依赖关系图。一个Gradle的构建通常有如下三个阶段。● 初始化:项目实例会在该阶段被创建。如果一个项目有多个模块,

并且每一个模块都有其对应的build.gradle文件,那么就会创建多

个项目实例。● 配置:在该阶段,构建脚本会被执行,并为每个项目实例创建和

配置任务。● 执行:在该阶段,Gradle将决定哪个任务会被执行。哪些任务被

执行取决于开始该次构建的参数配置和该Gradle文件的当前目

录。1.2.3 构建配置文件

每一个基于Gradle构建的项目,都应该至少有一个build.gradle文件。Android的构建文件中,有一些元素是必需的:buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:1.2.3' }}

这就是实际构建配置的地方。在repositories代码块中,JCenter库被配置为整个构建过程的依赖仓库。JCenter是一个预配置的Maven仓库,不需要额外的配置。当然在Gradle中有多个仓库可供选择,你可以很容易地添加自己的本地或远程仓库。

构建脚本代码块在Android构建工具上定义了一个依赖,就像Maven的artifact。这就是Android插件的来源,Android插件提供了构建和测试应用所需要的一切。每一个Android项目都应该申请该插件:apply plugin: 'com.android.application'

插件用于扩展Gradle构建脚本的能力。在一个项目中应用一个插件,该项目就可以使用该插件预定义的一些属性和任务。如果你正在构建一个依赖库,那么你需要声明'com.android.library',而不是‘com.android.application’。你不能在一个模块中同时使用它们,因为这会导致构建错误。一个模块可以是一个Android应用模块,或者是一个Android依赖模块,但不能二者都是。

当你使用Android插件时,不仅可以配置针对Android的特殊约定,还可以生成只应用于Android的任务。下面的Android代码片段是由插件来定义的,可以配置在每个项目中:android{ compileSdkVersion 22 buildToolsVersion "22.0.1"}

这是配置Android特殊约定参数的一部分。Android插件为Android的开发需求提供了一整套DSL。唯一需要的参数属性是编译目标和构建工具。编译目标由compileSdkVersion规定,compileSdkVersion是用来编译应用的SDK版本。使用最新的Android API版本作为编译目标。

在build.gradle文件中还有很多自定义特性。我们将在第2章中讲解最重要的特性,其他特性将在本书的其余部分介绍。1.2.4 项目结构

和Eclipse项目相比,Android项目的文件夹结构的改变相当大。正如前面所提到的,Gradle的优点是约定优于配置,其同样适用于文件夹结构。

一个简单的应用的文件夹结构如图1-2所示。图1-2 文件夹结构

Gradle项目通常会在根目录下创建一个gradle脚本文件,这使得其在后续阶段新增模块变得更加简单。所有的应用源代码都在app文件夹下。该文件夹名称默认情况下也是模块的名称,但是其不必被命名为app。例如,当你使用Android Studio创建一个手机应用和一个Android智能可穿戴手表应用项目时,默认情况下模块会被叫作application和wearable。

Gradle使用一个叫作源集(source set)的概念。Gradle的官方文档是这样解释的:一个源集就是一组源文件,它们会被一起执行和编译。对于一个Android项目而言,main就是一个源集,它包含了所有的源代码和资源,是应用程序默认版本的源集。当你开始为Android应用编写测试代码时,你可以把所有测试相关的源代码都放在一个独立的源集中,该源集被叫作androidTest,只包含测试代码。

表1-1是一个Android应用中主要的文件夹的简短概述。表1-1 Android应用中主要的文件夹的简短描述内容目录内容/src/main/java应用的源代码应用相关的资源(drawables、layouts、/src/main/resstrings等)外部库(.jar或者.aar)/libs/build构建过程的输出1.3  创建新项目

在Android Studio中,你可以通过在启动界面单击Start a new Android Studio project或导航到File|New Project…来创建新的项目,如图1-3所示。图1-3 创建新项目

在Android Studio中创建新项目时会启动一个向导,它会帮助你设置好一切。向导的第一屏用于设置应用名称和公司域名。应用程序的名称就是在应用安装时,被用作应用的名称和toolbar的默认名称。公司域名结合应用程序名称,可以确定包的名称,包的名称是所有Android应用的唯一标识符。如果你想要一个不同的包的名称,那么你可以单击Edit去更改它。你也可以更改项目在你的硬盘上的位置。

在通过向导执行下面所有步骤之前,不会生成任何文件,因为下面几个步骤将会定义哪些文件需要被创建。

Android不仅可以运行在手机和平板上,还支持很多广泛的电子设备,例如TV、手表和眼镜等。图1-4所示的向导页可以帮助你在项目中设置你的所有目标电子设备。你可以选择开发包含的依赖包和构建插件。在这里,你可以决定是否只制作一个手机和平板应用,还是想包含一个Android TV模块、一个Android Wear模块或者一个Google Glass模块。在这之后,你仍然可以添加这些模块,但是向导页可以让添加所有必需文件和配置变得更加简单。在这里,你需要选择你想支持的Android版本号。如果你选择了API 21以下的版本,那么Android支持库(包括appcompat依赖库)将会自动被添加为依赖。图1-4 向导下载示例代码你可以从http://www.packtpub.com网站(通过你的账户)下载所有你购买过的Packt出版的书籍的示例代码文件。如果你在其他地方购买了这本书,那么你可以访问http://www.packtpub.com/support,并注册,我们会直接通过邮件的方式将示例代码文件发送给你。

图1-5所示的向导页提示你添加一个activity活动页面,并提供了很多选择,所有这些都会生成相关代码,使得它更加容易上手。如果你选择让Android Studio为你生成一个activity,那么下一步就会输入该activity的类名、layout文件名和菜单资源,以及这个activity的标题。图1-5 生成一个activity

在你走完整个向导流程之后,Android Studio会根据你在向导期间的选择,生成一个activity和一个fragment的源代码。为了构建该项目,Android Studio还会生成基本的Gradle文件。你可以在整个项目的根目录下找到一个叫作settings.gradle的文件和一个叫作build.gradle的文件。在应用模块文件夹内,也有一个build.gradle文件。我们会在第2章中详细地介绍这些内容和创建这些文件的用途。

触发Android Studio构建任务的方式有以下几种:● 在Build菜单里,你可以单击Make Project,或者使用快捷键,在

PC上是Ctrl+F9,在Mac OS X上是Cmd + F9 。● 单击工具栏上的Make Project按钮。● Gradle工具窗列出了所有可用的Gradle任务。

你可以试着执行Gradle工具窗中的assembleDebug来构建项目,或者执行installDebug,在设备或模拟器上安装应用。我们将在1.4节中讲解这些任务。1.4 Gradle Wrapper入门

Gradle是一个不断发展的工具,新版本可能会打破向后兼容性,而使用Gradle Wrapper可以避免这个问题,并能确保构建是可重复的。

Gradle Wrapper为微软的Windows操作系统提供了一个batch文件,为其他操作系统提供了一个shell脚本。当你运行这段脚本时,需要的Gradle版本会被自动下载(如果它还不存在)和使用。其原理是,每个需要构建应用的开发者或自构建系统可以仅仅运行Wrapper,然后由Wrapper搞定剩余部分。因此,我们不需在开发者机器或构建服务器上手动安装正确的Gradle版本,此外,Gradle还建议把Wrapper文件添加到你的版本控制系统中。

运行Gradle Wrapper和直接运行Gradle没什么不同,你只需在Linux和Mac OS X上执行gradlew,在Microsoft Windows中运行gradlew.bat来代替常规gradle命令即可。1.4.1 获取Gradle Wrapper

为了方便起见,每个新的Android项目都会包含Gradle Wrapper,所以当你创建一个新项目时,你不必做任何事情就可以获得Gradle Wrapper的必要文件。当然,你也可以手动安装Gradle到你的电脑,并把它运用在你的项目上,但是Gradle Wrapper可以做同样的事情,并能确保Gradle版本的正确性。在使用Gradle构建和脱离Android Studio开发时,最好的方式就是使用Wrapper。

你可以通过导航来到项目根目录,在terminal上运行./gradlew -v或在命令行上运行gradlew.bat -v来检查你的项目中的Gradle Wrapper是否可用。运行该命令将会显示Gradle的版本号和一些你额外设置的参数信息。如果你转换到一个Eclipse项目,那么默认情况下Wrapper将不会存在。这种情况下,你可以使用Gradle来生成Wrapper,但是你首先需要安装Gradle,然后才能得到Wrapper。Gradle下载页面(http://gradle.org/downloads)有二进制文件和源代码文件的链接,如果你使用Mac OS X系统,则可以使用一个包管理器,例如Homebrew。安装页面上有全部的安装说明(http://gradle.org/installation)。

在下载和安装完Gradle之后,把它添加到你的PATH下,创建一个包含下面3行的build.gradle文件:task wrapper(type: Wrapper) { gradleVersion = '2.4'}

之后,运行gradle wrapper来生成Wrapper文件。

在最近几个版本的Gradle中,你也可以不修改build.gradle文件来运行Wrapper任务,因为Gradle默认包含了这个任务。这种情况下,你可以将版本号作为--gradle-version的参数,就像这样:$ gradle wrapper --gradle-version 2.4

如果你没有指定特定版本号,那么Wrapper版本会被配置为使用这个任务执行的Gradle对应的版本。

这些都是通过wrapper task生成的文件:myapp/ ├── gradlew ├── gradlew.bat └── gradle/wrapper/ ├── gradle-wrapper.jar └── gradle-wrapper.properties

可以看到,Gradle Wrapper有三部分:● Microsoft Windows上的batch文件,Linux和Mac OS X上的shell脚

本。● batch文件和shell脚本需要用到的JAR文件。● 一个properties文件。

gradle-wrapper.properties文件包含了参数配置,并能决定使用哪一个Gradle版本:#Sat May 30 17:41:49 CEST 2015distributionBase=GRADLE_USER_HOMEdistributionPath=wrapper/distszipStoreBase=GRADLE_USER_HOMEzipStorePath=wrapper/distsdistributionUrl=https\://services.gradle.org/distributions/ gradle-2.4-all.zip

如果你想使用内部分发的自定义Gradle版本,那么可以修改该URL路径。这也意味着,任何你使用的应用或者依赖库都可以有一个不同的Gradle URL,所以在运行wrapper之前,一定要检查它是否是可信任的属性。

当项目中使用的不是最新的Gradle版本时,Android Studio将会显示一个提醒,提示并建议你自动更新Gradle版本。其原理是,Android Studio更改了gradle-wrapper.properties的配置并触发了一次构建,这样最新版本的Gradle就会被下载。Android Studio根据properties文件中的信息来决定应该使用的Gradle版本,它会在你项目的Gradle Wrapper文件夹下运行Wrapper。但是,它不能使用shell或bash脚本,所以你无法自定义它们。1.4.2 运行基本构建任务

使用terminal或命令提示符,可以导航到项目根目录,运行带有tasks的Gradle Wrapper命令:$ gradlew tasks

这将打印出所有可用的任务列表。如果你添加了--all参数,那么你将获得每个任务对应依赖的详细介绍。在微软的Windows操作系统上,你需要运行gradlew.bat;而在Linux和Mac OS X操作系统上,完整的命令是./gradlew。为简便起见,我们在整本书中将只写gradlew。

当你在开发阶段构建项目时,可以运行带有debug参数的assemble任务:$ gradlew assembleDebug

这个任务会为这个应用创建一个debug版本的APK。默认情况下,Gradle的Android插件会把APK保存在MyApp/app/build/outputs/apk目录下。任务名称简写为了避免大量的终端输入,Gradle提供了一种快捷方式,即驼峰式缩写任务名称。例如,你可以通过运行gradlew assDeb来执行assembleDebug,或直接在命令行界面输入gradlew aD。有一点需要注意,其只在驼峰式缩写独一无二的情况下有效。如果另一个任务具有相同的缩写,那么此快捷方式就不再生效。

除了assemble外,还有其他三个基本任务。● Check:运行所有的检查,这通常意味着在一个连接的设备或模

拟器上运行测试。● Build:触发assemble和check。● Clean:清除项目的输出。

我们将在第2章中详细讨论这些任务。1.5 迁移出Eclipse

把一个Eclipse项目迁移至Gradle的方式有两种:● 使用Android Studio导入向导,让其自动处理迁移。● 在Eclipse项目中添加Gradle脚本,并手动设置一切。

对大部分项目来说,使用导入向导迁移非常简单,它能够把一切东西都自动转换。如果有哪些文件是向导不能转换的,那么它也会给出提示,告诉你哪里必须修改后才能继续迁移。

但是有些项目可能非常复杂,需要手动迁移。如果你有一个庞大的项目,那么你可能更倾向于一步一步迁移,而不是一次全部迁移。Gradle支持执行Ant任务,甚至整个Ant构建。这样做,你可以平稳地过渡并且缓慢地迁移所有组件。1.5.1 导入向导

在使用导入向导之前,你需要打开Android Studio,单击File菜单,然后单击Import Project...,或者在Android Studio的开始窗口,单击Import Non-Android Studio project。

如果你迁移一个带有JAR文件或者依赖库源码的项目,那么导入向导会建议你把它们替换为Gradle的依赖包。这些依赖包可以来自于本地的Google仓库(例如Android Support Library)或者知名的远程仓库中心。如果在Google或在线仓库中没有找到与之匹配的依赖包,那么JAR文件会和之前的Eclipse一样被使用。导入向导会为你的应用创建至少一个模块。如果你的项目中带有源代码的依赖库,那么它们也会被转换为相应的模块。

图1-6为导入向导示意图。图1-6 导入向导

在迁移项目时,Android Studio会创建一个新文件夹以确保你不会丢失任何文件,你可以轻松地比较原有工程和导入后的结果。当迁移完成后,Android Studio会打开项目并展示一个导入摘要。

该摘要列出了导入向导决定忽略且没有复制到新项目中的所有文件,如果你想包含这些文件,那么你只能把它们手动复制到新项目中。在被忽略文件的正下方,摘要还展示了导入向导能够将JAR替换成Gradle依赖包的所有JAR文件。Android Studio会在JCenter上尝试找到这些依赖包。如果你使用了支持库,那么包含Google仓库的方式是使用SDK manager下载到你的电脑,而不是使用JAR文件。最后,摘要列出了导入向导迁移的所有文件,展示了它们的原始位置和最新位置。

导入向导也会添加三个Gradle文件:settings.gradle、根目录的build.gradle,以及模块中的build.gradle。

如果你有包含源代码的依赖库,那么导入向导会把它们全部迁移为Gradle工程,并且根据需要链接在一起。

现在该项目构建应该没有任何问题了,但是请记住,你可能需要连接互联网去下载一些必要的依赖包。

复杂的项目可能需要我们做一些额外的工作,所以下面就一起来看看如何手动迁移。Eclipse导出向导在Eclipse中也有一个导出向导,但是其已经完全被遗弃,因为谷歌的Android工具小组已经停止了对Eclipse的Android开发工具的开发。所以,作为替代,建议使用Android Studio中的导入向导。1.5.2 手动迁移

手动迁移到基于Gradle的Android项目的方式有很多种,不需要更改为新的目录结构,甚至可以在你的Gradle脚本上运行Ant脚本。这使得迁移过程变得更加灵活,并且让较大的项目更容易过渡。我们将在第9章中介绍如何在Gradle上运行Ant任务。1. 保留旧的项目结构

如果你不想移动文件位置,那么可以在你的项目中保留Eclipse文件目录结构。要想做到这一点,你需要更改一下源集(source set)的配置。在我们讨论项目结构的时候提到过源集。通常情况下,Gradle和Android插件是有默认值的,但是其有可能被覆盖。

你需要做的第一件事就是在项目的根目录下创建一个build.gradle文件。该文件应申请Android插件,并设置Gradle和Android插件的属性。最简单的形式如下所示:buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:1.2.3' }}apply plugin: 'com.android.application'android { compileSdkVersion 22 buildToolsVersion "22.0.1"}

然后你就可以开始修改源集了。通常来讲,按照Eclipse的目录结构来覆写main源集的示例如下:android { sourceSets { main { manifest.srcFile 'AndroidManifest.xml' java.srcDirs = ['src'] resources.srcDirs = ['src'] aidl.srcDirs = ['src'] renderscript.srcDirs = ['src'] res.srcDirs = ['res'] assets.srcDirs = ['assets'] } androidTest.setRoot('tests') }}

在Eclipse的文件夹结构中,所有的源文件都被放在同一个文件夹下,所以你需要告诉Gradle,所有的组件都应放在src文件夹下。你只需将项目中的组件包含在内即可,但是将它们都放进去也没什么不妥。

只要你有JAR文件依赖,你就需要告诉Gradle依赖包的文件路径。假设JAR文件在一个叫作libs的文件夹下,那么配置应该是这样的:dependencies { compile fileTree(dir: 'libs', include: ['*.jar'])}

这一行将libs目录下所有后缀名为.jar的文件视为一个依赖。2. 转换到新的项目结构

如果你决定手动转换到新的项目结构,那么你还需要创建一些文件夹并移动一些文件。表1-2描述了最重要的文件和文件夹,以及转移到新项目结构时,你需要将它们移动到哪儿。表1-2 转到新的项目结构旧的位置新的位置app/src/main/java/src/app/src/main/res/res/app/src/main/assets/assets/app/src/main/AndroidManifest.xmlAndroidManifest.xml

如果你有单元测试,那么你需要将源代码迁移到app/src/test/java/下,以便让Gradle自动识别它们。功能测试代码则应放到app/src/androidTest/java/文件夹下。

接下来就是在项目的根目录下创建settings.gradle文件。该文件只需一行代码,它的目的是告诉Gradle将app模块包含到构建中去:include: ':app'

当这些都准备好后,你需要两个build.gradle文件来进行一次成功的Gradle构建。第一个文件位于项目根目录(和settings.gradle同级)下,用来定义项目级别的参数设置:buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:1.2.3' }}

上述代码为项目中的所有模块都设置了一些属性。第二个build.gradle文件在app目录下,其包含了一些特定模块的参数设置:apply plugin: 'com.android.application'android { compileSdkVersion 22 buildToolsVersion "22.0.1"}

这些都是最基础的知识。如果你有一个不依赖于第三方代码的简单的Android应用,那就足够了。如果你有任何依赖,那么你就需要将其迁移到Gradle。3. 迁移依赖库

如果在你的项目中有包含Android代码的依赖库,那么它们也需要使用Gradle,以便更好地与app模块交互。同样需要申请插件,只是你需要使用Android依赖库插件来代替Android应用插件,具体细节我们在第5章中讨论。1.6 总结

在本章的开篇,我们分析了Gradle的优势,以及它比现阶段其他正在使用的构建系统更加好用的原因,随后简单分析了Android Studio以及其是如何通过生成构建文件来帮助我们的。

简单介绍之后,我们分析了让维护和分享项目变得更加容易的Gradle Wrapper。我们通过Android Studio创建了一个新项目,并且介绍了如何自动和手动地将一个Eclipse项目迁移到Android Studio和Gradle上。最后我们还介绍了如何利用Android Studio构建项目,或是直接通过命令行来构建项目。

在接下来的几章中,我们将着眼于如何自定义构建,即进一步自动化构建的过程,这可使得维护项目更加容易。下一章,我们将审视所有的标准Gradle文件,探索基本的构建任务,以及自定义部分构建。2 基本自定义构建

本章我们将从分析Gradle的用法开始,然后讲解创建和转换Android项目。通过本章我们将更好地理解这些构建文件,本章还会分析一些有用的任务,并探索Gradle插件和Android插件的可能性。

本章我们将介绍以下主题:● 理解Gradle文件● 开始构建任务● 自定义构建2.1 理解Gradle文件

当用Android Studio创建一个新项目时,会默认生成三个Gradle文件。其中的两个文件——settings.gradle和build.gradle位于项目的根目录。另外一个build.gradle文件则在Android app模块内被创建。图2-1展示了在项目中Gradle文件的位置。图2-1 项目中Gradle文件的位置

这三个文件每一个都有自己的用途,我们会在接下来的章节中进一步研究。2.1.1 settings文件

对于一个只包含一个Android应用的新项目来说,settings.gradle应该是这样的:Include ':app'

settings文件在初始化阶段被执行,并且定义了哪些模块应该包含在构建内。在本例中,app模块被包含在内。单模块项目并不一定需要setting文件,但是多模块项目必须要有setting文件,否则,Gradle不知道哪个模块应包含在构建内。

在这背后,Gradle会为每个settings文件创建一个Settings对象,并调用该对象的相关方法。你不必知道Settings类的相关细节,但意识到这一点是非常好的。完整的Setting类解释超出了本书范围。如果你想了解更多信息,可以到Gradle文档中寻找(https://gradle.org/docs/current/dsl/org.gradle.api.initialization.Settings.html)。2.1.2 顶层构建文件

在项目中,所有模块的配置参数都应在顶层build.gradle文件中配置。默认情况下其包含如下两个代码块:buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:1.2.3' }}allprojects { repositories { jcenter() }}

实际构建配置在buildscript代码块内,在第1章中我们曾简要介绍过。repositories代码块将JCenter配置成一个仓库,在这种情况下,一个仓库意味着一系列的依赖包,或者说,在我们应用和依赖项目中可使用的一系列可下载的函数库。JCenter是一个很有名的Maven库。

dependencies代码块用于配置构建过程中的依赖包。这也意味着你不能将你的应用或依赖项目所需要的依赖包包含在顶层构建文件中。默认情况下,唯一被定义的依赖包是Gradle的Android插件。每个Android模块都需要有Android插件,因为该插件可使其执行Android相关的任务。

allprojects代码块可用来声明那些需要被用于所有模块的属性。你甚至可以在allprojects中创建任务,这些任务最终会被运用到所有模块。只要你使用了allprojects,模块就会被耦合到项目。这意味着,其很可能在没有主项目构建文件的情况下,无法独立构建模块。最初,这看起来可能不是一个问题,但是如果你后面想要分离一个内部依赖库到自己的项目,那么你将需要重构你的构建文件。2.1.3 模块的构建文件

模块层的build.gradle文件的属性只能应用在Android app模块,它可以覆盖顶层build.gradle文件的任何属性。该模块的构建文件示例如下:apply plugin: 'com.android.application' android { compileSdkVersion 22 buildToolsVersion "22.0.1" defaultConfig { applicationId "com.gradleforandroid.gettingstarted" minSdkVersion 14 targetSdkVersion 22 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile ('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:22.2.0' }

我们将对这三个主要代码块进行详细研究。1. 插件

第一行用到了Android应用插件,该插件在顶层构建文件中被配置成了依赖,这些我们在前面讨论过。谷歌的Android工具团队负责Android插件的编写和维护,并提供构建、测试和打包Android应用以及依赖项目的所有任务。2. Android

在构建文件中,占比最大的是android代码块。该代码块包含了全部的Android特有配置,这些特有配置之所以可被使用,是因为之前我们使用了Android插件。

必须有的属性是compileSdkVersion和buildToolsVersion:● 第一个,compileSdkVersion,是要用来编译应用的Android API

版本。● 第二个,buildToolsVersion,是构建工具和编译器使用的版本号。

构建工具包含命令行应用,如aapt、zipalign、dx和renderscript,这些都被用来在打包应用时生成各种中间产物。你可以通过SDK Manager下载构建工具。defaultConfi代码块用于配置应用的核心属性。此代码块中的属性可覆盖AndroidManifest.xml文件中对应的条目:defaultConfig { applicationId "com.gradleforandroid.gettingstarted" minSdkVersion 14 targetSdkVersion 22 versionCode 1 versionName "1.0"}

applicationId是这段代码中的第一个属性。该属性覆盖了manifest文件中的package name,但applicationId和package name有一些不同。在Gradle被用作默认的Android构建系统之前,AndroidManifest.xml中的package name有两个用途:作为一个应用的唯一标志,以及在R资源类中被用作包名。使用构建variants,Gradle可更容易地创建不同版本的应用。例如,构建variants可以很容易地构建一个免费版和一个付费版应用。这两个版本需要有独立的标识符,这样它们才能在Google Play Store中以不同的应用出现,并且可以同时被安装。然而,资源代码和生成的R类,必须在任何时候都保持相同的包名,否则,你的所有源文件都要随着你正在构建的版本而改变。这就是Android工具团队解耦了package name两种不同用法的原因。定义在manifest文件中的package,继续用在你的源代码和R类中,而之前被用作设备和Google Play唯一标识的package name,现在则被称之为application id。在我们开始尝试不同的构建类型时,application id将会变得更加有趣。

在defaultConfi中,接下来的两个属性是minSdkVersion和targetSdkVersion。这两个属性看起来很熟悉,是因为它们通常作为标签的一部分,在manifest中被定义。minSdkVersion被用来配置运行应用的最小API级别。targetSdkVersion用于通知系统,该应用已经在某特定Android版本通过测试,从而操作系统不必启用任何向前兼容的行为。这和我们之前看到的compileSdkVersion没有任何关系。

versionCode和versionName在manifest文件中的作用相同,即为你的应用定义一个版本号和一个友好的版本名称。构建文件中的属性

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载