查漏補缺之詳解專案目錄中的結構檔案
“Project”模式專案結構

“Project”模式專案結構
- .gradle和.idea
這個目錄放置的是AS自動生成的檔案,一般不管它。 - app
存放專案中的程式碼和資源,我們進行的開發工作都在這個目錄中進行。 - build
這個目錄一般不需要操作,包含一些編譯自動生成的檔案。 - gradle
Gradle是一個基於Apache Ant和Apcahe Maven概念的專案自動化構建工具。它使用一種基於Groovy的特定領域語言(DSL)來宣告專案設定,拋棄了基於XML的各種繁瑣配置。這個目錄包含gradle wrapper的配置檔案,使用gradle wrapper的方式不需要提前將Gradle下載好,而是會自動根據本地的快取情況決定是否需要聯網下載Gradle。AS預設不使用gradle wrapper的方式。如果需要開啟,在AS主介面選擇“File→Setting”選項中進行配置,如下圖所示。

image.png
- .gitignore
此檔案用來將指定的檔案或目錄排除在版本控制之外(Git部分)。 - build.gradle
這個專案是全域性的Gradle構建指令碼,通常這個檔案中的內容是不需要修改的。 - gradle.properties
這個檔案是全域性的Gradle的配置檔案,這裡的配置將影響到專案中所有的Gradle編譯指令碼。 - gradlew和gradlew.bat
這兩個檔案用來在命令列介面中執行gradle命令,其中gradlew實在Linux或Mac系統中使用的,gradlew.bat是在Windows系統中使用的。 - app.iml
iml檔案是所有IntelliJ IDEA專案都會自動生成的一個檔案(AS是基於IntelliJ IDEA開發的),用於標識一個IntelliJ IDEA專案,不需要修改。 - local.properties
這個檔案用於指定本機中的Android SDK路徑,通常內容都是自動生成的,除非本機的Android SDK位置發生了變化。 - setting.gradle
此檔案用於指定專案中所有引入的模組。由於專案中只有app模組,因此該檔案只引入app一個模組,通常都是自動完成的。
app目錄下的結構

app目錄下的結構
- build
這個目錄和外層的build目錄類似,主要包含一些編譯自動生成的檔案,一般不需要關心。 - libs
如果專案中使用了第三方jar包,就需要把這些jar包放在libs目錄下,被自動新增到構建路徑裡去。 - android Test
此處是用來編寫Android Test測試用例的,可以對專案進行一些自動化測試。 - java
存放java原始碼。 - res
存放專案的資源,和Eclipse的res目錄內容相同。 - AndroidManifest.xml
Android應用程式的配置檔案,聲明瞭Android裡邊的元件和相關配置資訊、新增的許可權。和Eclipse的AndroidManifest.xml基本相同。 - test
用來編寫Unit Test測試用例,是對專案進行自動化測試的另一種方式。 - .gitignore
這個檔案用來將app模組內指定的檔案或目錄排除在版本控制之外,作用和外層的。gitignore類似。 - app.iml
IntelliJ IDEA專案自動生成的檔案,不需要修改。 - build.gradle
這是app模組的gradle構建指令碼,這個檔案中會指定很多專案構建相關配置。 - proguard-rules.pro
此檔案用於指定程式碼的混淆規則,當代碼開發完成後打包成安裝包檔案,如果不希望程式碼被別人破解,通常會將程式碼進行混淆。
詳解build.gradle檔案

