关于gradle

什么是gradle

如果从eclipse转到android studio上开发android,首先遇到的一个问题是是gradle,发现和一切和eclipse都不一样了,没错,因为android studio是基于gradle来构建项目的。
Gradle和C语言的make,以及eclipse使用的ant一样,是一种项目自动化构建工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,但是要比ANT使用XML构建配置要灵活的多。在编写配置时,你可以像编程一样灵活(比如加入各种条件判断),Gradle是基于Groovy的DSL语言。

什么是Groovy

Groovy是Java平台上设计的面向对象编程语言。这门动态语言拥有类似Python、Ruby和Smalltalk中的一些特性,可以作为Java平台的脚本语言使用(也运行于Java虚拟机中)。
Groovy的语法与Java非常相似,以至于多数的Java代码也是正确的Groovy代码。Groovy代码动态的被编译器转换成Java字节码。由于其运行在JVM上的特性,Groovy可以使用其他Java语言编写的库。
可以理解为Groovy是基于java平台的脚本语言,但它有自己定义的一套语法,很多时候也兼容java语法,如调用一个方法:
println("hello")
也可以写成
 println "hello"
等等,grade里很多都使用这种形式来调用方法,方法的定义和调用像ruby语言。

android studio的gradle

Android Studio的工程目录结构通常是这样的:
├── app #Android App目录
│   ├── app.iml
│   ├── build #构建输出目录
│   ├── build.gradle #构建脚本
│   ├── libs #so相关库
│   ├── proguard-rules.pro #proguard混淆配置
│   └── src #源代码,资源等
├── build
│   └── intermediates
├── build.gradle #工程构建文件
├── gradle
│   └── wrapper
│         └── gradle-wrapper.properties
├── gradle.properties #gradle的配置
├── gradlew #gradle wrapper linux shell脚本
├── gradlew.bat
├── LibSqlite.iml
├── local.properties #配置Androod SDK位置文件
└── settings.gradle #工程配置
首先是settings.gradle,用于配置project,通常一个project有一个或者多个module(在eclipse下称为project),在这个文件下,把所有要加入构建的module都在这个文件里加入进来,,比如这里包含一个:app module
include ':app'
和settings.gradle在同一目录下的build.gradle是一个顶级的build配置文件,在这里可以为所有project以及module配置一些常用的配置。
buildscript {
    repositories {
        jcenter()//使用jcenter库
    }
    dependencies {
        // 依赖android提供的2.1.0的gradle build插件来编译android
        classpath ‘com.android.tools.build:gradle:2.1.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}
//为所有的工程的repositories配置为jcenters
allprojects {
    repositories {
        jcenter()
    }
}
在这个文件中的配置,整个项目的module都起作用。
grade也称为一个编程框架,是基于插件的编译的,也就是说当你编译java项目时,用java插件,编译android项目时,自然也用android的插件,这里的
classpath ‘com.android.tools.build:gradle:2.1.0'
就是配置gradle编译项目时用android的gradle插件,注意这里是插件的版本,并非gradle的版本,这个版本通常是和android studio的版本相同(但也并非总是相同)。

各module下的build.gradle

除了一个顶级的的build.gradle文件之外,所有的module(如app)下也都会有一个build.gradle文件。
在这个文件中的配置,只对所在的module起作用,对其它的module不起作用。
apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion “23.0.3"

    defaultConfig {
        applicationId “com.xxxx.demo"
        minSdkVersion 15
        targetSdkVersion 23

        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:23.3.0'
}

 

开头第一行
apply plugin: ‘com.android.application’
这表示该module是一个app module,应用了com.android.application插件,如果是一个android library,那么这里应该
apply plugin: ‘com.android.library’
其次是基于哪个SDK编译,这里是API LEVEL,是21,buildToolsVersion是基于哪个构建工具版本进行构建的。defaultConfig是默认配置,如果没有其他的配置覆盖,就会使用这里的。看其属性的名字就可以知道其作用,比如applicationId是配置包名的,versionCode是版本号,versionName是版本名称等。
buildTypes是构建类型,常用的有release和debug两种,可以在这里面启用混淆,启用zipAlign以及配置签名信息等。
dependencies就不属于Android专有的配置了,它定义了该module需要依赖的jar,aar,jcenter库信息。

 gradle-wrapper.properties文件

这个文件是配置gradle的版本以及存放位置,通常会存放在系统用户目录下的.gradle/wrapper/dists文件夹下对应的版本号目录里,android studio会先去检查这个目录下有没有文件中配置的版本,如果找不到匹配的版本,就会自己去下载gradle,这也是android studio有时候很慢的原因,因为它在下载gradle,如果本地有gradle的版本,可以在这里手动配置上,从而可以关掉android studio的自动下载(offline模式),提高速度。
#Wed Apr 10 15:27:10 PDT 2013
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.2-all.zip

 

发表评论