1. 程式人生 > >【Gradle 系列文章:你真的瞭解 Gradle 嗎】一:Gradle 入門

【Gradle 系列文章:你真的瞭解 Gradle 嗎】一:Gradle 入門

Gradle 是什麼?

2013 年,Google 釋出了全新的 Android 開發 IDE————Android Studio。然而, Android Studio 基於 IDEA,不管怎麼說,這都是一個高逼格的 IDE。但核心應該是 Google 新推出的 Gradle 編譯環境。

Gradle 用於替換 Eclipse 所使用的 ant 作為預設的 Android 編譯系統,相對於 ant 編譯工具,Gradle 吸納了 ant 靈活的指令碼特性、Maven 豐富的依賴管理策略和強大的外掛式環境。

正是由於 Gradle 的強大,導致上手難度比 ant 大,這也是許多從 Eclipse 環境切換到 Android Studio 環境的開發者覺得有困難的原因。然而 Gradle 的強大在於讓 Android 開發的依賴管理、庫管理、渠道管理等都變得更加方便;

Gradle 學習方式以及資料

首先,Gradle 本身是基於 Groovy 指令碼語言進行構建的,並通過 Domain Specific Language(DSL 語言)進行描述和控制構建邏輯。但是作為開發者,大可不必去深究 Groovy 指令碼語言,只要能看懂,懂配置使用就好了。

這裡推薦幾個比較官方的介紹文件:

醫生書中推薦的那個連結失效了,網上找到了這個,應該算不錯的。
- Gradle 使用者指南中文翻譯

在文末也附上幾個超連結,有興趣可以去戳戳。

一個 Android 專案中的檔案結構(AS 而非 Eclipse)

專案檔案目錄

再安利一個表格:

目錄檔案 定義
.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 專案的子專案包含檔案

常用的 gradle 檔案介紹

表格看起來很清晰,重點看加粗的幾個目錄檔案,下面再簡要說說常用的 gradle 的檔案:

module app 裡面的 build.gradle

Android Studio 自動建立的 module 預設生成的 build.gradle 檔案,這個檔案是開發中打交道最多的一個檔案。

如下:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    defaultConfig {
        applicationId "com.veyron.www.money"
        minSdkVersion 15
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:design:25.1.1'
    compile 'com.android.support:cardview-v7:25.1.1'
    compile 'com.android.support:appcompat-v7:25.1.1'
    compile 'com.github.d-max:spots-dialog:[email protected]'
    testCompile 'junit:junit:4.12'
}

Gradle 使用的是 DSL 語言,也有翻譯為領域特定語言。有的書籍建議理解的時候直接把 apply plugin、android、dependencies 看成一個個獨立的 “領域” 即可。但我認為把 apply plugin、android、dependencies 當成為程式碼塊(特定標籤)也未嘗不可。

apply plugin 程式碼塊

apply plugin: 'com.android.application'

apply plugin 描述 Gradle 所引入的外掛,這裡表示該 module 是一個 Android Application。外掛裡面包含了 Android 專案相關的所有工具。

android 程式碼塊

描述了該 Android module 構建過程中所用到的所有引數。預設情況下,IDE 會自動建立 compileSdkVersion、buildToolsVersion 兩個引數,分別對應編譯的 SDK 版本和 Android build tools 版本。而在 android 程式碼塊內,系統還預設建立了兩個程式碼塊———— defaultConfig 和 buildTypes,這兩個程式碼塊後面文章在具體解釋。

dependencies 程式碼塊

描述了該 Android module 構建過程中所依賴的所有庫,庫可以是以 jar 的形式進行依賴,或者是使用 Android 推薦的 aar 形式進行依賴。aar 相對於 jar 具有不可比擬的優勢,不僅配置依賴更簡單,而且可以將圖片的資原始檔放入 aar 中供主專案依賴,幾乎等於依賴了原始碼。Gradle 對於依賴關係的處理,就是向呼叫者遮蔽所有的依賴關係,主專案只需要依賴該 aar 庫專案,而不需要知道 aar 專案對於其他庫的依賴。

gradle 資料夾

定義:用於儲存 gradle 下載路徑的配置檔案位置,用於沒有gradle環境的環境初始化使用。

gradle 資料夾包括如下:

gradle-wrapper.propertes      //gradle-wrapper 配置檔案
gradle-wrapper.jar            //gradle-wrapper 核心 jar

關於這個資料夾的介紹網上並不多,查閱多篇文章後汲取到一些有價值的東西就是關於 gradle-wrapper.propertes 檔案中各個屬性的一個介紹。相信通過這些配置屬性的介紹,能夠對這個資料夾的作用有一個基本的認識。

