標籤:val 結合 git android開發 方式 color ndk view 引號
AndroidStudio目前已經成為Android開發人員的主流工具,而Gradle的原理,配置,使用仍然是很多android開發人員感到困惑的地方。網上雖然有很多相關文檔,但是要麼是只會用但是不知道gradle的原理,要麼就是過於深究Gradle和Groovy,沒能和具體的android使用情境結合,導致很多人看完雲裡霧裡。本文只針對android開發人員,結合具體使用,捎帶介紹一下Gradle和Groovy的本質,希望可以讓更多的android開發人員不僅能知其然,更能知其所以然。
參考書籍:
實戰Gradle
Android Gradle 權威指南
巧用Gradle構建Android應用
1. Gradle簡介
2013 年,Google 發布了全新的 Android 開發 IDE————Android Studio,核心是 Google 新推出的 Gradle 編譯環境。首先,我們要明白,Android Studio 使用 Gradle 構建工具,Eclipse 的 ADT 外掛程式使用的是 Ant 構建工具。其次,要搞明白Android Studio 為什麼使用 Gradle 構建工具。Gradle有什麼特點呢?
- 採用了 Domain Specific Language(DSL 語言) 來描述和控制構建邏輯。
- 構建檔案基於 Groovy,並且允許通過混合聲明 DSL 元素和使用代碼來控制 DSL 元素以控制自訂的構建邏輯。
- 支援 Maven 或者 Ivy 的依賴管理。
- 非常靈活。允許使用最好的實現,但是不會強制實現的方式。
- 外掛程式可以提供自己的 DSL 和 API 以供構建檔案使用。
- 良好的 API 工具供 IDE 整合。
由此可知,Gradle 之所以強大是因為繼承了強大、靈活的 Ant 和 Maven 豐富的依賴管理,組態管理簡單,指令碼編寫方便靈活,外掛程式模組化。
2. AS中的Gradle檔案
Gradle的優越性讓它在很多地方都有應用,本文從Android的角度來分析和使用。
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 項目的子項目包含檔案 |
2.1 settings.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子工程的工程目錄。如果沒有的話,會報錯。
2.2 build.gradle
每個project都會有build檔案,該檔案是該project構建的入口,可以在這裡針對該project進行設定,比如配置版本,需要哪些外掛程式,依賴哪些庫等。AS項目結構中有兩個build檔案。我們分別對其進行介紹。
2.2.1 app Moudle的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}"}
2.2.2 root Project的build檔案2.3 gradle.properties
配置全域的管理檔案。用來配置 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 2018org.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 2018org.gradle.jvmargs=-Xmx1536m -Xmx4048m#添加ndk支援(按需添加)android.useDeprecatedNdk=true# 應用版本名稱VERSION_NAME=1.0.0# 應用版本號碼VERSION_CODE=100# 支援庫版本SUPPORT_LIBRARY=24.2.1# MIN_SDK_VERSIONANDROID_BUILD_MIN_SDK_VERSION=14# TARGET_SDK_VERSIONANDROID_BUILD_TARGET_SDK_VERSION=24# BUILD_SDK_VERSIONANDROID_BUILD_SDK_VERSION=24# BUILD_TOOLS_VERSIONANDROID_BUILD_TOOLS_VERSION=24.0.3
2.4 local.properties
Android Studio 自動建立的工程中,IDE 自動配備了本地設定檔,並且設定了 sdk.dir 屬性。也就是配置了 Android_Home 環境變數,所以 IDE 能夠自動產生這個設定檔。一般情況都不用修改這個設定檔,除非你一定要重新制定一個 SDK 路徑。
AndroidGradle最實用的指南