Gradle是可以用于Android开发的新一代的 Build System, 也是 Android Studio默认的build工具。

Gradle脚本是基于一种JVM语言 -- Groovy,再加上DSL(领域特定语言)组成的。

因为Groovy是JVM语言,所以可以使用大部分的Java语言库。所谓DSL就是专门针对Android开发的插件,比如标准Gradle之外的一些新的方法(Method)闭包(Closure)等。

由于Gradle的语法足够简洁,而且可以使用大部分的java包,当之无愧地成为新一代 Build System。

使用Android Studio新建一个工程后,默认会生成两个build.gralde文件,一个位于工程根目录,一个位于app目录下。还有另外一个文件 --settings.gradle

根目录下的脚本文件是针对module的全局配置,它的作用阈所包含的所有 module 是通过settings.gradle来配置。

app文件夹就是一个module,如果在当前工程中添加了一个新的module -- lib,就需要在settings.gralde文件中包含这个新的module。

gradle脚本的基本结构

用我现在的工程举例来说,根目录的build.gradle的内容如下所示:

  1. // Top-level build file where you can add configuration options common to all sub-projects/modules.
  2. buildscript {
  3. repositories {
  4. jcenter()
  5. }
  6. dependencies {
  7. classpath 'com.android.tools.build:gradle:1.0.0-rc4'
  8. // NOTE: Do not place your application dependencies here; they belong
  9. // in the individual module build.gradle files
  10. }
  11. }
  12. allprojects {
  13. repositories {
  14. jcenter()
  15. maven {
  16. url 'http://mvnrepo.xxx.com/mvn/repository'
  17. }
  18. }
  19. }

classpath 'com.android.tools.build:gradle:1.0.0-rc4'就是Android特有的插件,maven仓库位于通过方法jCenter() 获取,这也是默认的maven仓库。当然也可以添加额外的maven仓库地址,例如以上文件中的

maven {
url 'http://mvnrepo.xxx.com/mvn/repository'
}

然后是 settings.gradle 文件:

  1. include ':app'

app就是项目包含的一个module,如果有多个module,可以在为 include 方法添加多个参数。


最后是app/build.gradle

  1. apply plugin: 'com.android.application'
  2. android {
  3. compileSdkVersion 21
  4. buildToolsVersion "21.1.1"
  5. compileOptions {
  6. sourceCompatibility JavaVersion.VERSION_1_7
  7. targetCompatibility JavaVersion.VERSION_1_7
  8. }
  9. defaultConfig {
  10. applicationId "your.application.id"
  11. minSdkVersion 14
  12. targetSdkVersion 21
  13. versionCode 2
  14. versionName "2.0.0"
  15. }
  16. signingConfigs {
  17. release {
  18. storeFile file('release.keystore')
  19. storePassword "yourstorepassword"
  20. keyAlias "yourkeyalias"
  21. keyPassword "yourkeypassword"
  22. }
  23. debug {
  24. storeFile file('debug.keystore')
  25. }
  26. }
  27. buildTypes {
  28. release {
  29. minifyEnabled true
  30. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
  31. signingConfig signingConfigs.release
  32. }
  33. debug {
  34. signingConfig signingConfigs.debug
  35. }
  36. }
  37. productFlavors {
  38. inner {
  39. applicationId "your.application.inner.id"
  40. versionName "2.0.0"
  41. }
  42. market {
  43. }
  44. }
  45. }
  46. repositories {
  47. flatDir {
  48. dirs 'libs'
  49. }
  50. }
  51. dependencies {
  52. // 通用
  53. compile name: 'volley', ext: 'aar'
  54. compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.3'
  55. compile 'com.alibaba:fastjson:latest.integration'
  56. // 项目相关(已删除)
  57. }

Groovy 的基本语法

方法调用

  1. apply plugin: 'com.android.application'

以上语句中的apply是一个方法,给它传递了一个参数pluginplugin 的值是'com.android.application'