首先,開啟該配置檔案,內容如下:

#Mon Dec 28 10:00:20 PST 2015
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip

下面一個個介紹

1.distributionUrl

2.另外四個屬性 (當然不瞭解也沒關係)

zipStoreBase 和 zipStorePath 組合在一起,是下載的 gradle-2.14.1-all.zip 所存放的位置。
zipStorePath 是 zipStoreBase 指定的目錄下的子目錄。

distributionBase 和 distributionPath 組合在一起,是解壓 gradle-2.14.1-all.zip 之後的檔案的存放位置。
distributionPath 是 distributionBase 指定的目錄下的子目錄。

下載位置可以和解壓位置不一樣。

zipStoreBase 和distributionBase 有兩種取值:GRADLE_USER_HOME 和 PROJECT。

其中,GRADLE_USER_HOME 表示使用者目錄。
在 windows 下是 %USERPROFILE%/.gradle,例如C:\Users\.gradle\。
在 Linux下是 $HOME/.gradle,例如~/.gradle。

PROJECT 表示工程的當前目錄,即 gradlew 所在的目錄。

3.各項屬性的整體含義:

(1) 去 services.gradle.org/distributions/gradle-2.14.1-all.zip 下載 gradle 的 2.14.1 版本,是完整版本。

(2) 下載的 gradle-2.14.1-all.zip 存放到 C:\Users\.gradle\wrapper\dists 目錄中。
(注:具體還有2級目錄,即全路徑為C:\Users\.gradle\wrapper\dists\gradle-2.14.1-all.zip\\,gradle-2.14.1-all.zip 目錄是根據下載的 gradle 的檔名來定的,目錄名是根據 distribution url 路徑字串計算 md5 值得來的,具體參考 PathAssembler.Java 中的 rootDirName() 和 getHash(),PathAssembler.java 的位置見本文最後的參考路徑)

(3) 解壓 gradle-2.14.1-all.zip,將解壓後的檔案存放到 C:\Users\.gradle\wrapper\dists中。(注:具體還有2級目錄,同上)

專案全域性的 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:2.2.3'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

buildscript 程式碼塊中,Gradle 指定了使用 jcenter 程式碼倉庫,同時宣告依賴的 Android Gradle 外掛的版本。
allprojects 程式碼塊中,開發者可以為專案整體配置一些屬性。

這裡補充一下,jcenter 是什麼呢?其實就是一個公共的中央倉庫,如 maven 中央倉庫,以供別人方便地整合使用。

如果有興趣讓別人使用你的原始碼的可以搜搜:使用 Gradle 釋出 Android 開源專案到 Jcenter.

gradle.priperties

Android Studio 預設生成的 gradle.priperties 如下:

# Project-wide Gradle settings.

# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.

# 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.
org.gradle.jvmargs=-Xmx1536m

# 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

上面的英文註釋比較多,那麼富有探究精神,有打破砂鍋問到底,或者有強迫症的同學就受不了了,一定得弄出個所以然來。

下面就用我蹩腳的英語翻譯下:

#專案範圍 Gradle 設定。
# IDE(例如Android Studio)使用者:
# Gradle 設定通過 IDE 配置 *將會覆蓋*
#任何設定在該檔案中指定。
#更多細節關於如何配置您的構建環境的訪問
# http://www.gradle.org/docs/current/userguide/build_environment.html
#指定 JVM 引數用於守護程序。
#這個 setting 尤其有用的調整記憶體的設定。

org.gradle.jvmargs = -Xmx1536m


#配置時,它將執行在孵化並行模式。
#這個選項應該只被用於分離的專案。更多細節,請訪問
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html秒:decoupled_projects
# org.gradle.parallel = true

簡而言之,就是一個配置全域性的管理檔案。
配置 gradle 執行環境的檔案,比如配置 gradle 執行模式,執行時 jvm 虛擬機器的大小。

舉個栗子:
一般大型的專案都是拆分進行模組化開發的,這時候每個模組在合併的時候容易有衝突(假如版本衝突),或者需要改版本的時候比較麻煩,需要一個一個地方去改,這時候配置全域性的 gradle.properties 檔案就顯得異常有幫助了。

在專案 gradle.properties 配置檔案修改栗子如下:

# Project-wide Gradle settings.
#新增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

這樣就為專案配置了全域性屬性,其他模組就可以任性的使用了,需要改動的時候只需要在這個全域性的配置檔案中一鍵修改即可,是不是很嗨森啊。

