天天看點

Android Studio工程目錄結構分析(下) 前言 最外層目錄下的build.gradle app目錄下的的build.gradle

前言

         不同于Eclipse,AndroidStudio是采用Gradle來建構項目的。Gradle是一個非常先進的項目建構工具,它使用了一種基于Groovy的領域特定語言(DSL)來聲明項目設定。摒棄了傳統基于XML(如Ant和Maven)的各種繁瑣配置。          在Android Studio工程目錄結構分析(上)( http://blog.csdn.net/xhbxhbsq/article/details/54615663)文章中我們看到,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 {              jcenter()              }              // 定義classpath,gradle會從“repositories”中下載下傳對應版本的Gradle。如果使用gradle wrapper的話,感覺這個配置會被忽略。Wrapper會自己去下載下傳所使用的gradle版本。              dependencies {              classpath 'com.android.tools.build:gradle:2.2.2'                  // NOTE: Do not place your application dependencies here; they belong              // in the individual module build.gradle files              }              }                  // 該配置會被應用到所有的子工程。              allprojects {              repositories {              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:2.2.2這個插件。其中,最後面的部分是插件的版本号。

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

app目錄下的的build.gradle

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

apply plugin: 'com.android.application'                  android {              compileSdkVersion 23              buildToolsVersion "23.0.3"              defaultConfig {              applicationId "com.example.helloworld"              minSdkVersion 15              targetSdkVersion 23              versionCode 1              versionName "1.0"              testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"              }              buildTypes {              release {              minifyEnabled false              proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'              }              }              }                  dependencies {              compile fileTree(include: ['*.jar'], dir: 'libs')              androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {              exclude group: 'com.android.support', module: 'support-annotations'              })              compile 'com.android.support:appcompat-v7:23.4.0'              testCompile 'junit:junit:4.12'              }           

         這個檔案中的内容就要相對複雜一些,下面我們一行行地進行分析。首先第一行應用了一個插件,一般有兩種值可選:com.android.application表示這是一個應用程式子產品,com.android.library表示這是一個庫子產品。應用程式子產品和庫子產品的最大差別在于,一個是可以直接運作的,一個隻能作為代碼庫依附于别的應用程式子產品來運作。

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

         然後我們看到,這裡在android閉包中又嵌套了一個defaultConfig閉包,defaultConfig閉包中可以對項目的更多細節進行配置。其中,applicationId 用于指定項目的包名,前面我們在建立項目的時候其實已經指定過包名了,如果你想在後面對其進行修改,那麼就是在這裡修改的。minSdkVersion 用于指定項目最低相容的Android系統版本,這裡指定成15表示最低相容到Android 4.0系統。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字尾的檔案都添加到項目的建構路徑當中。而第三行compile 則是遠端依賴聲明,com.android.support:appcompat-v7:23.4.0就是一個标準的遠端依賴庫格式,其中 com.android.support是域名部分,用于和其他公司的庫做區分; appcompat-v7是組名稱,用于和同一個公司中不同的庫做區分; 23.4.0是版本号,用于和同一個庫不同的版本做區分。加上這句聲明後,Gradle在建構項目時會首先檢查一個本地是否已經有這個庫的緩存,如果沒有的話則會去自動聯網下載下傳,然後再添加到項目的建構路徑當中。至于庫依賴聲明這裡沒有用到,它的基本格式是compile project後面加上要依賴的庫名稱,比如說有一個庫子產品的名字叫helper,那麼添加這個庫的依賴關系隻需要加入compile project(':helper')這句聲明即可。

繼續閱讀