什麼是Gradle?
Gradle是一種依賴管理工具,基於Groovy語言,面向Java應用為主,它拋棄了基於XML的各種繁瑣配置,取而代之的是一種基於Groovy的內部領域特定(DSL)語言。
安裝Gradle
在Android Studio系列教程一--下載與安裝中新建專案成功後會下載Gradle,貌似這個過程不FQ也是可以下載,但是訪問特別慢,建議FQ下載。那麼下載的Gradle到什麼地方呢?
-
Mac上會預設下載到 /Users/<使用者名稱>/.gradle/wrapper/dists 目錄
-
Win平臺會預設下載到 C:\Documents and Settings\<使用者名稱>.gradle\wrapper\dists 目錄
你會看到這個目錄下有個 gradle-x.xx-all 的資料夾, 如果下載實在太慢,但是又不想FQ的話,可以自己手動到Gradle官網下載對應的版本,然後將下載的.zip檔案(也可以解壓)複製到上述的gradle-x.xx-all 資料夾下,不過還是建議讓它直接下載的好。
Gradle 基本概念
下面就以我的開源專案 9GAG 來詳細講解下和Gradle相關的知識, 和Gradle相關的幾個檔案一般有如下幾個:
紅色標記部分從上到下我們們來一步步分析:
1. 9GAG/app/build.gradle
這個檔案是app資料夾下這個Module的gradle配置檔案,也可以算是整個專案最主要的gradle配置檔案,我們來看下這個檔案的內容:
// 宣告是Android程式
apply plugin: 'com.android.application'
android {
// 編譯SDK的版本
compileSdkVersion 21
// build tools的版本
buildToolsVersion "21.1.1"
defaultConfig {
// 應用的包名
applicationId "me.storm.ninegag"
minSdkVersion 14
targetSdkVersion 21
versionCode 1
versionName "1.0.0"
}
// java版本
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
buildTypes {
release {
// 是否進行混淆
minifyEnabled false
// 混淆檔案的位置
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
// 移除lint檢查的error
lintOptions {
abortOnError false
}
}
dependencies {
// 編譯libs目錄下的所有jar包
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:support-v4:21.0.2'
compile 'com.etsy.android.grid:library:1.0.5'
compile 'com.alexvasilkov:foldable-layout:1.0.1'
// 編譯extras目錄下的ShimmerAndroid模組
compile project(':extras:ShimmerAndroid')
}
這裡需要說明幾點:
-
檔案開頭apply plugin是最新gradle版本的寫法,以前的寫法是apply plugin: 'android', 如果還是以前的寫法,請改正過來。
-
buildToolsVersion這個需要你本地安裝該版本才行,很多人匯入新的第三方庫,失敗的原因之一是build version的版本不對,這個可以手動更改成你本地已有的版本或者開啟 SDK Manager 去下載對應版本。
-
applicationId代表應用的包名,也是最新的寫法,這裡就不在多說了。
-
android 5.0開始預設安裝jdk1.7才能編譯,但是由於mac系統自帶jdk的版本是1.6,所以需要手動下載jdk1.7並配置下,具體可以見我這篇部落格Mac下安裝和管理Java
-
minifyEnabled也是最新的語法,很早之前是runProguard,這個也需要更新下。
-
proguardFiles這部分有兩段,前一部分代表系統預設的android程式的混淆檔案,該檔案已經包含了基本的混淆宣告,免去了我們很多事,這個檔案的目錄在 <sdk目錄>/tools/proguard/proguard-android.txt , 後一部分是我們專案裡的自定義的混淆檔案,目錄就在 app/proguard-rules.txt , 如果你用Studio 1.0建立的新專案預設生成的檔名是 proguard-rules.pro , 這個名字沒關係,在這個檔案裡你可以宣告一些第三方依賴的一些混淆規則,由於是開源專案,9GAG裡並未進行混淆,具體混淆的語法也不是本篇部落格討論的範圍。最終混淆的結果是這兩部分檔案共同作用的。
-
compile project(':extras:ShimmerAndroid')這一行是因為9GAG中存在其他Module,不知道Module的概念可以看下這篇部落格Android Studio系列教程二--基本設定與執行, 總之你可以理解成Android Library,由於Gradle的普及以及遠端倉庫的完善,這種依賴漸漸的會變得非常不常見,但是你需要知道有這種依賴的。
-
以上檔案裡的內容只是基本配置,其實還有很多自定義部分,如自動打包debug,release,beta等環境,簽名,多渠道打包等,後續會單獨拿出來講解。
2. 9GAG/extras/ShimmerAndroid/build.gradle
每一個Module都需要有一個gradle配置檔案,語法都是一樣,唯一不同的是開頭宣告的是 apply plugin: 'com.android.library'
3. 9GAG/gradle
這個目錄下有個 wrapper 資料夾,裡面可以看到有兩個檔案,我們主要看下 gradle-wrapper.properties 這個檔案的內容:
#Thu Dec 18 16:02:24 CST 2014
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip
可以看到裡面宣告瞭gradle的目錄與下載路徑以及當前專案使用的gradle版本,這些預設的路徑我們一般不會更改的,這個檔案裡指明的gradle版本不對也是很多導包不成功的原因之一。
4. 9GAG/build.gradle
這個檔案是整個專案的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:1.0.0'
}
}
allprojects {
repositories {
jcenter()
}
}
內容主要包含了兩個方面:一個是宣告倉庫的源,這裡可以看到是指明的jcenter(), 之前版本則是mavenCentral(), jcenter可以理解成是一個新的中央遠端倉庫,相容maven中心倉庫,而且效能更優。另一個是宣告瞭android gradle plugin的版本,android studio 1.0正式版必須要求支援gradle plugin 1.0的版本。
5. 9GAG/settings.gradle
這個檔案是全域性的專案配置檔案,裡面主要宣告一些需要加入gradle的module,我們來看看9GAG該檔案的內容:
include ':app', ':extras:ShimmerAndroid'
檔案中的 app, extras:ShimmerAndroid 都是module,如果還有其他module都需要按照如上格式加進去。
總結
關於gradle的基礎知識就介紹到這裡,接下來會介紹一種我常用的快速方便的編譯檢視第三方開源專案的方法,如何匯入Android Studio,Gradle常用基本命令,多渠道打包配置等。有疑問或者發現錯誤歡迎大家直接部落格留言。
在一個Android專案的build.gradle中,dependencies閉包中有以下四種形式的宣告:
compile 'com.android.support:appcompat-v7:22.2.1'
provided 'com.squareup.dagger:dagger-compiler:1.2.1'
compile files('libs/picasso-2.4.0.jar')
compile project(':androidPullToRefresh')
我想徹底弄清compile、provided、compile files、compile project四者的區別。
我的理解:
compile所指編譯內容可以是本地的,也可以是遠端(jCenter)中的。如果是本地的包,最好以aar形式給出
provided 不懂
compile files編譯的是jar包
compile project編譯的內容必須包含多有Java程式碼、xml佈局檔案、AndroidManifest等,而且還要在專案的setting.gradle中用include的形式宣告引用