各個模組的 build.gradle 如下寫即可:

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}"
}

這裡可以看到有些屬性後面有 as int ,這是因為原本的配置應該都是預設是字串,然後用 as int 就可以輕鬆轉換成 int 型別了。

這個栗子也是網上找的,連結放在文末哈,這是對作者的一個基本的尊重。

local.properties

Android Studio 預設生成的 local.properties 如下:

## This file is automatically generated by Android Studio.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file should *NOT* be checked into Version Control Systems,
# as it contains information specific to your local configuration.
#
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
sdk.dir=D\:\\adt-bundle-windows-x64\\android-sdk-windows

上面的英文註釋已經很清楚了,這裡就不秀我的英語翻譯水平了。簡單轉述就是,Android Studio 自動建立的工程中,IDE 自動配備了本地配置檔案,並且設定了 sdk.dir 屬性。也就是配置了 Android_Home 環境變數,所以 IDE 能夠自動生成這個配置檔案。一般情況都不用修改這個配置檔案,除非你一定要重新制定一個 SDK 路徑。

setting.gradle

專案的子專案包含檔案,聲明當前目錄下含有什麼 module,當然你的 app 底下加上這樣的檔案,也能繼續在 app 底下加 module。整個 project 就是一個大的 module,每個 module 下面還能包含相應的 module。

總結

看完上面的介紹,相信對 gradle 這個強大的專案構建工具有了一個比較具體的理解了。
寫這篇文章時參考了很多 gradle 相關的博文和醫生(徐宜生)名著《神兵利器》的內容,正是站在巨人的肩膀上,我可以看得更遠!感恩!

本文哪裡寫的不對的地方,歡迎指出哈!

參考文獻

相關推薦

Gradle 系列文章真的瞭解 Gradle Gradle 入門

Gradle 是什麼? 2013 年,Google 釋出了全新的 Android 開發 IDE————Android Studio。然而, Android Studio 基於 IDEA,不管怎麼說,這都是一個高逼格的 IDE。但核心應該是 Goog

校園網路安全CTF 第一題 和 瞭解

第一題: 需要先找到相應頭(REsponse header中的tips)   <?php$flag = "***";if (isset($_GET['repo']))//檢測變數是否設定 { if (strcmp($_GET['repo'], $flag) == 0) //比較兩個

#Java乾貨分享文章深入瞭解Java中的包和介面

很多新手程式設計師對於Java中兩個具創新性的特徵————包與介面不是非常清楚,所以我特意發了這篇文章來闡述什麼是包,什麼是介面。 包(package)是多個類的容器,它們用於保持類的名稱空間相互隔離。 如果有想學習java的程式設計師,可來我們的java學習扣qun:79979,2590免

C#進階系列——WebApi 路由機制剖析準備好了

事先 blank path can tex 全局配置 dex 找不到 save 前言:從MVC到WebApi,路由機制一直是伴隨著這些技術的一個重要組成部分。 它可以很簡單:如果你僅僅只需要會用一些簡單的路由,如/Home/Index,那麽你只需要配置一個默認路由就能簡

容器化 RDS須要瞭解資料是怎樣被寫&quot;壞&quot;的

容器化 RDS 系列文章: 容器化 RDS:計算儲存分離架構下的“Split-Brain” 容器化 RDS:計算儲存分離還是本地儲存? 即使不使用 Kubernetes,在編排持久化 workload 時,你都須要瞭解編

文章深入瞭解Dubbo分散式服務框架

一、產生的背景 隨著網際網路的發展,網站應用的規模不斷擴大,常規的垂直應用架構已無法應對,分散式服務架構以及流動計算架構勢在必行,亟需一個治理系統確保架構有條不紊的演進。下面我們用一個圖來具體說明架構和開發框架的演進過程。單一應用架構當網站流量很小時,只需一個應用,將所有功能都部署在一起,以減少部署節點和成

文章深入瞭解Dubbo

  一、產生的背景 隨著網際網路的發展,網站應用的規模不斷擴大,常規的垂直應用架構已無法應對,分散式服務架構以及流動計算架構勢在必行,亟需一個治理系統確保架構有條不紊的演進。下面我們用一個圖來具體說明架構和開發框架的演進過程。    

阿里專家與分享必須瞭解的Java多執行緒技術

摘要: 本文介紹了Lambda表示式的起源以及基本語法,並提供程式碼例項幫助大家理解Lambda表示式的使用。另外,本文介紹了Java開發中常用的多執行緒技術,詳細介紹多執行緒涉及到的概念以及使用方法。 數十款阿里雲產品限時折扣中,趕緊點選這裡,領劵開始雲上實踐吧! 演講

