5.詳解build.gradle文件

    我之前所開發的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    是用於聲明測試用例 庫的,這個我們暫時用不到,先忽略它就可以了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章