gradle入門

隨着Android Studio愈來愈完善,更多的開發者捨棄掉Eclipse。可是新的IDE與以往的Eclipse有很大區別,這致使部分開發者望而卻步,其中一個你們以爲比較麻煩的是Android Studio採用的新的構建系統,gradle。那麼這篇文章我將對gradle進行一個簡單介紹(主要講gradle配合Android Studio的使用),但願幫助你們熟悉gradle。java

一. gradle是什麼?

gradle跟ant/maven同樣,是一種依賴管理/自動化構建工具。可是跟ant/maven不同,它並無使用xml語言,而是採用了Groovy語言,這使得它更加簡潔、靈活,更增強大的是,gradle徹底兼容maven和ivy。更多詳細介紹能夠看它的官網:http://www.gradle.org/linux

二.爲何使用gradle?

更容易重用資源和代碼;
能夠更容易建立不一樣的版本的程序,多個類型的apk包;
更容易配置,擴展;
更好的IDE集成;android

三.gradle入門需知

1.基本配置:shell

首先明確gradle跟maven同樣,也有一個配置文件,maven裏面是叫pom.xml,而在gradle中是叫build.gradle。Android Studio中的android項目一般至少包含兩個build.gradle文件,一個是project範圍的,另外一個是module範圍的,因爲一個project能夠有多個module,因此每一個module下都會對應一個build.gradle。這麼說有點抽象,看下面這個圖:windows

這是一個android工程的project視圖,上面那個是module下的build.gradle文件。下面那個是project下的build.gradle文件。這兩個文件是有區別的,project下的build.gradle是基於整個project的配置,而module下的build.gradle是每一個模塊本身的配置。下面看下這兩個build.gradle裏面的內容:app

project#build.gradle:eclipse

1maven

2ide

3工具

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

// Top-level build file where you can add configuration options common to all sub-projects/modules.

 

buildscript {

    //構建過程依賴的倉庫

    repositories {

    jcenter()

}

//構建過程須要依賴的庫

dependencies {

     //下面聲明的是gradle插件的版本

     classpath 'com.android.tools.build:gradle:1.1.0'

     // NOTE: Do not place your application dependencies here; they belong

     // in the individual module build.gradle files

}

}

//這裏面配置整個項目依賴的倉庫,這樣每一個module就不用配置倉庫了

allprojects {

     repositories {

          jcenter()

     }

}

注:你們可能很奇怪,爲何倉庫repositories須要聲明兩次,這實際上是因爲它們做用不一樣,buildscript中的倉庫是gradle腳本自身須要的資源,而allprojects下的倉庫是項目全部模塊須要的資源。因此你們千萬不要配錯了。

module#build.gradle:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

//聲明插件,這是一個android程序,若是是android庫,應該是com.android.library

apply plugin: 'com.android.application'

android {

     //安卓構建過程須要配置的參數

     compileSdkVersion 21//編譯版本

     buildToolsVersion "21.1.2"//buildtool版本

     defaultConfig {//默認配置,會同時應用到debug和release版本上

     applicationId "com.taobao.startupanim"//包名

     minSdkVersion 15

     targetSdkVersion 21

     versionCode 1

     versionName "1.0"

}

 buildTypes {

     //這裏面能夠配置debug和release版本的一些參數,好比混淆、簽名配置等

     release {

         //release版本

         minifyEnabled false//是否開啓混淆

         proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//混淆文件位置

     }

}

}

dependencies {

     //模塊依賴

     compile fileTree(dir: 'libs', include: ['*.jar'])//依賴libs目錄下全部jar包

     compile 'com.android.support:appcompat-v7:21.0.3'//依賴appcompat庫

}

defaultConfig中是一些基本配置,它會同時應用到debug/release版本上,下面列舉了全部可配項及對應的值:

buildTypes結點很重要,這裏能夠配置構建的版本的一些參數,默認有兩個構建版本release/debug,固然你能夠自定義一個構建版本,好比叫foo,而後經過gradlew assembleFoo就能夠生成對應的apk了。

buildTypes裏還有不少可配置項,下面列舉了全部可配項以及debug/release版本的默認值:

如今你們對build.gradle已經初步瞭解了,咱們再看下其餘一些與gradle相關的文件:

 

1.gradle.properties:

 

從名字上就知道它是一個配置文件,沒錯,這裏面能夠定義一些常量供build.gradle使用,好比能夠配置簽名相關信息如keystore位置,密碼,keyalias等。

 