如果有多个参数,则以逗号隔开,例如

  1. <code>compile name: 'volley', ext: 'aar'</code>

闭包

Groovy中花括号包含的部分成为一个闭包(Closure)。例如下面的代码

  1. compileOptions {
  2. sourceCompatibility JavaVersion.VERSION_1_7
  3. targetCompatibility JavaVersion.VERSION_1_7
  4. }

compileOptions 是一个 Method, 它的参数是一个闭包,这个闭包内依次执行了两个方法 -- sourceCompatibilitytargetCompatibility, 参数都是JavaVersion.VERSION17

闭包也可以嵌套包含

  1. repositories {
  2. flatDir {
  3. dirs 'libs'
  4. }
  5. }

常见使用方法

包依赖(aar)

使用aar时可以分为两种情况

① aar位于本地目录

  1. 首先在 android 的参数闭包中添加调用方法 repositories

    1. repositories {
    2. flatDir {
    3. dirs 'libs'
    4. }
    5. }
  2. 然后在 dependencies 的参数闭包中添加

    1. compile name: 'volley', ext: 'aar'

② aar位于远程仓库

这里以maven为例,当然也可以使用其他类型的仓库,例如 Ivy

只需要在jar包引用方式后面添加一个@aar就可以了

  1. compile 'com.alibaba:fastjson:latest.integration@aar'

包依赖(jar)

  1. compile group: 'com.alibaba', module: 'fastjson', version: 'latest.integration'

可以简写成

  1. compile 'com.alibaba:fastjson:latest.integration'

latest.integration可以替换成具体的版本号,这里是获取服务器上的最新版本。

去掉重复依赖

  1. compile 'com.alibaba.fastjson.latest.integration' {
  2. exclude module: 'annotations', group: 'com.google.android'
  3. }

使用 Java7

  1. compileOptions {
  2. sourceCompatibility JavaVersion.VERSION_1_7
  3. targetCompatibility JavaVersion.VERSION_1_7
  4. }

productFlavors

针对不同的APP分发渠道,我们可以定义不同的 product flavor。也可以定义内部版本外部版本,内部版本中包含了一些调试代码,这些代码在发布时并不会被编译进最后的APP中。而且可以分别为内部版本和外部版本指定不同的ApplicationId,这样在同一个设备上可以同时安装两个版本以方便调试。

命令行执行Gradle脚本

在Android工程根目录下会自动生成一个shell脚本 - gradlew,执行之前记得加上x属性 - chomod +x gradlew

gradle脚本中包含了很多 task,可以通过task名来指定需要执行的task。

  • ./gradlew build
  • ./gradlew assemble
  • ./gradlew assembleInnderDebug

总结

不得不说,Gradle实在太好用了!虽然 Gradle 可以与 Ant 或 maven
配合使用,但是其简洁和功能性远远超过其他两个。我现在开发的项目普遍使用的是
maven,不知道什么原因,使用Gradle时经常会遇到一些无法获取远程依赖包的问题,最简单的解决办法就是把依赖包下载的本地。

