android--使用gradle構(gòu)建項(xiàng)目

什么是Gradle?

Gradle是一種依賴(lài)管理工具,基于Groovy語(yǔ)言,面向Java應(yīng)用為主,它拋棄了基于XML的各種繁瑣配置,取而代之的是一種基于Groovy的內(nèi)部領(lǐng)域特定(DSL)語(yǔ)言。在Android Studio 中是默認(rèn)安裝的Gradle的插件。

project和task

在gradle中的兩大重要的概念,分別是project和tasks。每一次構(gòu)建都是有至少一個(gè)project來(lái)完成,所以Android studio中的project和Gradle中的project不是一個(gè)概念。每個(gè)project有至少一個(gè)tasks。每一個(gè)build.gradle文件代表著一個(gè)project。tasks在build.gradle中定義。當(dāng)初始化構(gòu)建進(jìn)程,gradle會(huì)基于build文件,集合所有的project和tasks, 一個(gè)tasks包含了一系列動(dòng)作,然后它們將會(huì)按照順序執(zhí)行,一個(gè)動(dòng)作就是一段被執(zhí)行的代碼,很像Java中的方法。

Gradle構(gòu)建的聲明周期

一旦一個(gè)tasks被執(zhí)行,那么它不會(huì)再次執(zhí)行了,不包含依賴(lài)的Tasks總是優(yōu)先執(zhí)行,一次構(gòu)建將會(huì)經(jīng)歷下列三個(gè)階段:

  1. 初始化階段:project實(shí)例在這兒創(chuàng)建,如果有多個(gè)模塊,即有多個(gè)build.gradle文件,多個(gè)project將會(huì)被創(chuàng)建。
  1. 配置階段:在該階段,build.gradle腳本將會(huì)執(zhí)行,為每個(gè)project創(chuàng)建和配置所有的tasks。
  2. 執(zhí)行階段:這一階段,gradle會(huì)決定哪一個(gè)tasks會(huì)被執(zhí)行,哪一個(gè)tasks會(huì)被執(zhí)行完全依賴(lài)開(kāi)始構(gòu)建時(shí)傳入的參數(shù)和當(dāng)前所在的文件夾位置有關(guān)。
整個(gè)項(xiàng)目的build.gradle

這個(gè)是整個(gè)項(xiàng)目的gradle基礎(chǔ)配置文件

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.0.0'
        //聲明了android gradle plugin的版本。
    }
}

allprojects {  //所有的項(xiàng)目都通用的配置
    repositories {
        jcenter()
    }
}

這個(gè)就是實(shí)際構(gòu)建開(kāi)始的地方,在倉(cāng)庫(kù)地址中,使用了JCenter,JCenter類(lèi)似maven庫(kù),不需要任何額外的配置,gradle還支持其他幾個(gè)倉(cāng)庫(kù),不論是遠(yuǎn)程還是本地倉(cāng)庫(kù)。

有些組織,創(chuàng)建了一些有意思的插件或者library,他們更愿意把這些放在自己的maven庫(kù),而不是maven中心庫(kù)或jcenter。那么當(dāng)你需要是要這些倉(cāng)庫(kù)的時(shí)候,你只需要在maven方法中加入url地址就好:

repositories {  
       maven {  
           url "http://repo.acmecorp.com/maven2"  
       }  
}  

同樣的,Ivy倉(cāng)庫(kù)也可以這么做。Apache Ivy在ant世界里是一個(gè)很出名的依賴(lài)管理工具。如果你的公司有自己的倉(cāng)庫(kù),如果他們需要權(quán)限才能訪(fǎng)問(wèn),你可以這么編寫(xiě):

repositories {  
       maven {  
           url "http://repo.acmecorp.com/maven2"  
           credentials {  
               username 'user'  
               password 'secretpassword'  
           }  
        }   
   }  
     
模塊Gradle
// 聲明是Android程序
apply plugin: 'com.android.application'

android {
    // 編譯SDK的版本
    compileSdkVersion 21
    // build tools的版本
    buildToolsVersion "21.1.1"

    defaultConfig {
        // 應(yīng)用的包名
        applicationId "me.storm.ninegag"
        minSdkVersion 14
        targetSdkVersion 21
        versionCode 1
        versionName "1.0.0"
    }

    // java版本
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }

    buildTypes {  //打不同類(lèi)型的包
        release {
            // 是否進(jìn)行混淆
            minifyEnabled false
            // 混淆文件的位置
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }

    // 移除lint檢查的error
    lintOptions {
      abortOnError false
    }
}