2.settings.gradle:

 

這個文件是用來配置多模塊的,好比你的項目有兩個模塊module-a,module-b,那麼你就須要在這個文件中進行配置,格式以下:

1

include ':module-a',':module-b'

3.gradle文件夾:

 

這裏面有兩個文件,gradle-wrapper.jar和gradle-wrapper.properties,它們就是gradle wrapper。gradle項目都會有,你能夠經過命令gradle init來建立它們(前提是本地安裝了gradle而且配置到了環境變量中)。

 

4.gradlew和gradlew.bat:

 

這分別是linux下的shell腳本和windows下的批處理文件,它們的做用是根據gradle-wrapper.properties文件中的distributionUrl下載對應的gradle版本。這樣就能夠保證在不一樣的環境下構建時都是使用的統一版本的gradle,即便該環境沒有安裝gradle也能夠,由於gradle wrapper會自動下載對應的gradle版本。

 

gradlew的用法跟gradle如出一轍,好比執行構建gradle build命令,你能夠用gradlew build。gradlew即gradle wrapper的縮寫。

 

2.gradle倉庫:

 

gradle有三種倉庫,maven倉庫,ivy倉庫以及flat本地倉庫。聲明方式以下:

1

2

3

4

5

6

7

8

9

maven{

      url "..."

}

ivy{

      url "..."

}

flatDir{

      dirs 'xxx'

}

有一些倉庫提供了別名,可直接使用:

1

2

3

4

5

repositories{

     mavenCentral()

     jcenter()

     mavenLocal()

}

3.gradle任務:

 

gradle中有一個核心概念叫任務,跟maven中的插件目標相似。

gradle的android插件提供了四個頂級任務

1

2

3

4

assemble 構建項目輸出

check 運行檢測和測試任務

build 運行assemble和check

clean 清理輸出任務

執行任務能夠經過gradle/gradlew+任務名稱的方式執,執行一個頂級任務會同時執行與其依賴的任務,好比你執行

1

gradlew assemble

它一般會執行:

1

2

gradlew assembleDebug

gradlew assembleRelease

這時會在你項目的build/outputs/apk或者build/outputs/aar目錄生成輸出文件

 

注:linux下執行構建任務須要首先更改gradlew腳本的權限,而後才能執行該腳本:

1

2

chmod +x gradlew

./gradlew assemble

能夠經過:

1

gradlew tasks

列出全部可用的任務。在Android Studio中能夠打開右側gradle視圖查看全部任務。

四.常見問題

1.導入本地jar包:

 

跟eclipse不太同樣,android studio導入本地jar除了將jar包放到模塊的libs目錄中之外,還得在該模塊的build.gradle中進行配置,配置方式是在dependencies結點下進行以下聲明:

1

compile files('libs/xxx.jar')

若是libs下有多個jar文件,能夠這樣聲明:

1

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

2.導入maven庫:

1

compile 'com.android.support:appcompat-v7:21.0.3'

可見,格式爲

1

compile 'groupId:artifactId:version'

3.導入某個project:

你的app是多模塊的,假設有兩個模塊app和module-A,而且app模塊是依賴module-A的,這時候咱們就須要在app模塊的build.gradle中的dependencies結點下配置依賴:

1

compile project(':module-A')

而且你須要在settings.gradle中把module-A模塊包含進來:

1

include ':module-A',':app'

此外,這種狀況下module-A模塊是做爲庫存在的,於是它的build.gradle中的插件聲明一般應該是這樣的:

1

apply plugin: 'com.android.library'

並且,做爲library的模塊module-A的build.gradle文件的defaultConfig中是不容許聲明applicationId的,這點須要注意。

4.聲明三方maven倉庫:

可能你項目須要的一些庫文件是在大家公司的私服上,這時候repositories中僅有jcenter就不行了,你還須要把私服地址配到裏面來,注意,應該配到project的build.gradle中的allprojects結點下或者直接配到某個模塊中若是僅有這個模塊用到。

配置方式:

1

2

3

4

5

repositories{

     maven{

          url="http://mvnrepo.xxx.com"

     }

}

5.依賴三方aar文件:

1

compile 'com.aaa.xxx:core:1.0.1@aar'

6.將庫項目導出爲aar:
首先你的項目必須是一個庫項目,build.gradle中進行配置:

1

apply plugin : 'com.android.library'

而後你能夠在命令行中進到項目目錄,執行以下gradle任務:

1

