最新消息:

Gradle for android 学习笔记(一)

编程 大步 941浏览 0评论

Gradle的基本理解

为了能够使用Gradle构建android项目,我们必须设置构建脚本(build script)。这个脚本在android里的文件名为"build.gradle" 。Gradle会帮我们设置一些属性为默认值,这样就不用像Ant 或Maven那样全部手动配置。

 

gradle构建脚本不是使用xml来写的,而是使用一种叫做 domain-specific language (DSL, 特定领域语言)基于Groovy。相比起Ant这些基于XML的方式,DSL方式更具优势。

 

虽然我们不必先学Groovy才能写配置文件,但是理解Groovy,我们能够开发自己的任务和插件。而且,由于它是基于JVM的,所以,我们可以使用java或任意一种基于JVM的语言来写自定义插件。

 

 

Gradle的基本概念

gradle有两个很重要的概念:项目(project)和任务(task)。
每个构建由至少一个项目,每个项目包含一个或多个任务。每个build.gradle代表一个项目。任务被直接的定义在构建脚本中。当初始化构建进程的时候,gradle根据构建文件,整合项目和任务。一个任务对象(Task object)由一系列的按照顺序执行的动作对象(Action object)组成。一个动作对象就是一个被执行的代码块,类似于java中的方法。

 

 

构建的生命周期

gradle执行构建,就是执行依赖于其他task的task中的任务。为了简化构建的过程,构建工具创建了一个工作流程的动态模型,叫Directed Acyclic Graph(DAG)。一个任务被执行后,它就不会被再次执行。那些没有依赖(dependencies)的任务会比有依赖的任务优先执行。依赖图(The dependency graph)在构建的配置阶段产生。gradle构建有三个阶段:
初始化(Initialization):这个时候是项目被创建。如果有多个模块,那么每个都有自己的build.gradle文件,多个项目被创建。
配置(Configuration):在这个阶段,构建脚本被执行,并且创建和配置每个项目的所有任务。
执行(Execution):这个阶段,Gradle会判断哪个任务优先执行。至于哪个任务会被执行,取决于开始构建时传来的参数和当前所在的是哪个目录。

 

 

构建配置文件

对于android项目来说,build.gradle文件必须包含下面的元素:
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.2.3'
    }
}
这里面包含两个块:
仓库块(repositories block):JCenter仓库作为依赖库的源。JCenter是一个配置好了的Maven仓库。这样我们添加依赖库的时候,就不需要去手动下载jar等文件了,gradle会帮我们去jcenter上按依赖库的名称查找下载。当然,还有其他 仓库我们也可以使用,甚至是使用本地的仓库。
dependencies块:指定所使用的android构建工具gradle插件版本。

 

 

同时,每个app项目,需要通过添加下面一行,来使用android插件:
apply plugin: 'com.android.application'

 

插件的使用,是为了扩展gradle脚本的功能,可以直接使用插件中定义的属性和任务,更加方便。

 

(注意,当你不的项目不是作为应用,而是作为库来使用的时候,那么你需要将上面那行替换成:
apply plugin: ''com.android.library')

 

这两行是不能同时存在的,否则会无法构建。

 

 

当我们使用了gradle的android插件后,就可以使用android特定的方法了。如Android块:
android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"
}

 

上面分别指定项目编译的android sdk,以及所使用的构建工具版本。

 

 

项目的基本结构

一个gradle构建的android项目,其基本结构如下:
MyApp
├── build.gradle
├── settings.gradle
└── app
    ├── build.gradle
    ├── build
    ├── libs
    └── src
        └── main
            ├── java
            │   └── com.package.myapp
            └── res
                ├── drawable
                ├── layout
                └── etc.

 

当然,我们还可以在项目的根目录下添加额外的层,比如libraries/目录,来存放依赖库。

 

