【安卓筆記】gradle入門
隨著Android Studio越來越完善,更多的開發者捨棄掉Eclipse。但是新的IDE與以往的Eclipse有很大區別,這導致部分開發者望而卻步,其中一個大家覺得比較麻煩的是Android Studio採用的新的構建系統,gradle。那麼這篇文章我將對gradle進行一個簡單介紹(主要講gradle配合Android Studio的使用),希望幫助大家熟悉gradle。
gradle跟ant/maven一樣,是一種依賴管理/自動化構建工具。但是跟ant/maven不一樣,它並沒有使用xml語言,而是採用了Groovy語言,這使得它更加簡潔、靈活,更加強大的是,gradle完全相容maven和ivy。更多詳細介紹可以看它的官網:http://www.gradle.org/
二.為什麼使用gradle?
更容易重用資源和程式碼;
可以更容易建立不同的版本的程式,多個型別的apk包;
更容易配置,擴充套件;
更好的IDE整合;
三.gradle入門需知
1.基本配置:
首先明確gradle跟maven一樣,也有一個配置檔案,maven裡面是叫pom.xml,而在gradle中是叫build.gradle。Android Studio中的android專案通常至少包含兩個build.gradle檔案,一個是project範圍的,另一個是module範圍的,由於一個project可以有多個module,所以每個module下都會對應一個build.gradle。這麼說有點抽象,看下面這個圖:
這是一個android工程的project檢視,上面那個是module下的build.gradle檔案。下面那個是project下的build.gradle檔案。這兩個檔案是有區別的,project下的build.gradle是基於整個project的配置,而module下的build.gradle是每個模組自己的配置。下面看下這兩個build.gradle裡面的內容:
project#build.gradle:
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
//構建過程依賴的倉庫
repositories {
jcenter()
}
//構建過程需要依賴的庫
dependencies {//下面宣告的是gradle外掛的版本
classpath 'com.android.tools.build:gradle:1.1.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
//這裡面配置整個專案依賴的倉庫,這樣每個module就不用配置倉庫了
allprojects {
repositories {
jcenter()
}
}
注:大家可能很奇怪,為什麼倉庫repositories需要宣告兩次,這其實是由於它們作用不同,buildscript中的倉庫是gradle指令碼自身需要的資源,而allprojects下的倉庫是專案所有模組需要的資源。所以大家千萬不要配錯了。
module#build.gradle:
//宣告外掛,這是一個android程式,如果是android庫,應該是com.android.library
apply plugin: 'com.android.application'
android {//安卓構建過程需要配置的引數
compileSdkVersion 21//編譯版本
buildToolsVersion "21.1.2"//buildtool版本
defaultConfig {//預設配置,會同時應用到debug和release版本上
applicationId "com.taobao.startupanim"//包名
minSdkVersion 15
targetSdkVersion 21
versionCode 1
versionName "1.0"
}
buildTypes {//這裡面可以配置debug和release版本的一些引數,比如混淆、簽名配置等
release {//release版本
minifyEnabled false//是否開啟混淆
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//混淆檔案位置
}
}
}
dependencies {//模組依賴
compile fileTree(dir: 'libs', include: ['*.jar'])//依賴libs目錄下所有jar包
compile 'com.android.support:appcompat-v7:21.0.3'//依賴appcompat庫
}
defaultConfig中是一些基本配置,它會同時應用到debug/release版本上,下面列舉了所有可配項及對應的值:buildTypes結點很重要,這裡可以配置構建的版本的一些引數,預設有兩個構建版本release/debug,當然你可以自定義一個構建版本,比如叫foo,然後通過gradlew assembleFoo就可以生成對應的apk了。
buildTypes裡還有很多可配置項,下面列舉了所有可配項以及debug/release版本的預設值:
現在大家對build.gradle已經初步瞭解了,我們再看下其他一些與gradle相關的檔案:
1.gradle.properties:
從名字上就知道它是一個配置檔案,沒錯,這裡面可以定義一些常量供build.gradle使用,比如可以配置簽名相關資訊如keystore位置,密碼,keyalias等。
2.settings.gradle:
這個檔案是用來配置多模組的,比如你的專案有兩個模組module-a,module-b,那麼你就需要在這個檔案中進行配置,格式如下:
include ':module-a',':module-b'
3.gradle資料夾:
這裡面有兩個檔案,gradle-wrapper.jar和gradle-wrapper.properties,它們就是gradle wrapper。gradle專案都會有,你可以通過命令gradle init來建立它們(前提是本地安裝了gradle並且配置到了環境變數中)。
4.gradlew和gradlew.bat:
這分別是linux下的shell指令碼和windows下的批處理檔案,它們的作用是根據gradle-wrapper.properties檔案中的distributionUrl下載對應的gradle版本。這樣就可以保證在不同的環境下構建時都是使用的統一版本的gradle,即使該環境沒有安裝gradle也可以,因為gradle wrapper會自動下載對應的gradle版本。
gradlew的用法跟gradle一模一樣,比如執行構建gradle build命令,你可以用gradlew build。gradlew即gradle wrapper的縮寫。
2.gradle倉庫:
gradle有三種倉庫,maven倉庫,ivy倉庫以及flat本地倉庫。宣告方式如下:
maven{
url "..."
}
ivy{
url "..."
}
flatDir{
dirs 'xxx'
}
有一些倉庫提供了別名,可直接使用:repositories{
mavenCentral()
jcenter()
mavenLocal()
}
3.gradle任務:
gradle中有一個核心概念叫任務,跟maven中的外掛目標類似。
gradle的android外掛提供了四個頂級任務
assemble 構建專案輸出
check 執行檢測和測試任務
build 執行assemble和check
clean 清理輸出任務
執行任務可以通過gradle/gradlew+任務名稱的方式執,執行一個頂級任務會同時執行與其依賴的任務,比如你執行gradlew assemble
它通常會執行:gradlew assembleDebug
gradlew assembleRelease
這時會在你專案的build/outputs/apk或者build/outputs/aar目錄生成輸出檔案
注:linux下執行構建任務需要首先更改gradlew指令碼的許可權,然後才能執行該指令碼:
chmod +x gradlew
./gradlew assemble
可以通過:gradlew tasks
列出所有可用的任務。在Android Studio中可以開啟右側gradle檢視檢視所有任務。四.常見問題
2.匯入maven庫:
5.依賴三方aar檔案:
6.將庫專案匯出為aar:
首先你的專案必須是一個庫專案,build.gradle中進行配置:
7.引用本地aar:
首先將aar檔案放到模組的libs目錄下,然後在該模組的build.gradle中宣告flat倉庫:
9.多dex支援(打包65k方法數限制)
1.匯入本地jar包:
跟eclipse不太一樣,android studio匯入本地jar除了將jar包放到模組的libs目錄中以外,還得在該模組的build.gradle中進行配置,配置方式是在dependencies結點下進行如下宣告:
compile files('libs/xxx.jar')
如果libs下有多個jar檔案,可以這樣宣告:compile fileTree(dir: 'libs', include: ['*.jar'])
2.匯入maven庫:
compile 'com.android.support:appcompat-v7:21.0.3'
可見,格式為compile 'groupId:artifactId:version'
3.匯入某個project:
你的app是多模組的,假設有兩個模組app和module-A,並且app模組是依賴module-A的,這時候我們就需要在app模組的build.gradle中的dependencies結點下配置依賴:
compile project(':module-A')
並且你需要在settings.gradle中把module-A模組包含進來:include ':module-A',':app'
此外,這種情況下module-A模組是作為庫存在的,因而它的build.gradle中的外掛宣告通常應該是這樣的:apply plugin: 'com.android.library'
而且,作為library的模組module-A的build.gradle檔案的defaultConfig中是不允許宣告applicationId的,這點需要注意。4.宣告三方maven倉庫:
可能你專案需要的一些庫檔案是在你們公司的私服上,這時候repositories中僅有jcenter就不行了,你還需要把私服地址配到裡面來,注意,應該配到project的build.gradle中的allprojects結點下或者直接配到某個模組中如果僅有這個模組用到。
配置方式:
repositories{
maven{
url="http://mvnrepo.xxx.com"
}
}
5.依賴三方aar檔案:
compile 'com.aaa.xxx:core:1.0.1@aar'
6.將庫專案匯出為aar:
首先你的專案必須是一個庫專案,build.gradle中進行配置:
apply plugin : 'com.android.library'
然後你可以在命令列中進到專案目錄,執行如下gradle任務:gradlew assembleRelease//確保該目錄下有gradlew檔案
生成的aar在/build/output/aar資料夾中7.引用本地aar:
首先將aar檔案放到模組的libs目錄下,然後在該模組的build.gradle中宣告flat倉庫:
repositories{
flatDir{
dirs 'libs'
}
}
最後在dependencies結點下依賴該aar模組:dependencies{
compile (name:'xxx',ext:'aar')
}
8.排除依賴:
當出現依賴衝突的時候可以通過排除依賴解決,具體方式如下:
compile (group:'xxx',name:'xxx',version:'xxx'){
exclude group:'xxx',module:'xxx'//module對應的就是artifactId
}
9.多dex支援(打包65k方法數限制)
首先在build.gradle的buildConfig中增加如下配置:
注:debug的預設簽名為:
真實開發中,把密碼配置到build.gradle中不是很好的做法,最好的做法是放在gradle.properties中:
multiDexEnabled true
接著,在dependencies結點下增加如下依賴:dependencies{
compile 'com.android.support:multidex:1.0.0'
}
最後,讓你的Application繼承MultiDexApplication,如果你的應用沒有宣告Application,可以在manifest檔案的application結點下增加name屬性,值為android.support.multidex.MultiDexApplication。
詳細內容參見官方文件。
10.自動移除不用資源
可以在buildTypes結點中增加如下配置:
buildTypes{
release{
minifyEnabled true
shrinkResources true
}
}
11.忽略lint錯誤:
可以在build.gradle檔案中的android結點下增加如下配置:
android{
lintOptions{
abortOnError false
}
}
12.宣告編譯的java版本
可以在build.gradle檔案中的android結點下增加如下配置:
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
13.應用簽名配置
首先在module的build.gradle中增加這些欄位:
storeFiles:keystore檔案儲存位置,通常是.jks檔案
storePassword 密碼
keyAlias keystore別名
keyPassword 密碼
具體配置方式為:
首先在build.gradle的android結點下增加如下配置:
signingConfigs {
//debug版本的簽名配置,通常不用配,因為有預設的debug簽名
debug {
}
release {
storeFile file("key.jks")
storePassword "123456"
keyAlias "mykey"
keyPassword "123456"
}
}
注:debug的預設簽名為:
signingConfig android.signingCongfigs.debug
位置為${home}\.android\debug.keystore
然後在buildTypes結點下的對應版本中新增上面的配置:buildTypes{
release{
signingConfig signingConfigs.release
}
}
當然,release不是固定的名稱,你可以隨便取,比如這樣:android {
signingConfigs {
debug {
storeFile file("debug.keystore")
}
myConfig {
storeFile file("other.keystore")
storePassword "android"
keyAlias "androiddebugkey"
keyPassword "android"
}
}
buildTypes {
foo {
debuggable true
jniDebuggable true
signingConfig signingConfigs.myConfig
}
}
}
真實開發中,把密碼配置到build.gradle中不是很好的做法,最好的做法是放在gradle.properties中:
RELEASE_STOREFILE=xxx.jks
RELEASE_STORE_PASSWORD=123456
RELEASE_KEY_ALIAS=mykey
RELEASE_KEY_PASSWORD=123456
然後直接引用即可: storeFile file(RELEASE_STOREFILE)
storePassword RELEASE_STORE_PASSWORD
keyAlias RELEASE_KEY_ALIAS
keyPassword RELEASE_KEY_PASSWORD
14.定製buildConfig:
在build.gradle中配置:
buildTypes{
release{
buildConfigField "string","type","\"release\""
}
debug{
buildConfigField "string","type","\"debug\""
}
}
這樣就會在BuildConfig類中生成type欄位://build/generate/source/buildConfig/release/包名/ 路徑下的BuildConfig.java
public static final String type = "release"
//build/generate/source/buildConfig/debug/包名/ 路徑下的BuildConfig.java
public static final String type = "debug"
相關文章
- 安卓學習筆記20:Fragment入門安卓筆記Fragment
- 後端工程師入門安卓開發筆記(一)後端工程師安卓筆記
- 詳解安卓架構入門安卓架構
- Gradle入門系列(四)——初識Gradle TaskGradle
- 《Android Gradle權威指南》之Gradle入門AndroidGradle
- Gradle核心思想(二)Gradle入門前奏Gradle
- BFS入門筆記筆記
- DFS入門筆記筆記
- NSIS入門筆記筆記
- Go入門筆記Go筆記
- ByteBuddy入門筆記筆記
- ClickHouse入門筆記筆記
- Python 入門筆記Python筆記
- vue入門筆記Vue筆記
- Python入門筆記Python筆記
- linux入門筆記Linux筆記
- selenium 入門筆記筆記
- Redis入門筆記Redis筆記
- Gradle入門系列(三)——初識Gradle與ProjectGradleProject
- 安卓開發筆記——數獨遊戲安卓筆記遊戲
- 安卓初學基礎學習筆記安卓筆記
- Android入門筆記12Android筆記
- python入門筆記1Python筆記
- XStream入門使用筆記筆記
- Hibernate快速入門筆記筆記
- 安卓Glide(4.7.1)使用筆記 01 - 引入專案安卓IDE筆記
- Unity學習筆記--入門Unity筆記
- 【PostgreSQL】入門學習筆記SQL筆記
- TS入門學習筆記筆記
- Spring入門筆記簡要Spring筆記
- Golang 基礎入門筆記Golang筆記
- es6 入門筆記筆記
- MyBatis-Plus筆記(入門)MyBatis筆記
- git入門學習筆記Git筆記
- 3.Hibernate入門筆記筆記
- 10.Spring入門筆記Spring筆記
- webpack入門筆記——其他配置Web筆記
- EntityFramework Core筆記:入門(1)Framework筆記
- Docker入門學習筆記Docker筆記