有人用android studio開發android項目,發現經常接觸到Gradle,但是對它又不會有很大的關注,而當你的Gradle報錯,或者從github,csdn上下載開源項目的時候,一旦出現gradle的錯誤,你就棘手了,所有我們還是很有必要去了解一下Gradle的世界。
什麼是Gradle?
Gradle是一種依賴管理工具,基於Groovy語言,面向Java應用爲主,它拋棄了基於XML的各種繁瑣配置,取而代之的是一種基於Groovy的內部領域特定(DSL)語言。
Gradle的基本概念
下面就以我最近做的一個代表性的項目來詳細講解下和Gradle相關的知識, 和Gradle相關的幾個文件一般有如下幾個:
其中紅色標記是我們今天要關注的內容。
首先簡單的解釋一下爲什麼會出現3個build.gradle。
在android studio裏,每一個Project都會對應着一個build.gradle,他相當於eclipse裏的workspace。
每一個Module都會自己對應一個build.gradle來分開管理,其中Module相當於eclipse對應的工程。明白了這個我們就逐個往下分析。
一、SnailBulb_Basic_Android/app/build.gradle
這個文件是app文件夾下這個Module的gradle配置文件,也可以算是整個項目最主要的gradle配置文件,我們來看下這個文件的內容:
//聲明是android程序,這裏是新版本的寫法,老版本apply plugin:'androd'是同樣的意思
apply plugin: 'com.android.application'
android {
//當前編譯版本
compileSdkVersion 21
//buildTools的版本號
buildToolsVersion '21.1.2'
defaultConfig {
//程序的包名。以前eclipse是以AndroidManifest裏爲主,這裏以gradle配置的爲主,AndroidManifest裏的無效
applicationId "com.snaillove.app.snailbulb.general"
minSdkVersion 9
targetSdkVersion 21
versionCode 121
versionName "1.21"
}
buildTypes {
release {
//是否允許debug調試
debuggable true
// 是否進行混淆 minifyEnabled也是最新的語法,很早之前是runProguard,這個也需要更新下。在github上拉去項目經常會報這個地方的錯誤。一定要記得改過來
minifyEnabled false
// 混淆文件的位置
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
debuggable true
}
}
}
//本地依賴 下一篇會具體介紹
dependencies {
// 編譯libs目錄下的所有jar包
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:support-v4:22.2.0'
compile 'com.android.support:appcompat-v7:22.2.0'
compile 'com.google.code.gson:gson:2.3.1'
compile 'com.wunderlist:sliding-layer:1.2.5'
compile 'com.nineoldandroids:library:2.4.0'
compile 'com.astuetz:pagerslidingtabstrip:1.0.1'
compile 'com.readystatesoftware.systembartint:systembartint:1.0.3'
// 編譯bDIntegrationSDK_LibProject模塊
compile project(':bDIntegrationSDK_LibProject')
}
這裏需要說明幾點:
1、文件開頭apply plugin是最新gradle版本的寫法,以前的寫法是apply plugin: ‘android’, 這裏大家注意一下。
2、buildToolsVersion這個需要你本地安裝該版本纔行,很多人導入新的第三方庫,失敗的原因之一是build version的版本不對,這個可以手動更改成你本地已有的版本或者打開 SDK Manager 去下載對應版本。
3、applicationId代表應用的包名,也是最新的寫法,這裏就不在多說了。
4、android 5.0開始默認安裝jdk1.7才能編譯,但是由於mac系統自帶jdk的版本是1.6,所以需要手動下載jdk1.7並配置下,具體可以見我這篇博客Mac下安裝和管理Java
5、minifyEnabled也是最新的語法,很早之前是runProguard,這個也需要更新下。
6、proguardFiles這部分有兩段,前一部分代表系統默認的android程序的混淆文件,該文件已經包含了基本的混淆聲明,免去了我們很多事,這個文件的目錄在 sdk目錄/tools/proguard/proguard-android.txt , 後一部分是我們項目裏的自定義的混淆文件,目錄就在 app/proguard-rules.txt , 如果你用Studio 1.0創建的新項目默認生成的文件名是 proguard-rules.pro , 這個名字沒關係,在這個文件裏你可以聲明一些第三方依賴的一些混淆規則,由於是開源項目,SnailBulb_Basic_Android裏並未進行混淆,具體混淆的語法也不是本篇博客討論的範圍。最終混淆的結果是這兩部分文件共同作用的。
7、以上文件裏的內容只是基本配置,其實還有很多自定義部分,如自動打包debug,release,beta等環境,簽名,多渠道打包等,後續會單獨拿出來講解
二、SnailBulb_Basic_Android/bDIntegrationSDK_LibProject/build.gradle
apply plugin: 'com.android.library'
android {
compileSdkVersion 21
buildToolsVersion "21.1.2"
defaultConfig {
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
}
dependencies {
//compile 'com.android.support:support-v4:19.+'
//單文件依賴
compile files('libs/android_api_3.7.1.3.jar')
compile files('libs/BDAutoUpdateSDK_20150605_V1.2.0.jar')
compile files('libs/need_lib.jar')
compile files('libs/patchupdate.jar')
compile 'com.android.support:support-v4:22.2.0'
}
看了上面的講解在看這個估計已經無壓力了
每一個Module都需要有一個gradle配置文件,語法都是一樣,唯一不同的是開頭聲明的是
applyplugin: 'com.android.library'
三、 SnailBulb_Basic_Android/gradle
這個目錄下有個 wrapper 文件夾,裏面可以看到有兩個文件,我們主要看下 gradle-wrapper.properties 這個文件的內容:
Mon Aug 24 13:25:25 CST 2015
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https://services.gradle.org/distributions/gradle-2.4-all.zip
可以看到裏面聲明瞭gradle的目錄與下載路徑以及當前項目使用的gradle版本,這些默認的路徑我們一般不會更改的,這個文件裏指明的gradle版本不對也是很多導包不成功的原因之一。
當你的gradle依賴更換的時候,這個路徑是很容易報錯的,需要你手動換過來。
四、 SnailBulb_Basic_Android/build.gradle
這個文件是整個項目的gradle基礎配置文件,我們來看看這裏面的內容
//對於buildscript{} 在android gradle是用來預置插件環境,一般不建議把依賴寫着裏面
//buildscript設置腳步的運行環境
buildscript {
//repositories支持java 依賴庫管理(maven/ivy),用於項目的依賴
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.2.3'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
}
}
內容主要包含了兩個方面:一個是聲明倉庫的源,這裏可以看到是指明的jcenter(), 之前版本則是mavenCentral(), jcenter可以理解成是一個新的中央遠程倉庫,兼容maven中心倉庫,而且性能更優。另一個是聲明瞭android gradle plugin的版本,android studio 1.2正式版必須要求支持gradle plugin 1.2的版本。
五、 SnailBulb_Basic_Android/settings.gradle
這個文件是全局的項目配置文件,裏面主要聲明一些需要加入gradle的module,我們來看看SnailBulb_Basic_Android該文件的內容:
include ‘:app’, ‘bDIntegrationSDK_LibProject’
文件中的 app, bDIntegrationSDK_LibProject 都是module,如果還有其他module都需要按照如上格式加進去。
六、總結
看到這裏你應該對Gradle有了一個基本的認識,希望以後你在報錯的時候,或者從其他地方下載項目的時候,知道去哪裏更改gradle配置啦。
個人博客
http://www.jackwaiting.com
https://github.com/Jackwaiting
http://www.zhihu.com/people/jackwaiting