“Project”模式項目結構
- .gradle和.idea
這個目錄放置的是AS自動生成的文件,一般不管它澜汤。 - app
存放項目中的代碼和資源赔硫,我們進行的開發(fā)工作都在這個目錄中進行伞梯。 - build
這個目錄一般不需要操作蛛蒙,包含一些編譯自動生成的文件。 - gradle
Gradle是一個基于Apache Ant和Apcahe Maven概念的項目自動化構建工具寸士。它使用一種基于Groovy的特定領域語言(DSL)來聲明項目設置檐什,拋棄了基于XML的各種繁瑣配置。這個目錄包含gradle wrapper的配置文件弱卡,使用gradle wrapper的方式不需要提前將Gradle下載好乃正,而是會自動根據(jù)本地的緩存情況決定是否需要聯(lián)網(wǎng)下載Gradle。AS默認不使用gradle wrapper的方式婶博。如果需要打開瓮具,在AS主界面選擇“File→Setting”選項中進行配置,如下圖所示凡人。
- .gitignore
此文件用來將指定的文件或目錄排除在版本控制之外(Git部分)名党。 - build.gradle
這個項目是全局的Gradle構建腳本,通常這個文件中的內(nèi)容是不需要修改的挠轴。 - gradle.properties
這個文件是全局的Gradle的配置文件传睹,這里的配置將影響到項目中所有的Gradle編譯腳本。 - gradlew和gradlew.bat
這兩個文件用來在命令行界面中執(zhí)行gradle命令岸晦,其中gradlew實在Linux或Mac系統(tǒng)中使用的欧啤,gradlew.bat是在Windows系統(tǒng)中使用的。 - app.iml
iml文件是所有IntelliJ IDEA項目都會自動生成的一個文件(AS是基于IntelliJ IDEA開發(fā)的)启上,用于標識一個IntelliJ IDEA項目邢隧,不需要修改。 - local.properties
這個文件用于指定本機中的Android SDK路徑冈在,通常內(nèi)容都是自動生成的府框,除非本機的Android SDK位置發(fā)生了變化。 - setting.gradle
此文件用于指定項目中所有引入的模塊。由于項目中只有app模塊迫靖,因此該文件只引入app一個模塊,通常都是自動完成的兴使。
app目錄下的結構
- build
這個目錄和外層的build目錄類似系宜,主要包含一些編譯自動生成的文件,一般不需要關心发魄。 - libs
如果項目中使用了第三方jar包盹牧,就需要把這些jar包放在libs目錄下,被自動添加到構建路徑里去励幼。 - android Test
此處是用來編寫Android Test測試用例的汰寓,可以對項目進行一些自動化測試。 - java
存放java源代碼苹粟。 - res
存放項目的資源有滑,和Eclipse的res目錄內(nèi)容相同。 - AndroidManifest.xml
Android應用程序的配置文件嵌削,聲明了Android里邊的組件和相關配置信息毛好、添加的權限。和Eclipse的AndroidManifest.xml基本相同苛秕。 - test
用來編寫Unit Test測試用例肌访,是對項目進行自動化測試的另一種方式。 - .gitignore
這個文件用來將app模塊內(nèi)指定的文件或目錄排除在版本控制之外艇劫,作用和外層的吼驶。gitignore類似。 - app.iml
IntelliJ IDEA項目自動生成的文件店煞,不需要修改蟹演。 - build.gradle
這是app模塊的gradle構建腳本,這個文件中會指定很多項目構建相關配置浅缸。 - proguard-rules.pro
此文件用于指定代碼的混淆規(guī)則轨帜,當代碼開發(fā)完成后打包成安裝包文件,如果不希望代碼被別人破解衩椒,通常會將代碼進行混淆蚌父。
詳解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項目為開發(fā)的骇窍,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文件分析完了兼贡,通常情況下并不需要修改這個文件中的內(nèi)容,除非你想添加一些全局的項目構建配置娃胆。
下面是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'
這個文件中的內(nèi)容相對復雜一些遍希,下面進行具體分析。
首先第一行應用了一個插件里烦,一般有兩種值可選:com.android.application表示這是一個應用程序模塊凿蒜,com.android.library表示這是一個庫模塊。應用程序模塊和庫模塊最大的區(qū)別:一個是可以直接運行的胁黑,一個只能作為代碼庫依附于別的應用程序模塊來運行废封。
接下來是android閉包,在這個閉包中我們可以配置項目構建的各種屬性丧蘸。
其中漂洋,complieSdkVersion用于指定項目的編譯版本,這里指定成24,表示使用Android7.0系統(tǒng)的SDK編譯刽漂。
buildToolsVersion用于指定項目構建工具的版本演训,目前最新的版本就是24.0.3,如果有更新的版本時爽冕,AS會進行提示仇祭。
然后,在android的閉包中又嵌套了一個defaultConfig閉包颈畸,在defaultConfig閉包中可以對項目的更多細節(jié)進行配置。
其中没讲,applicationId用于指定項目的包名眯娱,我們在創(chuàng)建時其實已經(jīng)指定過包名了,如果想在后面對其進行修改爬凑,就需要在這里修改徙缴。
minSdkVersion用于指定項目最低兼容的Android系統(tǒng)版本,這里指定成“15”嘁信,表示最低兼容到Android4.0系統(tǒng)于样。
targetSdkVersion指定的值表示你在該目標版本上已經(jīng)做過了充分的測試,系統(tǒng)會將為你的應用程序啟用一些最新的功能和特性潘靖。比如穿剖,在Android7.0系統(tǒng)中引入了運行時權限這個功能,如果你將targetSdkVersion指定指定成“24”卦溢,或者更高糊余,那么系統(tǒng)就會為你的應用程序啟用運行時權限功能;如果你將targetSdkVersion指定成“22”单寂,那么就說明你的應用程序只在Android5.1系統(tǒng)上做過充分的測試贬芥,Android6.0系統(tǒng)中引入的新功能自然就不要啟用了。
其余兩個屬性都比較簡單宣决,versionCode用于指定的版本號蘸劈,versionName用于指定項目的版本名,這兩個屬性在生成安裝文件的時候非常重要尊沸。
testInstrumentationRunner這一行表示要使用AndroidJUnitRunner進行單元測試威沫。
接下來看一下 buildTypes閉包。 buildTypes閉包中用于指定生成安裝文件的相關配置椒丧,通常只會有兩個子閉包壹甥,一個是debug,一個是release。debug閉包用于指閉包是可以忽略不寫的壶熏,因此我們看到代碼中就只有一個release閉包句柠。
下面看一下release閉包中的具體內(nèi)容吧,minifyEnabled用于指定混淆時使用的規(guī)則文件,這里指定了兩個文件溯职,proguard-android.txt是在Android SDK目錄下的精盅,里面是所有項目通用的混淆規(guī)則;proguard-rules.pro是在當前項目中根目錄下的谜酒,里面可以編寫當前項目特有的混淆規(guī)則叹俏。需要注意的是,通過AS直接運行項目生成的都是測試版安裝文件僻族。
最后是一個dependencies閉包粘驰。這個閉包的功能非常強大,它可以指定當前項目所有的依賴關系述么。通常蝌数,AS項目一共有三種依賴方式:本地依賴、庫依賴和遠程依賴度秘。本地依賴可以對本地的jar包或目錄添加依賴關系顶伞,庫依賴可以對項目中的庫模塊添加依賴關系,遠程依賴可以對JCenter庫上的開源項目添加依賴關系剑梳。
觀察一下dependencies閉包中的配置唆貌,
第1行的compile fileTree就是一個本地依賴聲明,它表示將libs目錄下所有的.jar后綴的文件都添加到項目的構建路徑當中垢乙。
而第2行的compile則是遠程依賴聲明锨咙,com.android.support:appcompat-v7:24.2.1就是一個標準的遠程依賴庫格式,其中com.android.support是域名部分侨赡,用于和其他公司的庫做區(qū)分蓖租;appcompat-v7是組名稱,用于和同一個公司中不同的庫做區(qū)分羊壹;24.2.1是版本號蓖宦,用于和同一個庫中不同的版本做區(qū)分。
加上這個聲明后油猫,Gradle在構建項目時會首先檢查一下本地是否已經(jīng)有這個庫的緩存稠茂,如果沒有則會自動聯(lián)網(wǎng)下載,然后再添加到項目的構建路徑當中情妖。
至于庫依賴這里沒有用到睬关,它的基本格式是在compile project后面加上要依賴的庫名稱,比如有一個庫模塊的名字叫helper毡证,那么添加這個庫的依賴關系只需要加入complie project(':helper')這句聲明即可电爹。
最后的一句testCompile是用于聲明測試用例庫的,這個我們暫時用不到料睛,先忽略它就可以了丐箩。