转载

快速了解AndroidStudio的Gradle

前言在阅读本文章之前,期望你已经了解了这些内容:

  • gradle是什么,它有哪些基本特性

  • gradle task的基本概念和写法

本人使用的环境:LUbuntu 14.04,AndroidStudio 1.3.2,其自带Gradle 2.4

Gradle Scripts

使用AndroidStudio新建一个Android项目,一直默认直到创建完成,然后点开AndroidStudio左边的Project面板,可以看到如下工程组织:

快速了解AndroidStudio的Gradle

先简单粗暴的来看看这些文件是什么鬼。

  • build.gradle (Project: MyApplication)这是Android项目根目录下的build.gradle,此文件名是一个约定名字,gradle将依赖它来构建项目。一个项目可以包括多个工程,gradle可以构建多个工程,每个工程子目录都可以有build.gradle文件,如同make构建工具与Makefile文件的关系。我们做的大部分工作,也就是编写和组织build.gradle文件。

  • build.gradle (Module: app)这是Android项目根目录/app/build.gradle,app是一个gradle工程,这里的build.gradle文件就是用来描述如何构建app工程,gradle可以支持构建多个工程,并设置工程之间的依赖关系。

  • gradle-wrapper.properties

    Gradle Wrapper 是Android对gradle的使用进行一些必要的封装而成的脚本——gradlew(位于项目根目录下,用于命令行使用,在集成环境中非常有用),它会自动检测当前项目指定的gradle版本是否存在,如果不存在则自己下载(保存在~/.gradle/wrapper/)。所以每一个Android项目下都有自己的gradle软件包,官方建议把这些包也提交进源码管理系统中,这样编译此项目的系统(如持续集成服务器)不需要事先(手动)安装gradle。 gradle-wrapper.properties里的配置影响Gradle Wrapper的运作,其中distributionUrl属性指定从哪里下载gradle,当然,如果我们不想让它自己下载,可以用distributionPath指定手工下载的本地的gradle包。(进阶:具它wrapper相关的设置参见: Wrapper API )

    另外,Android默认创建了一个叫wrapper的gralde task,通过使用这个task,就可以在工程的build.gradle里面访问和修改wrapper属性。

  • proguard-rules.proproguard是一个用来混淆java代码的开源项目,Android项目把它集成了进来,先不管。

  • gradle.properties因为gradle是java程序,它将在JVM环境中运行,此文件用来指定gradle如何运行(或叫构建环境),包括:

    1. 开启gradle的daemon并行构建模式,设置JVM内存参数,加速构建。

    2. 可以自定义属性(key和value),这些属性可以传递给gradle的java程序,也可以被build.grade访问。

gradle提供了多种方法为构建环境添加属性:

  1. 命令行执行gradle带/-D参数,/-D参数也会传递给java(这里指运行gradle的java程序)

  2. 写在gradle.properties文件里面,而且每个子工程目录下都可以有自己的gradle.properties文件

  3. 写在 GRADLE_USER_HOME 环境变量所指目录下的gradle.properties中。

  4. 写在以 ORG_GRADLE_PROJECT_ 开头的环境变量里。

    以上方式可以同时使用,gradle按以上列出的顺序(优先级从低到高)进行分析,若属性有冲突,保留优先级高的配置。

    1. 设置代理。

      现在此文件默认什么都没配置,先不管。

  • settings.gradle

    这个文件也是gradle约定命名的,默认只有一行代码 include ':app' ,表示当前项目只有一个模块(我们习惯叫工程,gradle习惯叫模块),app是目录名,同时也作为工程名。当有多个工程的时候,可以在此添加。

  • local.properties默认内容是Android SDK和NDK的配置路径,这是我之前在AndroidStudio配置过的,此文件不需要我们修改,在IDE的设置会自动覆盖此文件的设置,此文件不应该commit到源码管理系统中,因为它是个人环境的配置。

好,下面我们具体来看build.gradle文件。

根目录的build.gradle

// Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript {  repositories {   jcenter()  }  dependencies {   classpath 'com.android.tools.build:gradle:1.3.0'   // NOTE: Do not place your application dependencies here; they belong   // in the individual module build.gradle files  } } allprojects {  repositories {   jcenter()  } }  

这是一个最顶层的gradle工程。gradle工程在gradle系统中用一个 project对象 )表示,它有如下一些元素:

allprojects { }

artifacts { }

buildscript { }

configurations { }

dependencies { }

repositories { }

sourceSets { }

subprojects { }

publishing { }

下面我们只对相关的进行探索。

Gradle Plugins

