你所應該知道的gradle知識都在這里(1)

心愈靜,夜愈靜

分享一篇整理的gradle的相關知識,部分結構略有混亂,但不影響閱讀。

gradle是一個構建工具,具備編譯、運行、簽名、打包,依賴管理等功能的獨立工具
最初是用來支持java的,為了能在AS上使用,專門有了個插件叫Android Gradle Plugin

AS中項目的根目錄下有個build.gradle文件,其中有
classpath 'com.android.tools.build:gradle:2.1.2'
就是用來依賴gradle插件的代碼,
ps:最后的版本號不是gradle的版本,而是google定義的

gradle下的project和tasks

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

構建生命周期

一旦一個tasks被執行,那么它不會再次執行了,不包含依賴的Tasks總是優先執行,一次構建將會經歷下列三個階段:

初始化階段:project實例在這兒創建,如果有多個模塊,即有多個build.gradle文件,多個project將會被創建。

配置階段:在該階段,build.gradle腳本將會執行,為每個project創建和配置所有的tasks。

執行階段:這一階段,gradle會決定哪一個tasks會被執行,哪一個tasks會被執行完全依賴開始構建時傳入的參數和當前所在的文件夾位置有關。

項目結構

gradle使用了一個叫做source set的概念,一個source set就是一系列資源文件,其將會被編譯和執行,對于Android項目,main就是一個source set
而如果要寫測試用例的話,需要另外開一個source set,叫做androidTest,這樣才可以單獨編譯和執行測試用例。

module下的build.gradle

 apply plugin: 'com.android.application'
   android {
           compileSdkVersion 22
           buildToolsVersion "22.0.1"
           defaultConfig {
               applicationId "com.gradleforandroid.gettingstarted"
               minSdkVersion 14
               targetSdkVersion 22
               versionCode 1
               versionName "1.0"
           }
           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:22.2.0'
     }

全局配置

1.在項目的根目錄下創建config.gradle文件

ext {
    android = [
        compileSdkVersion: 23,
        buildToolsVersion: "23.0.2",
        minSdkVersion: 14,
        targetSdkVersion : 22,
       ]
    dependencies = [
            appcompatV7': 'com.android.support:appcompat-v7:23.2.1',
        design  : 'com.android.support:design:23.2.1'
    ]
}

2.在工程的build.gradle下

//引用配置文件
`apply from:"config.gradle"`

3.app下的build.gradle使用

android {
    compileSdkVersion rootProject.ext.android.compileSdkVersion
    buildToolsVersion rootProject.ext.buildToolsVersion
    defaultConfig {
        applicationId "com.wuxiaolong.gradle4android"
        minSdkVersion rootProject.ext.android.minSdkVersion
        targetSdkVersion rootProject.ext.android.targetSdkVersion
        versionCode 1
        versionName "1.0"
    }


dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile rootProject.ext.dependencies.appcompatV7
    compile rootProject.ext.dependencies.design
}

Gradle Wrapper

Gradle Wrapper是一個管理gradle的包裝,作用是給不同的項目分配不同的gradle
這樣的所有的項目才能都正常運行。

每一個gradle wrapper對于一個可執行的腳本,windows下是bat,mac下是shell
在你的項目啟動的時候,對應的腳本程序就會啟動,去下載相應的gradle版本,
而下載好的gradle會存放在對于的配置文件properties中,如下圖

  myapp/
   ├── gradlew
   ├── gradlew.bat
   └── gradle/wrapper/
       ├── gradle-wrapper.jar
       └── gradle-wrapper.properties

gradle常用命令

gradlew -v 查看當前項目所用的gradle版本

gradlew clean 清楚app目錄下的build文件夾

gradlew build 檢查依賴并編譯打包 (正式和測試)

gradlew assembleDebug 編譯并打Debug包

gradlew assembleRelease 編譯并打Release包

gradle tasks 列出所有的tasks(可執行任務)

gradlew androidDependencies 列出所有的依賴文件

Android下的gradle

Android studio會在我們創建工程的時候,幫我們生成三個gradle文件,
兩個build.gradle,一個setting.gradle文件

setting.gradle

include ':app'

setting.gradle一般的形式是這樣的,這表示你的工程只包括一個app模塊,這個gradle文件在會初始化時期執行,生成對應的project,而這個project會根據對應的build.gradle文件下生成一系列的tasks。
這些tasks才是具體執行的代碼。

setting.gradle 主要是針對多模塊操作的,單模塊的攻城,setting.gradle沒有多大用處。

根目錄下的build.gradle

該gradle文件是定義工程下模塊的公共屬性的,默認配置

buildscript {
    //定義依賴包的來源
     repositories {
         jcenter() 
     }
    //定義構建過程所需要依賴的插件
    //比如在使用dagger2的時候,就需要在這里另外加入一個apt插件
      dependencies {
          classpath 'com.android.tools.build:gradle:1.2.3'
      }
}

//定義各模塊的屬性,你可以加入任意的tasks,也就是說這個build.gradle文件,allprojects下才是主要可以操作的地方
allprojects {
     repositories {
          jcenter() 
     }
}

