Android Studio工程目錄結構說明(下)

前言


不同於Eclipse,AndroidStudio是採用Gradle來構建項目的。Gradle是一個非常先進的項目構建工具,它使用了一種基於Groovy的領域特定語言(DSL)來聲明項目設置。摒棄了傳統基於XML(如Ant和Maven)的各種繁瑣配置。
        在Android Studio工程目錄結構說明(上)文章中我們看到,HelloWorld項目中有兩個build.gradle文件,一個是在最外層目錄下的,一個是在app目錄下的。這兩個文件對構建AndroidStudio項目都起到了至關重要的作用,下面我們就來對這兩個文件中的內容進行詳細的分析。
最外層目錄下的build.gradle
        先來看一下最外層目錄下的build.gradle文件,代碼如下所示:

// Top-level build file where you can add configuration options common to all sub-projects/modules.
// Gradle中可以使用“//”或“/**/”來添加註釋,與Java類似。
// 根目錄下的build.gradle用於添加子工程或模塊共用的配置項。
// "buildscript"的類型爲script block,而且是最上層的script block,用於配置Gradle的Project實例。其API文檔爲https://docs.gradle.org/current/dsl/org.gradle.api.Project.html#org.gradle.api.Project:buildscript(groovy.lang.Closure)
// 其餘的根script block有"allprojects", "dependencies", "configurations"等,更多的可見https://docs.gradle.org/current/dsl/的“Build script structure”一節。
// Script Block是一種method的調用,傳入的參數爲configuration closure。執行後會對Project的屬性進行配置。
// 此處的"buildscript"用於配置Project的build script的classpath。

buildscript {
    // 如果需要的話,從https://jcenter.bintray.com/下載code reposities。
    repositories {
        google()
        jcenter()
        
    }
    // 定義classpath,gradle會從“repositories”中下載對應版本的Gradle。如果使用gradle wrapper的話,感覺這個配置會被忽略。Wrapper會自己去下載所使用的gradle版本。
    dependencies {
        classpath 'com.android.tools.build:gradle:3.5.2'
        
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}
// 該配置會被應用到所有的子工程。
allprojects {
    repositories {
        google()
        jcenter()
        
    }
}
// 運行gradle clean時,執行此處定義的task。
// 該任務繼承自Delete,刪除根目錄中的build目錄。
// 相當於執行Delete.delete(rootProject.buildDir)。
// gradle使用groovy語言,調用method時可以不用加()。
task clean(type: Delete) {
    delete rootProject.buildDir
}

這些代碼都是自動生成的,雖然語法結構看上去可能有點難以理解,但是如果我們忽略語法結構,只看最關鍵的部分,其實還是很好懂的。

首先,兩處repositories的閉包中都聲明瞭jcenter()進行配置,那麼這個jcenter是什麼意思呢?其實它是一個代碼託管倉庫,很多Android開源項目都會選擇將代碼託管到jcenter上,聲明瞭這行配置之後,我們就可以在項目中輕鬆引用任何jcenter上的開源項目了。

接下來,dependencies閉包中使用classpath聲明瞭一個Gradle插件。爲什麼要聲明這個插件呢?因爲Gradle並不是專門爲構建Android項目而開發的,java,c++等很多項目都可以使用Gradle來構建。因此如果我們要想使用它來構建Android項目,則需要聲明com.android.tools.build:gradle:3.5.2這個插件。其中,最後面的部分是插件的版本號。

這樣我們就將最外層目錄下的build.gradle文件分析完了,通常情況下你並不需要修改這個文件中的內容,除非你想添加一些全局的項目構建配置。

app目錄下的的build.gradle


下面我們再來看一下app目錄下的build.gradle文件,代碼如下所示:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 29
    buildToolsVersion "29.0.3"
    defaultConfig {
        applicationId "com.example.myapplication"
        minSdkVersion 18
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.0.2'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
}

這個文件中的內容就要相對複雜一些,下面我們一行行地進行分析。首先第一行應用了一個插件,一般有兩種值可選:com.android.application表示這是一個應用程序模塊,com.android.library表示這是一個庫模塊。應用程序模塊和庫模塊的最大區別在於,一個是可以直接運行的,一個只能作爲代碼庫依附於別的應用程序模塊來運行。

接下來是一個大的android閉包,在這個閉包中我們可以配置項目構建的各種屬性。其中,compileSdkVersion用於指定項目的編譯版本,這裏指定成29表示使用Android 10.0系統的SDK編譯。buildToolsVersion 用於指定項目構建工具的版本,目前使用的版本是29.0.3。

然後我們看到,這裏在android閉包中又嵌套了一個defaultConfig閉包,defaultConfig閉包中可以對項目的更多細節進行配置。其中,applicationId 用於指定項目的包名,前面我們在創建項目的時候其實已經指定過包名了,如果你想在後面對其進行修改,那麼就是在這裏修改的。minSdkVersion 用於指定項目最低兼容的Android系統版本,這裏指定成15表示最低兼容到Android 4.3系統。targetSdkVersion 指定的值表示你在該目標版本上已經做過了充分的測試,系統將會爲你的應用程序啓用一些最新的功能和特性。比如說Android 6.0系統中引入了運行時權限這個功能。而如果你將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 是在當前項目的根目錄下的,裏面可以編寫當前項目特有的混淆規則。需要注意的是,通過AndroidStudio直接運行項目生成的都是測試版安裝文件。

這個整個android閉包中的內容就都分析完了,接下來還剩下一個dependencies閉包。這個閉包的功能非常強大,它可以指定當前項目所有的依賴關係。通常AndroidStudio項目一共有3種依賴方式:本地依賴、庫依賴和遠程依賴。本地依賴可以對本地的jar包或目錄添加依賴關係,庫依賴可以對項目中的庫模塊添加依賴關係,遠程依賴則可以對jcenter庫上的開源項目添加依賴關係。觀察一下dependencies閉包中的配置,第一行的compile fileTree就是一個本地依賴聲明,它表示將libs目錄下所有.jar後綴的文件都添加到項目的構建路徑當中。而遠程依賴聲明這裏沒有用到,它的基本格式是implementation 'com.google.code.gson:gson:2.8.6',其中com.google.code.gson是域名部分,用於和其他公司的庫做區分;gson是組名稱,用於和同一個公司中不同的庫做區分;2.8.6是版本號,用於和同一個庫不同的版本做區分。加上這句聲明後,Gradle在構建項目時會首先檢查一個本地是否已經有這個庫的緩存,如果沒有的話則會去自動聯網下載,然後再添加到項目的構建路徑當中具體添加方法點擊這裏。庫依賴聲明這裏也沒有用到,它的基本格式是compile project後面加上要依賴的庫名稱,比如說有一個庫模塊的名字叫helper,那麼添加這個庫的依賴關係只需要加入compile project(':helper')這句聲明即可。

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