dependencies {  //添加依賴(lài)
    //添加compile后,會(huì)自動(dòng)從工程的build.gradle的  repositories {jcenter()}倉(cāng)庫(kù)當(dāng)中下載并依賴(lài)。或者引用本地的jar文件等。
    // 編譯libs目錄下的所有jar包
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:support-v4:21.0.2'
    compile 'com.etsy.android.grid:library:1.0.5'
    compile 'com.alexvasilkov:foldable-layout:1.0.1'
    // 編譯extras目錄下的ShimmerAndroid模塊
    compile project(':extras:ShimmerAndroid')
}
本地依賴(lài)

可能有些情況,你需要手動(dòng)下載jar包,或者你想創(chuàng)建自己的library,這樣你就可以復(fù)用在不同的項(xiàng)目,而不必將該library publish到公有或者私有庫(kù)。在上述情況下,可能你不需要網(wǎng)絡(luò)資源。下面將介紹一下如何是使用jar依賴(lài),以及如何導(dǎo)入so包,如何為項(xiàng)目添加依賴(lài)項(xiàng)目。
文件依賴(lài)
如果想為工程添加jar文件作為依賴(lài),可以這樣:

dependencies {
       compile files('libs/domoarigato.jar')
}

當(dāng)有很多這樣的jar包時(shí),可以改寫(xiě)為:

dependencies {
       compile fileTree('libs')
 }

默認(rèn)情況下,新建的Android項(xiàng)目會(huì)有一個(gè)lib文件夾,并且會(huì)在依賴(lài)中這么定義(即添加所有在libs文件夾中的jar):

dependencies {  
       compile fileTree(dir: 'libs', include: ['*.jar'])  
}  

這也意味著,在任何一個(gè)Android項(xiàng)目中,你都可以把一個(gè)jar文件放在到libs文件夾下,其會(huì)自動(dòng)的將其添加到編譯路徑以及最后的APK文件。
so包(native包)
用c或者c++寫(xiě)的library會(huì)被叫做so包,Android插件默認(rèn)情況下支持native包,你需要把.so文件放在對(duì)應(yīng)的文件夾中:

app  
   ├── AndroidManifest.xml  
   └── jniLibs  
       ├── armeabi  
       │   └── nativelib.so  
       ├── armeabi-v7a  
       │   └── nativelib.so  
       ├── mips  
       │   └── nativelib.so  
       └── x86  
           └── nativelib.so  

或者,依舊放在libs文件夾中,并且在app gradle設(shè)置所有代碼的源

gradle-wrapper.properties

gradle文件夾下的wrapper文件夾中有個(gè) gradle-wrapper.properties 文件:

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip

可以看到里面聲明了gradle的目錄與下載路徑以及當(dāng)前項(xiàng)目使用的gradle版本,這些默認(rèn)的路徑我們一般不會(huì)更改的,這個(gè)文件里指明的gradle版本不對(duì)也是很多導(dǎo)包不成功的原因之一。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,546評(píng)論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,570評(píng)論 3 418
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 176,505評(píng)論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,017評(píng)論 1 313
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,786評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,219評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,287評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,438評(píng)論 0 288
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,971評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,796評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,995評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,540評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,230評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,662評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,918評(píng)論 1 286
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,697評(píng)論 3 392
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,991評(píng)論 2 374

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,785評(píng)論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,898評(píng)論 6 342
  • 1.介紹 如果你正在查閱build.gradle文件的所有可選項(xiàng),請(qǐng)點(diǎn)擊這里進(jìn)行查閱:DSL參考 1.1新構(gòu)建系統(tǒng)...
    Chuckiefan閱讀 12,159評(píng)論 8 72
  • 轉(zhuǎn)載注明出處:http://www.lxweimin.com/p/5255b100930e 0. 前言 完全由個(gè)人翻...
    王三的貓阿德閱讀 2,537評(píng)論 0 4
  • 魔鬼提問(wèn)主題。私董會(huì)的覺(jué)察 私董會(huì)的最終目的是什么? 主持一場(chǎng)私董會(huì)的標(biāo)準(zhǔn)是什么? 如何評(píng)價(jià)一場(chǎng)私董會(huì)的好壞? 私...
    志堅(jiān)Ken閱讀 315評(píng)論 0 0