查漏補缺之詳解項目目錄中的結構文件

“Project”模式項目結構

“Project”模式項目結構

  1. .gradle和.idea
    這個目錄放置的是AS自動生成的文件,一般不管它澜汤。
  2. app
    存放項目中的代碼和資源赔硫,我們進行的開發(fā)工作都在這個目錄中進行伞梯。
  3. build
    這個目錄一般不需要操作蛛蒙,包含一些編譯自動生成的文件。
  4. 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”選項中進行配置,如下圖所示凡人。
image.png
  1. .gitignore
    此文件用來將指定的文件或目錄排除在版本控制之外(Git部分)名党。
  2. build.gradle
    這個項目是全局的Gradle構建腳本,通常這個文件中的內(nèi)容是不需要修改的挠轴。
  3. gradle.properties
    這個文件是全局的Gradle的配置文件传睹,這里的配置將影響到項目中所有的Gradle編譯腳本。
  4. gradlew和gradlew.bat
    這兩個文件用來在命令行界面中執(zhí)行gradle命令岸晦,其中gradlew實在Linux或Mac系統(tǒng)中使用的欧啤,gradlew.bat是在Windows系統(tǒng)中使用的。
  5. app.iml
    iml文件是所有IntelliJ IDEA項目都會自動生成的一個文件(AS是基于IntelliJ IDEA開發(fā)的)启上,用于標識一個IntelliJ IDEA項目邢隧,不需要修改。
  6. local.properties
    這個文件用于指定本機中的Android SDK路徑冈在,通常內(nèi)容都是自動生成的府框,除非本機的Android SDK位置發(fā)生了變化。
  7. setting.gradle
    此文件用于指定項目中所有引入的模塊。由于項目中只有app模塊迫靖,因此該文件只引入app一個模塊,通常都是自動完成的兴使。

app目錄下的結構

app目錄下的結構
  1. build
    這個目錄和外層的build目錄類似系宜,主要包含一些編譯自動生成的文件,一般不需要關心发魄。
  2. libs
    如果項目中使用了第三方jar包盹牧,就需要把這些jar包放在libs目錄下,被自動添加到構建路徑里去励幼。
  3. android Test
    此處是用來編寫Android Test測試用例的汰寓,可以對項目進行一些自動化測試。
  4. java
    存放java源代碼苹粟。
  5. res
    存放項目的資源有滑,和Eclipse的res目錄內(nèi)容相同。
  6. AndroidManifest.xml
    Android應用程序的配置文件嵌削,聲明了Android里邊的組件和相關配置信息毛好、添加的權限。和Eclipse的AndroidManifest.xml基本相同苛秕。
  7. test
    用來編寫Unit Test測試用例肌访,是對項目進行自動化測試的另一種方式。
  8. .gitignore
    這個文件用來將app模塊內(nèi)指定的文件或目錄排除在版本控制之外艇劫,作用和外層的吼驶。gitignore類似。
  9. app.iml
    IntelliJ IDEA項目自動生成的文件店煞,不需要修改蟹演。
  10. build.gradle
    這是app模塊的gradle構建腳本,這個文件中會指定很多項目構建相關配置浅缸。
  11. proguard-rules.pro
    此文件用于指定代碼的混淆規(guī)則轨帜,當代碼開發(fā)完成后打包成安裝包文件,如果不希望代碼被別人破解衩椒,通常會將代碼進行混淆蚌父。

詳解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項目為開發(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是用于聲明測試用例庫的,這個我們暫時用不到料睛,先忽略它就可以了丐箩。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末摇邦,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子屎勘,更是在濱河造成了極大的恐慌施籍,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件概漱,死亡現(xiàn)場離奇詭異丑慎,居然都是意外死亡,警方通過查閱死者的電腦和手機瓤摧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門竿裂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人照弥,你說我怎么就攤上這事铛绰。” “怎么了产喉?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長敢会。 經(jīng)常有香客問我曾沈,道長,這世上最難降的妖魔是什么鸥昏? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任塞俱,我火速辦了婚禮,結果婚禮上吏垮,老公的妹妹穿的比我還像新娘障涯。我一直安慰自己,他們只是感情好膳汪,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布唯蝶。 她就那樣靜靜地躺著,像睡著了一般遗嗽。 火紅的嫁衣襯著肌膚如雪粘我。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天痹换,我揣著相機與錄音征字,去河邊找鬼。 笑死娇豫,一個胖子當著我的面吹牛匙姜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播冯痢,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼氮昧,長吁一口氣:“原來是場噩夢啊……” “哼框杜!你這毒婦竟也來了?” 一聲冷哼從身側響起郭计,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤霸琴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后昭伸,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體梧乘,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年庐杨,在試婚紗的時候發(fā)現(xiàn)自己被綠了选调。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡灵份,死狀恐怖仁堪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情填渠,我是刑警寧澤弦聂,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站氛什,受9級特大地震影響莺葫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜枪眉,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一捺檬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧贸铜,春花似錦堡纬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至渤早,卻和暖如春职车,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鹊杖。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工悴灵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人骂蓖。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓积瞒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親登下。 傳聞我的和親對象是個殘疾皇子茫孔,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容