Android項(xiàng)目中的build.gradle文件

文 | 莫若吻


一蚀腿、gradle簡介

gradle是基于groovy語言的纷妆。

Android Studio是采用Gradle來構(gòu)建項(xiàng)目的亦镶。Gradle是一個非常先進(jìn)的項(xiàng)目構(gòu)建工具,使用了一種基于Groovy的領(lǐng)域特定語言(DSL)來聲明項(xiàng)目設(shè)置灼狰,摒棄了XML(如Ant和Maven)的各種煩瑣配置宛瞄。

Note:若只是用它構(gòu)建普通的工程,可以不去學(xué)groovy語言交胚;若想深入的做一下自定義的構(gòu)建插件咽扇,可以考慮學(xué)groovy辟犀,因?yàn)間roovy語言是基于java語言的,所以有java基礎(chǔ)的同學(xué)學(xué)習(xí)groovy語言不會很難。

二绊袋、build.gradle文件

1.Android項(xiàng)目中的gradle文件位置:

在一個android項(xiàng)目中一般會出現(xiàn)至少2個build.gradle文件椎扬,一個是project的gradle文件轮听,一個是module的gradle文件笋鄙。
Note:如果項(xiàng)目目錄結(jié)構(gòu)切換到Android模式下則全部gradle在Gradle Scripts下。

2.gradle文件內(nèi)的常用代碼釋義:

1)jcenter():
代碼托管庫互拾,設(shè)置后可以在項(xiàng)目中引用jcenter上的開源項(xiàng)目歪今。聲明在repositories閉包中。
很多的Android開源項(xiàng)目都會選擇將代碼托管到j(luò)center上颜矿,聲明了此行配置后寄猩,就可以在項(xiàng)目中輕松使用jcenter上的任何開源項(xiàng)目。
2)聲明gradle插件及版本號

classpath 'com.android.tools.build:gradle:2.3.3'

3)apply plugin:
代表著應(yīng)用一個插件或衡。
eg:

//表示一個應(yīng)用程序模塊焦影。
apply plugin: 'com.android.application'
// 表示是一個庫模塊
apply plugin: 'com.android.library'

Note:
com.android.application 是代表可以直接運(yùn)行的應(yīng)用程序车遂;
com.android.library 是只能作為代碼依附在別的應(yīng)用程序模塊來運(yùn)行。所以在引入一些Model為自己的應(yīng)用程序所用時(shí)斯辰,build.gradle文件的第一行就是apply plugin:'com.android.library'舶担。

4)android閉包:
compileSdkVersion: 用于指定項(xiàng)目的編譯版本。
buildToolsVersion: 用于指定項(xiàng)目的構(gòu)建工具的版本彬呻。

applicationId: 用于指定項(xiàng)目的包名衣陶,在創(chuàng)建項(xiàng)目的時(shí)候已經(jīng)指定了包名,當(dāng)要修改整個項(xiàng)目的包名時(shí)可以在此更改闸氮。
minSdkVersion: 項(xiàng)目最低的兼容版本剪况。后面的數(shù)字(eg:15)表示兼容到API 15
targetSdkVersion:
表示你在該目標(biāo)版本上已經(jīng)做過了充分的測試,系統(tǒng)將為你的應(yīng)用開啟一些最新的功能和特性蒲跨。
假如targetSdkVersion 為23或者更高译断,那么在Android6.0中運(yùn)行這個應(yīng)用時(shí)會開啟新的功能和特性;若設(shè)置成了22或悲,只能說明你的應(yīng)用程序在Android5.1系統(tǒng)上做過了充分的測試孙咪,Android6.0的新功能就不會啟用。
versionCode: 項(xiàng)目的版本號巡语。
versionName: 項(xiàng)目版本號的版本名翎蹈。

Note:
在以前eclipse開發(fā)中設(shè)置上述代碼都是在AndroidManifest.xml文件中設(shè)置的。

<uses-sdk
    android:minSdkVersion="15"
    android:targetSdkVersion="23" />

而在使用Android Studio開發(fā)時(shí)男公,即使在AndroidManifest.xml設(shè)置也無作用荤堪,運(yùn)行時(shí)只對build.gradle下的設(shè)置有效。

5)android閉包中的buildTypes閉包:
一般其中會有兩個閉包枢赔,一個是debug澄阳,一個release;當(dāng)然也可以有其他閉包糠爬。用于安裝文件的環(huán)境變量的配置寇荧。
debug閉包用于生成測試版安裝文件的配置,release閉包用于生成正式版安裝文件的配置执隧。可以只設(shè)置一個release閉包户侥。