真的瞭解ESD?老司機從零教學系列之學會ESD選型

ESD(Electro-Static discharge)的意思是“靜電釋放”。ESD是20世紀中期以來形成的以研究靜電的產生、危害及靜電防護等的學科。因此,國際上習慣將用於靜電防護的器材統稱為ESD,中文名稱為靜電阻抗器。  通常,電路中通常採用TVS(Transient

文章徹底瞭解Java內部類

內容整理自《Thinking in Java》(第四版) 第10章 PDF下載地址 什麼是內部類? 將一個類的定義,放在另一個類的定義內部,那這個類,就是內部類 為什麼需要內部類? 一般來說,內部類繼承自某個類或實現某個介面,內部類的程式碼操作建立其的

遇見未來 | 讀完這篇文章真的瞭解超融合

超融合的概念自2012年被提出到現在,經歷了6年的時間。其技術已經從最初的以儲存的融合為重點,經歷過計算、儲存、網路的全面融合,到現在,重心落在雲端計算平臺的交付,整個技術趨於成熟。   今天我們有幸邀請到青雲QingCloud青立方產品總監廖洋(Lester)老師,請

Java安全技術探索之路系列Java可擴充套件安全架構之一Java可擴充套件安全架構開篇

【Java安全技術探索之路系列:Java可擴充套件安全架構】章節目錄 Java平臺使用基於標準的安全的API技術提供可擴充套件的安全架構模型,這些API技術提供了平臺獨立性,是不同廠商之間能夠進行互操作。這些API技術通過技術整合來支援加密演算法、

文章全面瞭解LoRa水錶

前言 小胖子DD致敬老胖子羅永浩, 歡迎來聽相聲專場《LoRa水錶大解析》, 這一次,保證沒人會打瞌睡! 本文為今天對內進行LoRa水錶培訓的演講稿整理。 點此進入公眾號檢視。 今年以來做過好幾次培訓,基本每次都有人打瞌睡,讓我對自己的演講能力產生了深深的

看完這篇文章瞭解了Android Handler的一切

Message More ...next() { // Return here if the message loop has already quit and been disposed. // This can happen if the appl

水果之王之獼猴桃-系列六(真的瞭解黃心獼猴桃?)

 在回來創業的這段時間內,在跟很多朋友接觸的過程中,他們中很大一部分都會在我給他們介紹黃心獼猴桃的時候反問我,獼猴桃竟然還有黃心的,不是隻有綠心的嗎?面對這樣的反問時,我總是會給他介紹一些關於獼猴桃的品種的發展故事,並告訴他們每一個品種獼猴桃的優缺點。今天就給大家好好聊聊

真的瞭解巨集淺談巨集定義(#define語句)

寫在前面: 本文所有程式碼均在Linux環境下執行 Linux版本為CentOS 7.4 巨集定義 語法 #define name Stuff #define PI 3.14 //定義一個M,值為3.14 #def

面試官真的瞭解Redis分散式鎖

![](https://img2020.cnblogs.com/blog/1478697/202101/1478697-20210113230123649-1602595153.jpg) ### 什麼是分散式鎖 說到Redis,我們第一想到的功能就是可以快取資料,除此之外,Redis因為單程序、效能高的

文章初步瞭解—CSS特指度

# CSS特指度 ## 說明 **這篇部落格在在兩臺電腦上分別完成的,故而有些截圖是Firefox,有些是Chrome,有些改動了瀏覽器的使用者樣式表,有些沒改,但不會影響閱讀,特此說明,勿怪。** ## CSS選擇器 ### 單個CSS選擇器 css選擇器決定css樣式能渲染到對應的元素上。 *

heic轉換格式的兩種方法get到了

質量 情況下 pro 51cto ima get proc 手機 兩種方法 看到標題是不是很激動呢?一直都不知道怎麽轉換heic格式的朋友今天碰巧了,苦惱到今天以後就柳暗花明了,其實作為果粉,理應是懂得的,今天直接進入主題,一起來看看怎麽轉換格式吧! 保證網絡能夠正常使用

真的瞭解人工智慧

從2015年開始“人工智慧”一詞開始頻繁的出現在人們的生活中。“人工智慧改變未來”、“智慧生活,一起為你”,等宣傳語更是刷爆微博、朋友圈。那麼人工智慧到底是什麼呢? 人工智慧(Artificial Intelligence),英文縮寫為AI。它是研究用於模擬、延伸和擴充套件人的智慧的理論、方