gradle使用一个叫做源集(source set)的概念。官方的对于源集的解释是 一组将会被编译和执行的源文件。对于android项目,main目录是一个源集,包含了所有的源代码和资源文件。当你为app写了测试,你会将测试代码放到一个单独的源集中,叫做androidTest,只包含测试代码。
目录 内容
/src/main/java
app所需要的源代码
/src/main/res
app所需要的资源文件((drawables, layouts, strings等)
/libs
使用的外部库(.jar  .aar)
/build
构建后输出的东西

Gradle Wrapper(gradle封装器)

grale版本很多,很有可能一个项目使用旧的gradle版本及构建脚本,而如果当你使用新的gradle再来构建的时候,就会构建失败。所以,为了避免这个问题,强烈推荐使用Gradle Wrapper(gradle封装器)。
Gradle Wrapper在windows下提供了一个bat文件(在项目的根目录下,叫gradlew.bat),linux提供了shell脚本。当我们从github上下载了别人使用gradle编译的android项目的时候,Gradle Wrapper就会根据项目中的构建脚本去自动下载对应的gradle版本,避免了手动下载的麻烦(不过在国内,这个过程也慢,你懂的)
使用Gradle Wrapper的bat/shell查看gradle信息
win下执行:
>gradlew –v
linux执行:
$./gradlew -v
显示:
------------------------------------------------------------
Gradle 2.8
------------------------------------------------------------
Build time:   2015-10-20 03:46:36 UTC
Build number: none
Revision:     b463d7980c40d44c4657dc80025275b84a29e31f
Groovy:       2.4.4
Ant:          Apache Ant(TM) version 1.9.3 compiled on December 23 2013
JVM:          1.7.0_79 (Oracle Corporation 24.79-b02)
OS:           Windows 8.1 6.3 amd64
gradle的下载地址:http://gradle.org/downloads

 

在下载安装gradle,并配置好系统环境变量后,创建一个build.file文件,包含下面三行:

 

task wrapper(type: Wrapper) {
    gradleVersion = '2.4'
}
然后执行:

 

$gradle wrapper
就可以得到wrapper文件了。
当然,在最新的gradle,你可以直接执行wrapper任务,而无须修改build.gradle文件。因为它默认包含了一个任务。我们可以使用--gradle-version 来指定版本:
$gradle wrapper --gradle-version 2.4
如果没有指定版本 ,则默认使用执行task的gradle的版本。
执行wrapper任务后,产生的文件目录如下:
myapp/
├── gradlew
├── gradlew.bat
└── gradle/wrapper/
    ├── gradle-wrapper.jar
    └── gradle-wrapper.properties

 

 

 

Gradle Wrapper包含三个部分:
一个bat文件或shell文件
一个jar文件,可以被bat或者shell文件使用
一个properties文件

 

 gradle-wrapper.properties包含了gradle的配置以及版本:

 

#Sat Jan 16 16:22:35 CST 2016
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-bin.zip
我们可以修改gradle的distributionUrl为自定义的。android studio会提示你更新项目所使用的gradle版本。

 

 

运行基本的构建任务

在终端,切换到项目的目录,执行:
linux 或osx:
$ gradlew tasks
win执行:
>gradlew tasks

 

这回打印所有的任务。如果我们添加" --all"参数,我们能得到每个任务的依赖信息。

 

 

构建项目(带debug信息):
$ gradlew assembleDebug
这样就会在MyApp/app/build/outputs/apk目录下看到得到的apk文件。

 

 

将项目从Eclipse迁移到Android Studio

两种方法:
第一种使用android studio的import wizard。(最好的方法, 网上有,大家自行google)
第二种手动写gradle脚本。

 

 

手动迁移

手动迁移的方式很多,我们不需要去修改目录结构,甚至可以直接从gradle脚本运行Ant脚本。

 

保持旧的项目目录结构

为了不修改目录结构,我们需要修改源集的配置。gradle和android插件都有自己默认的源集,我们这里需要覆盖它。

 

1.先在项目根目录下创建build.gradle文件,来指定android插件版本,以及构建工具版本和编译目标sdk,还有依赖库jar等:
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
               classpath 'com.android.tools.build:gradle:1.5.0'
    }
}
apply plugin: 'com.android.application'
android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"
#重新指定源集,映射到eclipse项目目录结构
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')
  }
}
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}
2.在项目根目录下创建local.properties ,用来指定android的sdk目录:
sdk.dir=C\:\\android\\android-sdk
3.执行:gradle wrapper

 

4.执行:gradlew assembleDebug

 

构建成功后,就可以看到在项目的根目录有个build目录,里面的outputs/apk目录就包含构建后的apk文件。

 

 

转换eclipse的项目目录结构

这个纯体力活了,建议还是放弃。将Eclipse迁移到android studio的最好方法是import wizard。

转载请注明:大步's Blog » Gradle for android 学习笔记(一)

SiteMap