gradlew assembleRelease//確保該目錄下有gradlew文件

生成的aar在/build/output/aar文件夾中
7.引用本地aar:
首先將aar文件放到模塊的libs目錄下,而後在該模塊的build.gradle中聲明flat倉庫:

1

2

3

4

5

repositories{

    flatDir{

          dirs 'libs'

    }

}

最後在dependencies結點下依賴該aar模塊:

1

2

3

dependencies{

      compile (name:'xxx',ext:'aar')

}

8.排除依賴:

當出現依賴衝突的時候能夠經過排除依賴解決,具體方式以下:

1

2

3

compile (group:'xxx',name:'xxx',version:'xxx'){

      exclude group:'xxx',module:'xxx'//module對應的就是artifactId

}

9.多dex支持(打包65k方法數限制)

 首先在build.gradle的buildConfig中增長以下配置:

1

multiDexEnabled true

接着,在dependencies結點下增長以下依賴:

1

2

3

dependencies{

compile 'com.android.support:multidex:1.0.0'

}

最後,讓你的Application繼承MultiDexApplication,若是你的應用沒有聲明Application,能夠在manifest文件的application結點下增長name屬性,值爲android.support.multidex.MultiDexApplication。

詳細內容參見官方文檔。

10.自動移除不用資源

能夠在buildTypes結點中增長以下配置:

1

2

3

4

5

6

buildTypes{

     release{

           minifyEnabled true

           shrinkResources true

     }

}

11.忽略lint錯誤:

能夠在build.gradle文件中的android結點下增長以下配置:

1

2

3

4

5

android{

     lintOptions{

           abortOnError false

     }

}

12.聲明編譯的java版本

能夠在build.gradle文件中的android結點下增長以下配置:

1

2

3

4

compileOptions {

     sourceCompatibility JavaVersion.VERSION_1_7

     targetCompatibility JavaVersion.VERSION_1_7

}

13.應用簽名配置

首先在module的build.gradle中增長這些字段:

1

2

3

4

storeFiles:keystore文件存儲位置,一般是.jks文件

storePassword 密碼

keyAlias keystore別名

keyPassword 密碼

具體配置方式爲:

首先在build.gradle的android結點下增長以下配置:

1

2

3

4

5

6

7

8

9

10

11

signingConfigs {

     //debug版本的簽名配置,一般不用配,由於有默認的debug簽名

     debug {

     }

     release {

          storeFile file("key.jks")

          storePassword "123456"

          keyAlias "mykey"

          keyPassword "123456"

     }

}

注:debug的默認簽名爲:

1

signingConfig android.signingCongfigs.debug

位置爲

1

${home}\.android\debug.keystore

而後在buildTypes結點下的對應版本中添加上面的配置:

1

2

3

4

5

buildTypes{

     release{

          signingConfig signingConfigs.release

     }

}

固然,release不是固定的名稱,你能夠隨便取,好比這樣:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

android {

     signingConfigs {

          debug {

                storeFile file("debug.keystore")

          }

          myConfig {

                storeFile file("other.keystore")

                storePassword "android"

                keyAlias "androiddebugkey"

                keyPassword "android"

          }

     }

     buildTypes {

          foo {

               debuggable true

               jniDebuggable true

               signingConfig signingConfigs.myConfig

         }

    }

}

真實開發中,把密碼配置到build.gradle中不是很好的作法,最好的作法是放在gradle.properties中:

1

2

3

4

RELEASE_STOREFILE=xxx.jks

RELEASE_STORE_PASSWORD=123456

RELEASE_KEY_ALIAS=mykey

RELEASE_KEY_PASSWORD=123456

而後直接引用便可:

1

2

3

4

storeFile file(RELEASE_STOREFILE)

storePassword RELEASE_STORE_PASSWORD

keyAlias RELEASE_KEY_ALIAS

keyPassword RELEASE_KEY_PASSWORD

14.定製buildConfig:

在build.gradle中配置:

1

2

3

4

5

6

7

8

buildTypes{

      release{

            buildConfigField "string","type","\"release\""

      }

      debug{

            buildConfigField "string","type","\"debug\""

      }

}

這樣就會在BuildConfig類中生成type字段:

1

2

3

4

//build/generate/source/buildConfig/release/包名/   路徑下的BuildConfig.java

public static final String type = "release"

//build/generate/source/buildConfig/debug/包名/    路徑下的BuildConfig.java

public static final String type = "debug"

相關文章
相關標籤/搜索