專案中有兩個build.gradle
下面是最外層的build.gradle檔案:
buildscript { repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.2.2' } } allprojects { repositories { google() jcenter() } } task clean(type: Delete) { delete rootProject.buildDir }
這些程式碼是自動生成的,雖然語法結構看上去可能有點難以理解,但如果忽略語法結構,只看關鍵的部分,其實還是好懂的。
首先,兩次的 repositories 的閉包中都聲明瞭jcenter()這行配置。這是什麼意思呢?其實它是一個程式碼託管倉庫,很多Android開源專案都會選擇將程式碼託管到JCenter上。聲明瞭這行配置之後,我們就可以在專案中輕鬆引用任何JCenter上的開源專案。
JCenter是一個由bintray.com維護的Maven倉庫,可通過Maven、Gradle、Ivy和SBT等工具使用。
dependencies閉包中使用classpath聲明瞭一個gradle外掛。為什麼要宣告這個外掛呢?因為Gradle並不是專門構建Android專案為開發的,Java、C++等很多專案使用Gradle來構建。因此如果我們使用它來構建Android專案,則需要宣告com.android.tools.build:gradle:3.0.0這個外掛。其中,最後面的部分是外掛的版本號。
task clean聲明瞭一個任務,任務名叫clean(也可以改為其他的任務名,如Delete,也可能是Copy),任務型別是Delete(也可以是Copy),就是每次修改setting.gradle檔案後單擊同步,就會刪除rootProject.buildDir下的檔案(實際上看到的效果是清除了External Libraries裡的包,然後又添加了一次)。
這樣就將最外層目錄下的build.gradle檔案分析完了,通常情況下並不需要修改這個檔案中的內容,除非你想新增一些全域性的專案構建配置。
下面是app目錄裡的build.gradle檔案:
apply plugin: 'com.android.application' android { compileSdkVersion 24 buildToolsVersion "24.0.3" defaultConfig { applicationId "com.jennyni.news" minSdkVersion 15 targetSdkVersion 24 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( dir: 'libs',include: ['*.jar']) compile 'com.android.support:appcompat-v7:24.2.1' testCompile 'junit:junit:4.12'
這個檔案中的內容相對複雜一些,下面進行具體分析。
首先第一行應用了一個外掛,一般有兩種值可選:com.android.application表示這是一個應用程式模組,com.android.library表示這是一個庫模組。應用程式模組和庫模組最大的區別:一個是可以直接執行的,一個只能作為程式碼庫依附於別的應用程式模組來執行。
接下來是android閉包,在這個閉包中我們可以配置專案構建的各種屬性。
其中,complieSdkVersion用於指定專案的編譯版本,這裡指定成24,表示使用Android7.0系統的SDK編譯。
buildToolsVersion用於指定專案構建工具的版本,目前最新的版本就是24.0.3,如果有更新的版本時,AS會進行提示。
然後,在android的閉包中又嵌套了一個defaultConfig閉包,在defaultConfig閉包中可以對專案的更多細節進行配置。
其中,applicationId用於指定專案的包名,我們在建立時其實已經指定過包名了,如果想在後面對其進行修改,就需要在這裡修改。
minSdkVersion用於指定專案最低相容的Android系統版本,這裡指定成“15”,表示最低相容到Android4.0系統。
targetSdkVersion指定的值表示你在該目標版本上已經做過了充分的測試,系統會將為你的應用程式啟用一些最新的功能和特性。比如,在Android7.0系統中引入了執行時許可權這個功能,如果你將targetSdkVersion指定指定成“24”,或者更高,那麼系統就會為你的應用程式啟用執行時許可權功能;如果你將targetSdkVersion指定成“22”,那麼就說明你的應用程式只在Android5.1系統上做過充分的測試,Android6.0系統中引入的新功能自然就不要啟用了。
其餘兩個屬性都比較簡單,versionCode用於指定的版本號,versionName用於指定專案的版本名,這兩個屬性在生成安裝檔案的時候非常重要。
testInstrumentationRunner這一行表示要使用AndroidJUnitRunner進行單元測試。
接下來看一下 buildTypes閉包。 buildTypes閉包中用於指定生成安裝檔案的相關配置,通常只會有兩個子閉包,一個是debug,一個是release。debug閉包用於指閉包是可以忽略不寫的,因此我們看到程式碼中就只有一個release閉包。
下面看一下release閉包中的具體內容吧,minifyEnabled用於指定混淆時使用的規則檔案,這裡指定了兩個檔案,proguard-android.txt是在Android SDK目錄下的,裡面是所有專案通用的混淆規則;proguard-rules.pro是在當前專案中根目錄下的,裡面可以編寫當前專案特有的混淆規則。需要注意的是,通過AS直接執行專案生成的都是測試版安裝檔案。
最後是一個dependencies閉包。這個閉包的功能非常強大,它可以指定當前專案所有的依賴關係。通常,AS專案一共有三種依賴方式:本地依賴、庫依賴和遠端依賴。本地依賴可以對本地的jar包或目錄新增依賴關係,庫依賴可以對專案中的庫模組新增依賴關係,遠端依賴可以對JCenter庫上的開源專案新增依賴關係。
觀察一下dependencies閉包中的配置,
第1行的compile fileTree就是一個本地依賴宣告,它表示將libs目錄下所有的.jar字尾的檔案都新增到專案的構建路徑當中。
而第2行的compile則是遠端依賴宣告,com.android.support:appcompat-v7:24.2.1就是一個標準的遠端依賴庫格式,其中com.android.support是域名部分,用於和其他公司的庫做區分;appcompat-v7是組名稱,用於和同一個公司中不同的庫做區分;24.2.1是版本號,用於和同一個庫中不同的版本做區分。
加上這個聲明後,Gradle在構建專案時會首先檢查一下本地是否已經有這個庫的快取,如果沒有則會自動聯網下載,然後再新增到專案的構建路徑當中。
至於庫依賴這裡沒有用到,它的基本格式是在compile project後面加上要依賴的庫名稱,比如有一個庫模組的名字叫helper,那麼新增這個庫的依賴關係只需要加入complie project(':helper')這句宣告即可。
最後的一句testCompile是用於宣告測試用例庫的,這個我們暫時用不到,先忽略它就可以了。