Gradle for Android第一篇( 从Gradle和AS开始 )

正如大家所见,这是一本英文书,而由于国内的 gradle 翻译资料不全,所以特此开辟专栏,翻译 gradle for android 这本书,同时添加自己的心得体会以及在实际工作上的实战,希望大家能够喜欢。


如果你是名 Android 开发新手,或者是名从 eclipse 切换到 Android Studio 的新手,那么我强烈建议您 follow 我的文章,正如封面所见,利用 gradle 构建工具来自动构建你的 Android 项目。废话不多说,我们直接开始吧。

今天主要介绍 Android Studio 工具的使用,以及 gradle 基础入门,使用 gradle wrapper 和如何从 eclipse 迁移到 Android Studio。

这篇文章记于 2015.12.30,Android Studio 正式版本已经开发到 1.5,而预览版已经到了 2.0,所以转到 Android Studio 吧。

当你第一次打开 Android Studio 的时候,有一个视图显示你即将创建的环境以及确保你使用了最新的 Android SDK 和必要的 google 依赖包,同时会让你选择是否创建 AVD,这样你就可以使用模拟器了。在这儿多说几句:

  • 尽量使用 Android Studio 2.0,因为它真的变快了,而其模拟器的速度也提升了不少,我使用至今,也无发现任何 bug,所以完全不用担心。

  • 如果使用模拟器开发 Android,尽量使用 Genymotion 模拟器,尽管其现在的 Android 6.0 仍然有很多 bug,但是在其以下版本,其速度还是非常快的,利用模拟器开发,为虚拟机安装文件夹浏览器,是及时查看 SQLite 表文件利器,具体操作办法,可以 google。

  • 尽量使用最新的 23.0.0 以上的构建版本。


理解基本的 Gradle

如果你想创建一个 Android project 基于 gradle,那么你必须写一个构建脚本,这个文件通常称之为 build.grade,你可能已经觉察到了,当我们查看这一脚本,gradle 会为我们提供很多默认的配置以及通常的默认值,而这极大的简化了我们的工作,例如 ant 和 maven,使用他们的时候,我们需要编写大量的配置文件,而这很恶心。而 gradle 得默认配置,如果你需要使用自己的配置,完全可以简单的去重写他们就好。

Gradle 脚本不是像传统的 xml 文件那样,而是一种基于 Groovy 的动态 DSL,而 Groovy 语言是一种基于 jvm 的动态语言。

你完全不用担心,你在使用 gradle 的时候,还需要去学习 Groovy 语言,该语言很容易阅读,并且如果你已经学习过 java 的话,学习 Groovy 将不会是难事,如果你想开始创建自己的 tasks 和插件,那么你最好对 Groovy 有一个较深的理解,然而由于其基于 jvm,所以你完全可能通过纯正的 java 代码或者其他任何基于 jvm 的语言去开发你自己的插件,关于插件开发,我们后续将会有相关介绍。


Project 和 tasks

在 grade 中的两大重要的概念,分别是 project 和 tasks。每一次构建都是有至少一个 project 来完成,所以 Android studio 中的 project 和 Gradle 中的 project 不是一个概念。每个 project 有至少一个 tasks。每一个 build.grade 文件代表着一个 project。tasks 在 build.gradle 中定义。当初始化构建进程, gradle 会基于 build 文件,集合所有的 project 和 tasks,一个 tasks 包含了一系列动作,然后它们将会按照顺序执行,一个动作就是一段被执行的代码,很像 Java 中的方法。


构建的生命周期

一旦一个 tasks 被执行,那么它不会再次执行了,不包含依赖的 Tasks 总是优先执行,一次构建将会经历下列三个阶段:

  • 初始化阶段:project实例在这儿创建,如果有多个模块,即有多个build.gradle文件,多个project将会被创建。

  • 配置阶段:在该阶段,build.gradle脚本将会执行,为每个project创建和配置所有的tasks。

  • 执行阶段:这一阶段,gradle会决定哪一个tasks会被执行,哪一个tasks会被执行完全依赖开始构建时传入的参数和当前所在的文件夹位置有关。


build.gradle 的配置文件

基于 grade 构建的项目通常至少有一个 build.gradle,那么我们来看看 Android 的 build.gradle:

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

这个就是实际构建开始的地方,在仓库地址中,我们使用了 JCenter,JCenter 类似 maven 库,不需要任何额外的配置,grade 还支持其他几个仓库,不论是远程还是本地仓库。

构建脚本也定义了一个 Android 构建工具,这个就是 Android plugin 的来源之处。Android plugin 提供了所有需要去构建和测试的应用。每个 Android 应用都需要这么一个插件:

apply plugin: 'com.android.application' 

插件用于扩展 gradle 脚本的能力,在一个项目中使用插件,这样该项目的构建脚本就可以定义该插件定义好的属性和使用它的 tasks。

