我之前所開發的java項目都是使用Maven構建的,而安卓項目則是通過gradle構建的。
我們在之前分析安卓項目的目錄結構的時候,可以看到build.gradle有兩個,一個是位於最外層的,一個是位於app目錄下的,這兩個文件都對構建安卓項目都起着至關重要的作用。先來看看最外層的build.gradle
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.3.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
這些代碼都是自動生成的,雖然看上去有點難以理解,我們忽略它的語法結構,只看最關鍵的部分,首先兩處repositories的閉包中都聲明瞭jcenter()這行配置,這行配置的意思是一個代碼託管庫,很多的Andriod開源項目都會託管到jcenter上,聲明瞭這行配置後,我們就可以在項目中輕鬆的引用任何的jcenter上的開源項目了,同理google()也是如此。
接下來,dependencies 閉包中使用classpath 聲明瞭一個Gradle插件。爲什麼要聲明這個 插件呢?因爲Gradle並不是專門爲構建Android項目而開發的,Java、C++等很多種項目都可以使 用Gradle來構建。因此如果我們要想使用它來構建Android項目,則需要聲 明com.android.tools.build:gradle:3.3.0 這個插件。其中,最後面的部分是插件的 版本號,我在寫作本書時最新的插件版本是3.3.0。
下面,我們分析一下app目錄下的build.gradle,代碼如下:
apply plugin: 'com.android.application'
android {
compileSdkVersion 28
defaultConfig {
applicationId "example.com"
minSdkVersion 15
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
我們逐行的分析:
第一行
apply plugin: 'com.android.application',第一行應用了一個插件,一般有兩個可供選擇的值,com.android.application:表示這是一個應用程序的模塊,是可以直接運行的。另一個可供選擇的值是com.android.library,表示是一個庫模塊,它只能作爲代碼庫依附於別的應用程序模塊來運行。
接下來是一個android的大閉包,在這個閉包中我們可以配置項目構建的各種屬性。其中compileSdkVersion 28用於指定項目的編譯版本,這裏指定爲28表示使用的Andriod9.0的SDK編譯。然後我們看到,這裏在android閉包中又嵌套了一個defaultConfig閉包 ,defaultConfig閉包中可以 對項目的更多細節進行配置。其中,applicationId 用於指定項目的包名,前面我們在創建 項目的時候其實已經指定過包名了,如果你想在後面對其進行修改,那麼就是在這裏修改 的。minSdkVersion 用於指定項目最低兼容的Android系統版本,這裏指定成15表示最低兼容 到Android 4.0系統。targetSdkVersion 指定的值表示你在該目標版本上已經做過了充分的測 試,系統將會爲你的應用程序啓用一些最新的功能和特性。比如說Android 6.0系統中引入了運 行時權限這個功能,如果你將targetSdkVersion 指定成23或者更高,那麼系統就會爲你的 程序啓用運行時權限功能,而如果你將targetSdkVersion 指定成22,那麼就說明你的程序 最高只在Android 5.1系統上做過充分的測試,Android 6.0系統中引入的新功能自然就不會啓用 了。剩下的兩個屬性都比較簡單,versionCode 用於指定項目的版本號,versionName 用於
指定項目的版本名,這兩個屬性在生成安裝文件的時候非常重要,我們在後面都會學到。分析完了defaultConfig閉包,接下來我們看一下buildTypes閉包 。buildTypes閉包中用於指定生 成安裝文件的相關配置,通常只會有兩個子閉包,一個是debug,一個是release。debug閉包用於 指定生成測試版安裝文件的配置,release閉包用於指定生成正式版安裝文件的配置。另外, debug閉包是可以忽略不寫的,因此我們看到上面的代碼中就只有一個release閉包。下面來看一 下release閉包中的具體內容吧,minifyEnabled 用於指定是否對項目的代碼進行混淆,true 表示混淆,false 表示不混淆。proguardFiles 用於指定混淆時使用的規則文件,這裏指定 了兩個文件,第一個proguard-android.txt 是在Android SDK目錄下的,裏面是所有項目 通用的混淆規則,第二個proguard-rules.pro 是在當前項目的根目錄下的,裏面可以編寫 當前項目特有的混淆規則。需要注意的是,通過Android Studio直接運行項目生成的都是測試版 安裝文件,關於如何生成正式版安裝文件我們將會後面學習。
這樣整個android閉包中的內容就都分析完了,接下來還剩一個dependencies閉包 。這個閉包的 功能非常強大,它可以指定當前項目所有的依賴關係。通常Android Studio項目一共有3種依賴方 式:本地依賴、庫依賴和遠程依賴。本地依賴可以對本地的Jar包或目錄添加依賴關係,庫依賴 可以對項目中的庫模塊添加依賴關係,遠程依賴則可以對jcenter庫上的開源項目添加依賴關係。 觀察一下dependencies閉包中的配置,第一行的compile fileTree 就是一個本地依賴聲明, 它表示將libs目錄下所有.jar後綴的文件都添加到項目的構建路徑當中。而第二行的compile 則 是遠程依賴聲明,com.android.support:appcompat-v7:24.2.1 就是一個標準的遠程依 賴庫格式,其中com.android.support 是域名部分,用於和其他公司的庫做區 分;appcompat-v7 是組名稱,用於和同一個公司中不同的庫做區分;24.2.1是版本號,用於 和同一個庫不同的版本做區分。加上這句聲明後,Gradle在構建項目時會首先檢查一下本地是否 已經有這個庫的緩存,如果沒有的話則會去自動聯網下載,然後再添加到項目的構建路徑當 中。至於庫依賴聲明這裏沒有用到,它的基本格式是compile project 後面加上要依賴的庫 名稱,比如說有一個庫模塊的名字叫helper,那麼添加這個庫的依賴關係只需要加入compile project(':helper') 這句聲明即可。另外剩下的一句testCompile 是用於聲明測試用例 庫的,這個我們暫時用不到,先忽略它就可以了。