Gradle内核集成了很多插件(比如编译java代码的插件),使用插件,我们只需要做很少的工作就可以完成常规的构建任务。以.jar文件打包成的插件叫二进制插件,在使用这种插件之前,得把它添加到当前构建脚本的classpath中。

buildscript

buildscript是gradle工程中定义的一个方法,可以传入一个语句块(有人叫闭包),这个语句块返回一个ScriptHandler对象。查看 ScriptHandler对象的API 得知,ScriptHandler包含两个方法:repositories和dependencies,调用dependencies设置构建时依赖什么东西,调用repositories设置这些依赖来自哪里的仓库。现在明白了,上面的代码其实就是为Android的gradle插件指定位置和版本。

allprojects

这也是gradle的特性,gradle支持在根build.gradle里使用allprojects,事先对整个构建可能包含的所有工程进行统一的配置,上面的代码就是给所有工程都配置了 jcenter仓库 ,这样工程所依赖的第三方库在构建过程中都会被自动下载。如果多个工程(子工程)有相同的行为或属性要配置,使用这个是很方便的。

app工程下的build.gradle

apply plugin: 'com.android.application' android {  compileSdkVersion 21  buildToolsVersion "22.0.1"  defaultConfig {   applicationId "example.jk.myapplication"   minSdkVersion 19   targetSdkVersion 21   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' }  

apply plugin

apply plugin: 'com.android.application' 应用Android的gradle插件到当前构建脚本,此插件其实继承自gradle的application插件,使用application插件,可以通过添加task来运行或把Java项目构建为基于命令行的程序。

Android gradle插件具有application插件的功能,同时会应用java插件和distribution插件,后两个插件用来自动化编译和发布java程序的。

android

这个Android gradle插件提供的元素,用于配置android相关的构建选项,包括:

  • compileSdkVersion 指定构建时使用的Android SDK版本

  • buildToolsVersion 指定构建工具的版本,构建工具可以使用Android SDK Manager来安装,可以安装多个版本,如图:

    快速了解AndroidStudio的Gradle

官方建议这里指定的构建工具的版本最好大于等于目标SDK版本(targetSdkVersion)。

defaultConfig元素里的配置对应AndroidManifest.xml文件,优先级比AndroidManifest.xml文件里的配置高。gradle支持对一个项目构建多种版本,比如试用版 、商业版,每个版本可以有自己的defaultConfig。

buildTypes元素默认定义了debug和release两种构建,debug构建出来的APK将包含调试符号,并且以debug key进行签名,而release类型的默认是没有签名的。minifyEnabled为true表示启用自动清除无用代码,用于软件包瘦身。proguardFiles指定了代码混淆使用的相关文件。

工程依赖

dependencies {     compile fileTree(dir: 'libs', include: ['*.jar'])     compile 'com.android.support:appcompat-v7:22.2.0' }

这里的dependencies是gradle工程定义的元素,指定此工程依赖什么。compile这个方法指定要添加什么来编译主程序,这些东西将最终被打包进APK中。

fileTree(dir: 'libs', include: ['*.jar']) 将返回一个文件树对象,这些文件位于app/libs目录,并以.jar结尾。

整句代码的意思就是把当前工程目录的libs目录下所有jar文件加入编译时classpath中,并打包进APK。这是本地二进制库依赖的写法。

compile 'com.android.support:appcompat-v7:22.2.0' 表示依赖位于仓库中的appcompat库及其版本,位于Android Support Library中,如果本地没有安装Android Support Library,使用Android SDK Manager进行下载。(进阶:当然,还可以指定依赖其它工程,以及除compile外的其它依赖类型,具体见 《依赖管理介绍》 )

至此,我们已经大概了解了AndroidStudio默认工程有关gradle的脚本。其实AndroidStudio IDE提供了很多设置,这些设置修改后,AndroidStudio会自动更新相关的build.gradle和*.properties文件。如果我们手工编辑build.gradle文件,AndroidStudio将提示我们进行sync(同步)操作,以便这些配置反映到IDE界面上。

参考链接:

  • 《Gradle Plugin User Guide》 http://tools.android.com/tech-docs/new-build-system/user-guide

  • 《Gradle User Guide》 https://docs.gradle.org/current/userguide/userguide_single.html

  • 《Build configuration Basics》 https://developer.android.com/tools/building/configuring-gradle.html

  • 《project对象》 https://docs.gradle.org/current/dsl/org.gradle.api.Project.html#org.gradle.api.Project:dependencies(groovy.lang.Closure) )

正文到此结束
Loading...