AndroidStudio目前已經成爲Android開發人員的主流工具,而Gradle的原理,配置,使用仍然是不少android開發人員感到困惑的地方。網上雖然有不少相關文檔,可是要麼是隻會用可是不知道gradle的原理,要麼就是過於深究Gradle和Groovy,沒能和具體的android使用場景結合,致使不少人看完雲裏霧裏。本文只針對android開發人員,結合具體使用,捎帶介紹一下Gradle和Groovy的本質,但願可讓更多的android開發人員不只能知其然,更能知其因此然。html
參考書籍:linux
實戰Gradleandroid
Android Gradle 權威指南git
巧用Gradle構建Android應用windows
2013 年,Google 發佈了全新的 Android 開發 IDE————Android Studio,核心是 Google 新推出的 Gradle 編譯環境。首先,咱們要明白,Android Studio 使用 Gradle 構建工具,Eclipse 的 ADT 插件使用的是 Ant 構建工具。其次,要搞明白Android Studio 爲何使用 Gradle 構建工具。Gradle有什麼特色呢?app
由此可知,Gradle 之因此強大是由於繼承了強大、靈活的 Ant 和 Maven 豐富的依賴管理,配置管理簡單,腳本編寫方便靈活,插件模塊化。jvm
Gradle的優越性讓它在不少地方都有應用,本文從Android的角度來分析和使用。ide
Android中的一個項目結構一般以下:模塊化
相關文件信息以下:函數
目錄文件 | 定義 |
---|---|
.gradle | gradle項目產生文件(自動編譯工具產生的文件) |
.idea | IDEA項目文件(開發工具產生的文件) |
app | 其中一個 module,複用父項目的設置,可與父項目擁有相同的配置文件 |
build | 自動構建時生成文件的地方 |
gradle | 自動完成 gradle 環境支持文件夾 |
.gitignore | git源碼管理文件 |
build.gradle | gradle 項目自動編譯的配置文件 |
gradle.properties | gradle 運行環境配置文件 |
gradlew | 自動完成 gradle 環境的 linux mac 腳本,配合 gradle 文件夾使用 |
gradlew.bat | 自動完成 gradle 環境的 windows 腳本,配合 gradle 文件夾使用 |
local.properties | Android SDK NDK 環境路徑配置 |
*.iml | IDEA 項目文件 |
setting.gradle | gradle 項目的子項目包含文件 |
爲何我沒有從build.gradle開始介紹,而是從settings.gradle這個文件開始呢?是由於這個問價是Gradle的設置文件,用於初始化以及工程樹的配置,位置放在根工程目錄下。設置文件大多數的做用是爲了配置子工程。在Gradle中多工程是經過工程樹表示的,就至關於As中看到的Project和Moudle的概念同樣。根工程至關於AS中的Project,一個根工程能夠有不少子工程,也就是不少Moudle。
一個子工程只有在settings文件裏配置了Gradle纔會識別,纔會在構建的時候被包含進去。具體使用以下:
//定義一個名爲initMinshengGradleEnvironment的函數。該函數內部完成一些初始化操做 //好比建立特定的目錄,設置特定的參數等 def initTKGradleEnvironment(){ println"initialize TK Gradle Environment ....." ......//幹一些special的私活.... println"initialize TK Gradle Environment completes..." } //settings.gradle加載的時候,會執行initTKGradleEnvironment
initTKGradleEnvironment()
include ':voice'
include ':imagepicker' project(':imagepicker').projectDir = new File(rootDir, 'tk/imagepicker')
首先,這個文件中能夠本身設置一些函數,如initTKGradleEnvironment(),這些函數會在gradle構建整個工程任務的時候執行,因此,能夠在settings作一些初始化的工做。
其次,能夠經過include函數,將子Project的名字(其文件夾名)包含進來 。這裏要注意的是,若是像imagepicker'子工程指定了文件夾的目錄,它的工程目錄就是rootDir/tk/imagepicker;而像voice子工程這樣沒有指定相應的文件夾目錄,默認目錄會是其同級的目錄,即Gradle會把當前與settings.gradle文件同級的voice目錄做爲voice子工程的工程目錄。若是沒有的話,會報錯。
每一個project都會有build文件,該文件是該project構建的入口,能夠在這裏針對該project進行設置,好比配置版本,須要哪些插件,依賴哪些庫等。AS項目結構中有兩個build文件。咱們分別對其進行介紹。
Android Studio 自動建立的 module 默認生成的 build.gradle 文件,這個文件是開發中打交道最多的一個文件。
這個文件中包括apply plugin,android,greendao,repositories,dependencies等多個代碼塊。
android { compileSdkVersion project.ANDROID_BUILD_SDK_VERSION as int buildToolsVersion project.ANDROID_BUILD_TOOLS_VERSION defaultConfig { applicationId project.APPLICATION_ID versionCode project.VERSION_CODE as int versionName project.VERSION_NAME minSdkVersion project.ANDROID_BUILD_MIN_SDK_VERSION as int targetSdkVersion project.ANDROID_BUILD_TARGET_SDK_VERSION as int } } dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') //這裏注意是雙引號 compile "com.android.support:appcompat-v7:${SUPPORT_LIBRARY}" compile "com.android.support:design:${SUPPORT_LIBRARY}" compile "com.android.support:recyclerview-v7:${SUPPORT_LIBRARY}" compile "com.android.support:support-annotations:${SUPPORT_LIBRARY}" compile "com.android.support:cardview-v7:${SUPPORT_LIBRARY}" compile "com.android.support:support-v4:${SUPPORT_LIBRARY}" }
配置全局的管理文件。用來配置 gradle 運行環境的文件,好比配置 gradle 運行模式,運行時 jvm 虛擬機的大小。
## Project-wide Gradle settings. # # For more details on how to configure your build environment visit # http://www.gradle.org/docs/current/userguide/build_environment.html # # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. # Default value: -Xmx1024m -XX:MaxPermSize=256m # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 # # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true #Wed Mar 21 09:55:30 CST 2018 org.gradle.jvmargs=-Xmx1536m -Xmx4048m
properties實際上是Java項目中的配置文件,不是Gradle首創的。又由於Gradle語法能夠和Java進行混合使用,因此在Java項目上面使用properties文件的方式,在Gradle上面也可使用。Gradle借用了這一點,因此內置了對gradle.properties的使用方式.
properties裏面的數據格式採用鍵值對的方式,大概有如下幾種寫法:
1. key=value
2. key:value
3. key :value
4. # 做爲註釋
在Android Studio 中最好使用第一種寫法,要不會有警告。
在實際開發中,通常大型的項目都是拆分進行模塊化開發的,每一個模塊在合併的時候容易有衝突(好比版本衝突),或者須要改版本的時候比較麻煩,須要一個一個地方去改,這時候配置全局的 gradle.properties 文件就頗有必要了。具體參考以下設置:
## Project-wide Gradle settings. # # For more details on how to configure your build environment visit # http://www.gradle.org/docs/current/userguide/build_environment.html # # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. # Default value: -Xmx1024m -XX:MaxPermSize=256m # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 # # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true #Wed Mar 21 09:55:30 CST 2018 org.gradle.jvmargs=-Xmx1536m -Xmx4048m #添加ndk支持(按需添加) android.useDeprecatedNdk=true # 應用版本名稱 VERSION_NAME=1.0.0 # 應用版本號 VERSION_CODE=100 # 支持庫版本 SUPPORT_LIBRARY=24.2.1 # MIN_SDK_VERSION ANDROID_BUILD_MIN_SDK_VERSION=14 # TARGET_SDK_VERSION ANDROID_BUILD_TARGET_SDK_VERSION=24 # BUILD_SDK_VERSION ANDROID_BUILD_SDK_VERSION=24 # BUILD_TOOLS_VERSION ANDROID_BUILD_TOOLS_VERSION=24.0.3
Android Studio 自動建立的工程中,IDE 自動配備了本地配置文件,而且設置了 sdk.dir 屬性。也就是配置了 Android_Home 環境變量,因此 IDE 可以自動生成這個配置文件。通常狀況都不用修改這個配置文件,除非你必定要從新制定一個 SDK 路徑。