minifyEnabled:用于設(shè)置是否對項(xiàng)目的代碼進(jìn)行混淆镀琉。true代表開啟,false代表關(guān)閉蕊唐。
proguardFiles:指定混淆時(shí)使用的文件屋摔。
proguard-android.txt:在Android SDK 目錄下的,里面是所有項(xiàng)目通用的混淆規(guī)則替梨。
proguard-rules.pro:是在當(dāng)前項(xiàng)目根目錄下的钓试,里面編寫當(dāng)前項(xiàng)目特有的混淆規(guī)則装黑。

6)dependencies閉包:
可以在其中指定當(dāng)前項(xiàng)目所有的依賴關(guān)系。
一般Android Studio 項(xiàng)目中一共有三種依賴方式:本地依賴弓熏、庫依賴和遠(yuǎn)程依賴恋谭。
本地依賴可以對本地的Jar包或目錄添加依賴關(guān)系
庫依賴可以對項(xiàng)目中的庫模塊添加依賴關(guān)系。
遠(yuǎn)程依賴則可以對jcenter庫上的開源項(xiàng)目添加依賴關(guān)系挽鞠。

庫依賴的基本格式為 compile project疚颊,后面加上依賴庫的庫名稱。
遠(yuǎn)程依賴的基本格式為 compile 信认,后面加上遠(yuǎn)程依賴庫的庫名稱材义;Gradle在構(gòu)建項(xiàng)目的時(shí)候會檢查一下本地倉庫是否已經(jīng)緩存了指定內(nèi)容,若沒有會自動聯(lián)網(wǎng)下載嫁赏,然后再添加到項(xiàng)目的構(gòu)建路徑中去其掂。
遠(yuǎn)程依賴時(shí)每次都要檢查是否有這個緩存,所以使編譯變的很慢潦蝇】畎荆可以設(shè)置成離線的Gradle模式。

eg:

   //本地依賴聲明
    compile fileTree(include: ['*.jar'], dir: 'libs')
   //庫依賴聲明
    compile project(':library_pulltorefresh')
    //遠(yuǎn)程依賴聲明
    compile 'com.android.support:appcompat-v7:25.3.1'

Note:
Android Studio 3.0以上的開發(fā)工具版本护蝶,api 替代了 compile华烟。
eg:

   //本地依賴聲明
    api fileTree(include: ['*.jar'], dir: 'libs')
   //庫依賴聲明
    api project(':library_pulltorefresh')
    //遠(yuǎn)程依賴聲明
    api 'com.android.support:appcompat-v7:25.3.1'

3.示例代碼:

(注:下面的代碼只是部分的示例代碼,要根據(jù)項(xiàng)目開發(fā)實(shí)際情況選擇性地使用代碼)
project的build.gradle文件:
eg:

// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    repositories {//閉包
        jcenter()//代碼托管庫持灰,設(shè)置后可以在項(xiàng)目中引用jcenter上的開源項(xiàng)目
    }
    dependencies {
        //聲明gradle插件及版本號
        classpath 'com.android.tools.build:gradle:2.3.3'

        //butterknife的新版插件必須在此處作配置
        classpath 'com.jakewharton:butterknife-gradle-plugin:8.8.1'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

module的build.gradle文件:
eg:

apply plugin: 'com.android.application'//默認(rèn)的應(yīng)用程序模塊(插件)
apply plugin: 'com.jakewharton.butterknife'//butterkinfe插件

android {
    compileSdkVersion cfg.compileVersion   //編譯版本
    buildToolsVersion cfg.buildToolsVersion  //構(gòu)建工具版本
    aaptOptions.cruncherEnabled = false
    aaptOptions.useNewCruncher = false


    defaultConfig {
        applicationId "com.zrmx.athenaapp"  //包名
        minSdkVersion cfg.minSdk   //最低兼容版本
        targetSdkVersion cfg.targetSdk  //(目標(biāo)版本:充分測試過版本(建議版本))大于22需要考慮存儲權(quán)限問題盔夜,由于默認(rèn)權(quán)限是關(guān)閉的,啟動時(shí)下載廣告圖片緩存不了
        versionCode project.VERSION_CODE as int    //版本號
        versionName project.VERSION_NAME   //版本名稱

        jackOptions {
            enabled true
        }
    }
    lintOptions {//設(shè)置編譯的lint開關(guān)堤魁,程序在buid的時(shí)候喂链,會執(zhí)行l(wèi)int檢查,有任何的錯誤或者警告提示妥泉,都會終止構(gòu)建
        abortOnError false
    }
    
    buildTypes {
       
        release {
            minifyEnabled false   //是否混淆(true為混淆)
            
            //Android SDK通用的混淆規(guī)則椭微; 后面的為開發(fā)者編寫的項(xiàng)目混淆規(guī)則
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

            buildConfigField("int", "SERVICE_TYPE", "4")//線上環(huán)境
            signingConfig signingConfigs.release
        }
    }
    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            def outputFile = output.outputFile
            if (outputFile != null && outputFile.name.endsWith('.apk') && !outputFile.name.contains("debug")) {
                output.outputFile = new File(APK_OUT_PATH + "/${variant.buildType.name}", "${releaseTime()}_v${defaultConfig.versionName}_c${defaultConfig.versionCode}.apk")
            }
        }
    }

    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {
    //本地依賴聲明
    compile fileTree(include: ['*.jar'], dir: 'libs')

   //庫依賴聲明
    compile project(':library_pulltorefresh')

    //遠(yuǎn)程依賴聲明
    compile 'com.android.support:appcompat-v7:25.3.1'
    testCompile 'junit:junit:4.12'
    compile 'com.squareup.okhttp3:okhttp:3.3.1'
    compile 'com.google.code.gson:gson:2.5'
    compile files('libs/universal-image-loader-1.9.2-SNAPSHOT-with-sources.jar')
    compile 'org.greenrobot:eventbus:3.0.0'

    compile 'com.jakewharton:butterknife:8.8.1'
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'

    //android 6.0 新增加了運(yùn)行時(shí)的動態(tài)添加權(quán)限
    compile 'com.lovedise:permissiongen:0.0.6'
}