快速掌握 Android Studio 中 Gradle 的使用方法 [转http://blog.csdn.net/feelang/article/details/41783317]的更多相关文章

  1. 快速掌握 Android Studio 中 Gradle 的使用方法

    快速掌握 Android Studio 中 Gradle 的使用方法 Gradle是可以用于Android开发的新一代的 Build System, 也是 Android Studio默认的build ...

  2. 虚拟机中的CentOS7如何上网?---https://blog.csdn.net/nothing2017/article/details/61420767

    虚拟机中的CentOS7如何上网?https://blog.csdn.net/nothing2017/article/details/61420767

  3. R语言中的正则表达式(转载:http://blog.csdn.net/duqi_yc/article/details/9817243)

    转载:http://blog.csdn.net/duqi_yc/article/details/9817243 目录 Table of Contents 1 正则表达式简介 2 字符数统计和字符翻译 ...

  4. Android 设计模式之观察者模式(转载自:“http://blog.csdn.net/fangchongbory/article/details/7774044”)

    /* * 观察者模式 *      定义对象间的一种一个(Subject)对多(Observer)的依赖关系,当一个对象的状态发送改变时,所以依赖于它的 * 对象都得到通知并被自动更新 * * 当然, ...

  5. C++ 中宏的使用 --来自:http://blog.csdn.net/hgl868/article/details/7058906

    宏在代码中的使用实例: g_RunLog2("Middleware client for Linux, build:%s %s", __DATE__, __TIME__); 下面详 ...

  6. Python 去除列表中重复的元素(转载http://blog.csdn.net/zhengnz/article/details/6265282)

    比较容易记忆的是用内置的set l1 = ['b','c','d','b','c','a','a']l2 = list(set(l1))print l2   还有一种据说速度更快的,没测试过两者的速度 ...

  7. Android Studio 中 Gradle 依赖的统一管理(rootProjectt)

    最近遇到Android Studio 中 Gradle 依赖的统一管理的不懂得地方,看大神的也没看懂,百度了一下,使用起来还挺方便 下面是链接,在这里我就不详细说明了, http://www.jian ...

  8. android studio 更新 Gradle错误解决方法(Gradle sync failed)

    android studio 更新 Gradle错误解决方法   Android Studio每次更新版本都会更新Gradle这个插件,但由于长城的问题每次更新都是失败,又是停止在Refreshing ...

  9. android gradle,groovy--https://blog.csdn.net/hebbely/article/details/79074460

    android grale,groovyhttps://blog.csdn.net/hebbely/article/details/79074460 Gradle编译时报错:gradle:peer n ...

随机推荐

  1. Sqli-labs less 32

    Less-32 利用上述的原理,我们可以进行尝试payload为: http://127.0.0.1/sqli-labs/Less-32/?id=-1%df%27union%20select%201, ...

  2. 条件随机场CRF简介

    http://blog.csdn.net/xmdxcsj/article/details/48790317 Crf模型 1.   定义 一阶(只考虑y前面的一个)线性条件随机场: 相比于最大熵模型的输 ...

  3. main函数和启动例程

    为什么汇编程序的入口是_start,而C程序的入口是main函数呢?本节就来解释这个问题.在讲例 18.1 “最简单的汇编程序”时,我们的汇编和链接步骤是: $ as hello.s -o hello ...

  4. EditText 属性

    android:layout_gravity="center_vertical" 设置控件显示的位置:默认top,这里居中显示,还有bottom android:hint=&quo ...

  5. TCP套接字编程

    一.套接字(socket)函数 图1给出了在一个TCP客户与服务器通信的流程.服务器首先启动,稍后某个客户启动,它试图连接到服务器.假设客户给服务器发送一个请求,服务器处理该请求,并且给客户发回一个相 ...

  6. Codeforces Round #336 (Div. 2) D. Zuma 区间dp

    D. Zuma   Genos recently installed the game Zuma on his phone. In Zuma there exists a line of n gems ...

  7. Android 注入详解

    Android下的注入的效果是类似于Windows下的dll注入,关于Windows下面的注入可以参考这篇文章Windows注入术.而Android一般处理器是arm架构,内核是基于linux,因此进 ...

  8. linq lambda 分组后排序

    1.lamdba分组排序foodBusinessDistrict.                        GroupBy(x => new                        ...

  9. lintcode:买卖股票的最佳时机 III

    买卖股票的最佳时机 III 假设你有一个数组,它的第i个元素是一支给定的股票在第i天的价格.设计一个算法来找到最大的利润.你最多可以完成两笔交易. 样例 给出一个样例数组 [4,4,6,1,1,4,2 ...

  10. 负载均衡之Haproxy配置详解(及httpd配置)

    下图描述了使用keepalived+Haproxy主从配置来达到能够针对前段流量进行负载均衡到多台后端web1.web2.web3.img1.img2.但是由于haproxy会存在单点故障问题,因此使 ...