心愈靜,夜愈靜
分享一篇整理的gradle的相關知識,部分結構略有混亂,但不影響閱讀。
gradle是一個構建工具,具備編譯、運行、簽名、打包,依賴管理等功能的獨立工具
最初是用來支持java的,為了能在AS上使用,專門有了個插件叫Android Gradle Plugin
AS中項目的根目錄下有個build.gradle文件,其中有
classpath 'com.android.tools.build:gradle:2.1.2'
就是用來依賴gradle插件的代碼,
ps:最后的版本號不是gradle的版本,而是google定義的
gradle下的project和tasks
在grade中的兩大重要的概念,分別是project和tasks。每一次構建都是有至少一個project來完成,所以Android studio中的project和Gradle中的project不是一個概念。每個project有至少一個tasks。每一個build.grade文件代表著一個project。tasks在build.gradle中定義。當初始化構建進程,gradle會基于build文件,集合所有的project和tasks,一個tasks包含了一系列動作,然后它們將會按照順序執行,一個動作就是一段被執行的代碼,很像Java中的方法。
構建生命周期
一旦一個tasks被執行,那么它不會再次執行了,不包含依賴的Tasks總是優先執行,一次構建將會經歷下列三個階段:
初始化階段:project實例在這兒創建,如果有多個模塊,即有多個build.gradle文件,多個project將會被創建。
配置階段:在該階段,build.gradle腳本將會執行,為每個project創建和配置所有的tasks。
執行階段:這一階段,gradle會決定哪一個tasks會被執行,哪一個tasks會被執行完全依賴開始構建時傳入的參數和當前所在的文件夾位置有關。
項目結構
gradle使用了一個叫做source set的概念,一個source set就是一系列資源文件,其將會被編譯和執行,對于Android項目,main就是一個source set
而如果要寫測試用例的話,需要另外開一個source set,叫做androidTest,這樣才可以單獨編譯和執行測試用例。
module下的build.gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 22
buildToolsVersion "22.0.1"
defaultConfig {
applicationId "com.gradleforandroid.gettingstarted"
minSdkVersion 14
targetSdkVersion 22
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile
('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.2.0'
}
全局配置
1.在項目的根目錄下創建config.gradle文件
ext {
android = [
compileSdkVersion: 23,
buildToolsVersion: "23.0.2",
minSdkVersion: 14,
targetSdkVersion : 22,
]
dependencies = [
appcompatV7': 'com.android.support:appcompat-v7:23.2.1',
design : 'com.android.support:design:23.2.1'
]
}
2.在工程的build.gradle下
//引用配置文件
`apply from:"config.gradle"`
3.app下的build.gradle使用
android {
compileSdkVersion rootProject.ext.android.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
defaultConfig {
applicationId "com.wuxiaolong.gradle4android"
minSdkVersion rootProject.ext.android.minSdkVersion
targetSdkVersion rootProject.ext.android.targetSdkVersion
versionCode 1
versionName "1.0"
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile rootProject.ext.dependencies.appcompatV7
compile rootProject.ext.dependencies.design
}
Gradle Wrapper
Gradle Wrapper是一個管理gradle的包裝,作用是給不同的項目分配不同的gradle
這樣的所有的項目才能都正常運行。
每一個gradle wrapper對于一個可執行的腳本,windows下是bat,mac下是shell
在你的項目啟動的時候,對應的腳本程序就會啟動,去下載相應的gradle版本,
而下載好的gradle會存放在對于的配置文件properties中,如下圖
myapp/
├── gradlew
├── gradlew.bat
└── gradle/wrapper/
├── gradle-wrapper.jar
└── gradle-wrapper.properties
gradle常用命令
gradlew -v 查看當前項目所用的gradle版本
gradlew clean 清楚app目錄下的build文件夾
gradlew build 檢查依賴并編譯打包 (正式和測試)
gradlew assembleDebug 編譯并打Debug包
gradlew assembleRelease 編譯并打Release包
gradle tasks 列出所有的tasks(可執行任務)
gradlew androidDependencies 列出所有的依賴文件
Android下的gradle
Android studio會在我們創建工程的時候,幫我們生成三個gradle文件,
兩個build.gradle,一個setting.gradle文件
setting.gradle
include ':app'
setting.gradle一般的形式是這樣的,這表示你的工程只包括一個app模塊,這個gradle文件在會初始化時期執行,生成對應的project,而這個project會根據對應的build.gradle文件下生成一系列的tasks。
這些tasks才是具體執行的代碼。
setting.gradle 主要是針對多模塊操作的,單模塊的攻城,setting.gradle沒有多大用處。
根目錄下的build.gradle
該gradle文件是定義工程下模塊的公共屬性的,默認配置
buildscript {
//定義依賴包的來源
repositories {
jcenter()
}
//定義構建過程所需要依賴的插件
//比如在使用dagger2的時候,就需要在這里另外加入一個apt插件
dependencies {
classpath 'com.android.tools.build:gradle:1.2.3'
}
}
//定義各模塊的屬性,你可以加入任意的tasks,也就是說這個build.gradle文件,allprojects下才是主要可以操作的地方
allprojects {
repositories {
jcenter()
}
}
模塊內的build.gradle
模塊內的gradle文件只對該模塊起作用,而且會重寫來自于根目錄下gradle傳過來的屬性。
默認構造
//google團隊所寫的插件,提供關于Android應用和依賴庫的構建,打包和測試
apply plugin: 'com.android.application'
android {
compileSdkVersion 22
buildToolsVersion "22.0.1"
defaultConfig {
applicationId "com.gradleforandroid.gettingstarted"
minSdkVersion 14
targetSdkVersion 22
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile
('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.2.0'
}
Android下
必須的屬性為compileSdkVersion和buildToolsVersion
compileSdkVersion:編譯該app時候,你想使用到的api版本。
buildToolsVersion:構建工具的版本號。
構建工具包含了很多實用的命令行命令,例如aapt,zipalign,dx等,這些命令能夠被用來產生多種多樣的應用程序。你可以通過sdk manager來下載這些構建工具。
defaultConfig方法包含了該app的核心屬性,該屬性會覆寫在AndroidManifest.xml中的對應屬性。
defaultConfig {
//將會覆寫AndroidMainifest文件下的packagename,但是作用不完全相同,packagename作為包名和R文件的包名,applicationId被用做唯一標識在不同的設備和各大應用市場上。
applicationId "com.gradleforandroid.gettingstarted"
minSdkVersion 14
targetSdkVersion 22
//版本標識
versionCode 1
//沒什么作用,一般內部標識
versionName "1.0"
}
依賴管理
gradle的依賴管理功能非常實用,只需要一行代碼,gradle就會幫你在遠程倉庫拉取需要的jar包。
倉庫
這里的倉庫通常指的是遠程倉庫,比如Jcenter,Maven等。
倉庫相當于一個jar文件的集合體,你只要定義好需要什么jar文件,gradle工具就會幫你從你制定的倉庫里拉取jar文件。
jar文件會在你執行build構建的時候從遠程倉庫拉取,并且會在本地保留緩存,所以一個版本的依賴包只需要下載一次。
定義一個依賴通常需要三個元素
group:創建該library的組織名,通常也會是包名,
name :是該library的唯一標識
version:該library的版本號
常規寫法
dependencies {
compile 'com.google.code.gson:gson:2.3'
compile 'com.squareup.retrofit:retrofit:1.9.0'
}
完成的寫法
dependencies {
compile group: 'com.google.code.gson', name: 'gson', version:'2.3'
compile group: 'com.squareup.retrofit', name: 'retrofit'
version: '1.9.0'
}
當然還有一些類庫不在maven或者jcenter中,
這個時候你可以這么定義,將url寫在maven中
repositories {
maven {
url "http://repo.acmecorp.com/maven2"
}
}
本地依賴
添加jar文件作為依賴
dependencies {
compile files('libs/libraryname.jar')
}
libs目錄下的所有jar包
dependencies {
compile fileTree('libs')
}
或者
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
}
native包(c/c++寫的library會被叫做so包)
app根目錄下創建一個jniLibs目錄,
dependencies {
compile fileTree(dir: 'jniLibs', include: ['*.so'])
}
arr文件(包含資源文件的依賴包)
將app下build.gradle的配置改為
apply plugin: 'com.android.library'
//刪除
applicationId "com.***"
編譯通過之后會在build/outputs/aar文件下生產aar包
使用方式,
aar文件也是屬于jar包,所以也可以放入到libs目錄下,
接著在build.gradle中android方法下
repositories {
flatDir {
dirs 'libs'
}
在dependencies方法下
compile(name:'libraryname', ext:'aar')
這表示在libs目錄下,有個叫libraryname,后綴是aar的文件
依賴的形式
compile 'com.google.code.gson:gson:2.3'
這是我們正常情況下使用的方法,
complie:包含所有的依賴包,debug模式下和release模式下都會依賴
其他的還有
provided:意思是提供debug支持,但是不會寫入release。
testCompile和androidTestCompile:主要針對測試使用
另外還有
debugCompile和releaseProvided方式可以配置
在不同的情況下需要配置不同的依賴方式
本人也只是Android開發路上一只稍大一點的菜鳥,如果各位讀者中發現文章中有誤之處,請幫忙指出,你的批評和鼓勵都是我前進的動力。