三、Gradle 解析大全

具體Gradle 原理及相關(guān)語法詳解請參考文章:
《Android:Gradle 解析》


版權(quán)聲明:本文為博主原創(chuàng)文章盲链,轉(zhuǎn)載請注明出處蝇率,謝謝!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末刽沾,一起剝皮案震驚了整個濱河市本慕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌侧漓,老刑警劉巖锅尘,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異布蔗,居然都是意外死亡藤违,警方通過查閱死者的電腦和手機(jī)浪腐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來顿乒,“玉大人议街,你說我怎么就攤上這事∠危” “怎么了傍睹?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長犹菱。 經(jīng)常有香客問我拾稳,道長,這世上最難降的妖魔是什么腊脱? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任访得,我火速辦了婚禮,結(jié)果婚禮上陕凹,老公的妹妹穿的比我還像新娘悍抑。我一直安慰自己,他們只是感情好杜耙,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布搜骡。 她就那樣靜靜地躺著,像睡著了一般佑女。 火紅的嫁衣襯著肌膚如雪记靡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天团驱,我揣著相機(jī)與錄音摸吠,去河邊找鬼。 笑死嚎花,一個胖子當(dāng)著我的面吹牛寸痢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播紊选,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼啼止,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了兵罢?” 一聲冷哼從身側(cè)響起族壳,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎趣些,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贰您,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡坏平,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年拢操,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舶替。...
    茶點(diǎn)故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡令境,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出顾瞪,到底是詐尸還是另有隱情舔庶,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布陈醒,位于F島的核電站惕橙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏钉跷。R本人自食惡果不足惜弥鹦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望爷辙。 院中可真熱鬧彬坏,春花似錦、人聲如沸膝晾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽血当。三九已至幻赚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間歹颓,已是汗流浹背坯屿。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留巍扛,地道東北人领跛。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像撤奸,于是被迫代替她去往敵國和親吠昭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評論 2 348

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,742評論 25 707
  • http://www.reibang.com/p/7c288a17cda8 總的來說胧瓜,Android的系統(tǒng)體系結(jié)...
    燕京博士閱讀 1,188評論 0 6
  • 前言 為什么需要學(xué)Gradle? Gradle 是 Android 現(xiàn)在主流的編譯工具矢棚,雖然在Gradle 出現(xiàn)之...
    真笨笨魚閱讀 1,489評論 0 0
  • 似百靈輕歌, 溶入我嶄新的生活府喳。 象優(yōu)美樂章蒲肋, 喚起我神迷的思索。 嚓嚓嚓,嚓嚓嚓兜粘, 是沙輪迸發(fā)的火花在周身閃爍申窘。...
    黃曉紅閱讀 481評論 3 1
  • 如果公司開發(fā)核心代碼的開發(fā)人員開發(fā)一個功能代碼庫,不可能保證寫的過程中一點(diǎn)問題都沒有, 都需要做測試 那么我們怎么...
    coder_hong閱讀 1,802評論 0 0