注意:当你在开发一个依赖库,那么你应该使用 ’com.android.library’,并且你不能同时使用他们 2 个,这将导致构建失败,一个模块要么使用 Android application 或者 Android library 插件,而不是二者。
当使用 Android 插件的时候,Android 标签将可以被使用,如下所示:

android { 
       compileSdkVersion 22 
       buildToolsVersion "22.0.1" 
}  

更多的属性我们将在第二章中进行讨论。


项目结构

和eclipse对比来看,Android studio构建的结构有很大的不同:

MyApp 
  ├── build.gradle 
  ├── settings.gradle 
  └── app 
      ├── build.gradle 
      ├── build 
      ├── libs 
      └── src 
          └── main 
              ├── java 
              │   └── com.package.myapp 
              └── res 
                  ├── drawable 
                  ├── layout 
                  └── etc.  

grade 项目通常在根文件夹中包含一个 build.gradle,使用的代码在 app 这个文件夹中,这个文件夹也可以使用其他名字,而不必要定义为 app,例如当你利用 Android studio 创建一个 project 针对一个手机应用和一个 Android wear 应用的时候,模块将被默认叫做 application 和 wearable。

gradle 使用了一个叫做 source set 的概念,官方解释:一个 source set 就是一系列资源文件,其将会被编译和执行。对于 Android 项目,main 就是一个 source set,其包含了所有的资源代码。当你开始编写测试用例的时候,你一般会把代码放在一个单独的 source set,叫做 androidTest,这个文件夹只包含测试。


开始使用 Gradle Wrapper

grade 只是一个构建工具,而新版本总是在更迭,所以使用 Gradle Wrapper 将会是一个好的选择去避免由于 gradle 版本更新导致的问题。Gradle Wrapper 提供了一个 windows 的 batch 文件和其他系统的 shell 文件,当你使用这些脚本的时候,当前 gradle 版本将会被下载,并且会被自动用在项目的构建,所以每个开发者在构建自己 app 的时候只需要使用 Wrapper。所以开发者不需要为你的电脑安装任何 gradle 版本,在 mac 上你只需要运行 gradlew,而在 windows 上你只需要运行 gradlew.bat。

你也可以利用命令行 ./gradlew -v 来查看当前 gradle 版本。下列是 wrapper 的文件夹:

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

可以看到一个 bat 文件针对 windows 系统,一个 shell 脚本针对 mac 系统,一个 jar 文件,一个配置文件。配置文件包含以下信息:

#Sat May 30 17:41:49 CEST 2015 
   distributionBase=GRADLE_USER_HOME 
   distributionPath=wrapper/dists 
   zipStoreBase=GRADLE_USER_HOME 
   zipStorePath=wrapper/dists 
   distributionUrl=https\://services.gradle.org/distributions/ 
   gradle-2.4-all.zip  

你可以改变该url来改变你的 gradle 版本。


使用基本的构建命令

使用你的命令行,导航到你的项目,然后输入:

$ gradlew tasks 

这一命令将会列出所以可运行的 tasks,你也可以添加 –all 参数,来查看所有的 task。当你在开发的时候,构建项目,你需要运行 assemble task 通过 debug 配置:

$ gradlew assembleDebug 

该任务将会创建一个 debug 版本的 app,同时 Android 插件会将其保存在 MyApp/app/build/ outputs/apk 目录下。

除了 assemble,还有三个基本的命令:

  • check:运行所以的 checks,这意味着运行所有的 tests 在已连的设备或模拟器上。

  • build:是 check 和 assemble 的集合体。

  • clean:清楚项目的 output 文件。

保持旧的 eclipse 文件结构

关于如何将 eclipse 项目导入 Android studio 本文不再介绍。

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') 
    }  
}    

在 grade 文件中配置,将会保存 eclipse 目录结构,当然,如果你有任何依赖的 jar 包,你需要告诉 gradle 它在哪儿,假设jar包会在一个叫做 libs 的文件夹内,那么你应该这么配置:

dependencies { 
       compile fileTree(dir: 'libs', include: ['*.jar']) 
}  

该行意为:将 libs 文件夹中所有的 jar 文件视为依赖包。


总结

通过本文,我们可以学习到 gradle 的优势,以及为什么要使用 gradle,我们简单的看了看 Android studio,以及其是如何帮助我们生成 build 文件。

同时我们学习了 Gradle Wrapper,其让我们维护以及分享项目变得更加简单,我们知道了如何创建一个新的项目在 Android studio 中,以及如何从 eclispe 迁移到 Android studio 并且保持目录结构。

同时我们学习了最基本的 gradle task 和命令行命令。在下一篇文章中,我们将会定制自己的 build 文件。

转自 Android开发中文站 > Gradle for Android 第一篇( 从 Gradle 和 AS 开始 )

Copyright© 2020-2022 li-xyz 冀ICP备2022001112号-1