模塊內的build.gradle

模塊內的gradle文件只對該模塊起作用,而且會重寫來自于根目錄下gradle傳過來的屬性。
默認構造

//google團隊所寫的插件,提供關于Android應用和依賴庫的構建,打包和測試
apply plugin: 'com.android.application'
 
   android {
       compileSdkVersion 22
       buildToolsVersion "22.0.1"
       defaultConfig {
           applicationId "com.gradleforandroid.gettingstarted"
           minSdkVersion 14
           targetSdkVersion 22
           versionCode 1
           versionName "1.0"
       }
       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:22.2.0'
     }

Android下
必須的屬性為compileSdkVersion和buildToolsVersion

compileSdkVersion:編譯該app時候,你想使用到的api版本。
buildToolsVersion:構建工具的版本號。

構建工具包含了很多實用的命令行命令,例如aapt,zipalign,dx等,這些命令能夠被用來產生多種多樣的應用程序。你可以通過sdk manager來下載這些構建工具。

defaultConfig方法包含了該app的核心屬性,該屬性會覆寫在AndroidManifest.xml中的對應屬性。

defaultConfig {
   //將會覆寫AndroidMainifest文件下的packagename,但是作用不完全相同,packagename作為包名和R文件的包名,applicationId被用做唯一標識在不同的設備和各大應用市場上。
   applicationId "com.gradleforandroid.gettingstarted"
   minSdkVersion 14
   targetSdkVersion 22
    //版本標識
   versionCode 1
    //沒什么作用,一般內部標識
   versionName "1.0"
}

依賴管理

gradle的依賴管理功能非常實用,只需要一行代碼,gradle就會幫你在遠程倉庫拉取需要的jar包。

倉庫
這里的倉庫通常指的是遠程倉庫,比如Jcenter,Maven等。
倉庫相當于一個jar文件的集合體,你只要定義好需要什么jar文件,gradle工具就會幫你從你制定的倉庫里拉取jar文件。
jar文件會在你執行build構建的時候從遠程倉庫拉取,并且會在本地保留緩存,所以一個版本的依賴包只需要下載一次。

定義一個依賴通常需要三個元素
group:創建該library的組織名,通常也會是包名,
name :是該library的唯一標識
version:該library的版本號

常規寫法

dependencies {
   compile 'com.google.code.gson:gson:2.3'
   compile 'com.squareup.retrofit:retrofit:1.9.0'
}

完成的寫法

dependencies {
  compile group: 'com.google.code.gson', name: 'gson', version:'2.3'
  compile group: 'com.squareup.retrofit', name: 'retrofit'
       version: '1.9.0'
 }

當然還有一些類庫不在maven或者jcenter中,
這個時候你可以這么定義,將url寫在maven中

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

本地依賴

添加jar文件作為依賴

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

libs目錄下的所有jar包

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

native包(c/c++寫的library會被叫做so包)

app根目錄下創建一個jniLibs目錄,
dependencies {
compile fileTree(dir: 'jniLibs', include: ['*.so'])
}

arr文件(包含資源文件的依賴包)

將app下build.gradle的配置改為

apply plugin: 'com.android.library'
//刪除
applicationId "com.***"

編譯通過之后會在build/outputs/aar文件下生產aar包

使用方式,
aar文件也是屬于jar包,所以也可以放入到libs目錄下,
接著在build.gradle中android方法下

repositories {  
    flatDir {  
    dirs 'libs'  
} 

在dependencies方法下

compile(name:'libraryname', ext:'aar')  

這表示在libs目錄下,有個叫libraryname,后綴是aar的文件

依賴的形式

 compile 'com.google.code.gson:gson:2.3'

這是我們正常情況下使用的方法,
complie:包含所有的依賴包,debug模式下和release模式下都會依賴
其他的還有

provided:意思是提供debug支持,但是不會寫入release。
testCompile和androidTestCompile:主要針對測試使用

另外還有
debugCompile和releaseProvided方式可以配置

在不同的情況下需要配置不同的依賴方式

本人也只是Android開發路上一只稍大一點的菜鳥,如果各位讀者中發現文章中有誤之處,請幫忙指出,你的批評和鼓勵都是我前進的動力。

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

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,785評論 18 139
  • 參考資料:http://gold.xitu.io/post/580c85768ac247005b5472f9htt...
    zhaoyubetter閱讀 11,020評論 0 6
  • 轉載注明出處:http://www.lxweimin.com/p/5255b100930e 0. 前言 完全由個人翻...
    王三的貓阿德閱讀 2,538評論 0 4
  • 1.介紹 如果你正在查閱build.gradle文件的所有可選項,請點擊這里進行查閱:DSL參考 1.1新構建系統...
    Chuckiefan閱讀 12,159評論 8 72
  • 或是那遙遠的路, 隔斷了我的思念, 又或許是連陰的天, 讓我們看不見天上的月。 我要看到前方, 前方有霧, 我要回...
    冷漠清風不識月閱讀 120評論 0 0