零散知識點(diǎn)總結(jié)(1) - Gradle 使用配置總結(jié)

一、統(tǒng)一管理依賴版本

1.1 在根目錄下邑商,新建config.gradle文件

ext {

    android = [
            compileSdkVersion: 23,
            buildToolsVersion: "23.0.3",
            applicationId: "com.example.lizejun.repogradle",
            minSdkVersion: 14,
            targetSdkVersion: 23,
            versionCode: 1,
            versionName: "1.0",
            testInstrumentationRunner: "android.support.test.runner.AndroidJUnitRunner"
    ]

    dependencies = [
            "support-v4"  : 'com.android.support:support-v4:23.2.0',
            "support-v7"  : 'com.android.support:appcompat-v7:23.2.0'
    ]

}

android用來管理SDK版本殃姓、版本號等,dependencies用來管理依賴庫的版本导街,它們都是一個(gè)數(shù)組披泪,用逗號來分割,數(shù)組的每個(gè)元素都是key:value的格式搬瑰。

1.2 在根目錄下的build.gradle款票,新增:

apply from: "config.gradle"

1.3 在根目錄下的各個(gè)Module或者Library中的build.gradle文件中,引用對應(yīng)的key

android {
    compileSdkVersion rootProject.ext.android.compileSdkVersion
    buildToolsVersion rootProject.ext.android.buildToolsVersion
    defaultConfig {
        applicationId rootProject.ext.android.applicationId
        minSdkVersion rootProject.ext.android.minSdkVersion
        targetSdkVersion rootProject.ext.android.targetSdkVersion
        versionCode rootProject.ext.android.versionCode
        versionName rootProject.ext.android.versionName
        testInstrumentationRunner rootProject.ext.android.testInstrumentationRunner
    }
}

dependencies {
    compile rootProject.ext.dependencies["support-v7"]
}

二泽论、查看依賴關(guān)系

2.1 工具查看

依賴樹的查看可以通過Android Studio的插件Gradle View來查看:

Gradle View.png

重啟之后艾少,點(diǎn)擊View -> Tool Windows -> Gradle View,之后會在最下方生成一個(gè)窗口翼悴,我們通過這個(gè)窗口就可以看到對應(yīng)項(xiàng)目的依賴關(guān)系:
Gradle View Result.png

2.2 命令查看

除此之外缚够,我們也可以使用以下的命令:

./gradlew -q app:dependencies

同樣可以獲得類似的結(jié)果:

命令.png

注意上圖,如果標(biāo)記了(*)鹦赎,那么表示這個(gè)依賴被忽略了谍椅,這是因?yàn)槠渌敿壱蕾囍幸惨蕾嚵诉@個(gè)傳遞的依賴,Gradle會自動分析下載最合適的依賴古话。

三毯辅、標(biāo)識符

由于多個(gè)頂級依賴當(dāng)中,可能包含了相同的子依賴煞额,但是它們的版本不同,這時(shí)候?yàn)榱诉x擇合適的版本,那么就需要使用一些必要的操作符來管理子依賴膊毁。

3.1 Transitive

默認(rèn)為true胀莹,表示gradle自動添加子依賴項(xiàng),形成一個(gè)多層樹形結(jié)構(gòu)婚温;設(shè)置為false描焰,則需要手動添加每個(gè)依賴項(xiàng)。

3.1.1 統(tǒng)一指定Transitive

configurations.all {
    transitive = false
}

dependencies {
    compile rootProject.ext.dependencies["support-v7"]
}

最終得到的結(jié)果是栅螟,可以看到前面的子依賴項(xiàng)都沒有了:


2017-02-09 15:27:38屏幕截圖.png

3.1.2 單獨(dú)指定Transitive

dependencies {
    compile ('com.android.support:appcompat-v7:23.2.0') {
        transitive = false
    }
}

3.2 Force

用來表示強(qiáng)制設(shè)置某個(gè)模塊的版本:

configurations.all {
    resolutionStrategy {
        force 'com.android.support:support-v4:23.1.0'
    }
}

之后打印荆秦,發(fā)現(xiàn)其依賴的包版本變成了23.1.0

Force.png

3.3 exclude

該標(biāo)識符用來設(shè)置不編譯指定的模塊

3.3.1 全局配置某個(gè)模塊

configurations {
    all *.exclude group : 'com.android.support', module: 'support-v4'
}

此時(shí)的依賴關(guān)系為:

2017-02-09 15:54:02屏幕截圖.png

當(dāng)然,exclude后的參數(shù)有groupmodule力图,可以分別單獨(dú)使用步绸,會排除所有匹配項(xiàng)。

3.3.2 單獨(dú)給某個(gè)模塊exclude

    compile ('com.android.support:appcompat-v7:23.2.0') {
        exclude group : 'com.android.support', module: 'support-v4'
    }

也會和上面獲得相同的結(jié)果

四吃媒、版本沖突

4.1 相同配置下的版本沖突

同一配置下瓤介,某個(gè)模塊的不同版本同時(shí)被依賴時(shí),默認(rèn)使用最新版赘那,Gradle同步時(shí)不會報(bào)錯(cuò)刑桑。

五、Gradle詳解

基本配置:AS中的Android項(xiàng)目通常至少包含兩個(gè)build.gradle募舟,一個(gè)是Project范圍的祠斧,另一個(gè)是Module范圍的,由于一個(gè)Project可以有多個(gè)Module拱礁,所以每個(gè)Module下都會對應(yīng)一個(gè)build.gradle琢锋。

5.1 Project下的build.gradle

// Top-level build file where you can add configuration options common to all sub-projects/modules.
apply from: "config.gradle"

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.3.1'
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}
  • buildscript下的repositoriesgradle腳本自身需要的資源,
  • allprojects下的repositories是項(xiàng)目所有模塊需要的資源觅彰。

5.2 模塊的build.gradle

//聲明插件,表明這是一個(gè)Android程序;如果是庫,那么應(yīng)當(dāng)是com.android.library
apply plugin: 'com.android.application'
//Android構(gòu)建過程需要配置的參數(shù)
android {
    //編譯版本
    compileSdkVersion rootProject.ext.android.compileSdkVersion
    //buildTool版本
    buildToolsVersion rootProject.ext.android.buildToolsVersion
    //默認(rèn)配置,同時(shí)應(yīng)用到debug和release版本上
    defaultConfig {
        applicationId rootProject.ext.android.applicationId
        minSdkVersion rootProject.ext.android.minSdkVersion
        targetSdkVersion rootProject.ext.android.targetSdkVersion
        versionCode rootProject.ext.android.versionCode
        versionName rootProject.ext.android.versionName
        testInstrumentationRunner rootProject.ext.android.testInstrumentationRunner
    }
    //配置debug和release版本的一些參數(shù),例如混淆,簽名配置等
    buildTypes {
        //release版本
        release {
            minifyEnabled false //是否開啟混淆
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' //混淆文件位置
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile rootProject.ext.dependencies["support-v7"]
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    testCompile 'junit:junit:4.12'
}

下面對Android構(gòu)建過程中需要配置的參數(shù)做一些解釋:

  • compileSdkVersion:告訴gradle用那個(gè)Android SDK的版本編譯你的應(yīng)用吩蔑,修改它不會改變運(yùn)行時(shí)的行為,因?yàn)樗粫话M(jìn)入最終的APK中填抬;因此烛芬,推薦使用最新的SDK編譯;如果使用Suppport Library飒责,那么compileSdkVersion必須要大于等于它的大版本號赘娄。
  • minSdkVersion:應(yīng)用最低可運(yùn)行的要求;它必須要大于等于你所依賴的庫的minSdkVersion宏蛉;
  • targetSdkVersionAndroid提供向前兼容的重要依據(jù)遣臼。(targetSdkVersion is the main way Android provides forward compatibility
    因?yàn)殡S著Android系統(tǒng)的升級,某個(gè)api或者模塊的行為有可能發(fā)生改變拾并,但是為了保證老APK的行為和以前兼容揍堰,只要APKtargetSdkVersion不變鹏浅,那么即使這個(gè)APK安裝在新的Android系統(tǒng)上,那么行為還是保持老的系統(tǒng)上的行為屏歹。
    系統(tǒng)在調(diào)用某個(gè)api或者模塊的時(shí)候隐砸,會先檢查調(diào)用的APKtargetSdkVersion,來決定執(zhí)行什么行為蝙眶。

minSdkVersiontargetSdkVersion最終會被包含進(jìn)入最終的APK文件中季希,如果你查看生成的AndroidManifest.xml,那么會發(fā)現(xiàn):

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

所以幽纷,我們一般遵循的規(guī)則是:

minSdkVersion (lowest possible) <= targetSdkVersion == compileSdkVersion (latest SDK)

5.3 gradle相關(guān)文件

  • gradle.properties
    配置文件式塌,可以定義一些常量供build.gradle使用,比如可以配置簽名相關(guān)信息友浸,例如keystore位置峰尝、密碼、keyalias等尾菇。
  • settings.gradle
    用來配置多模塊的境析,如果你的項(xiàng)目有兩個(gè)模塊BrowserScannerSDK,那么就需要:
include ':Browser'
include ':ScannerSDK'
project(':ScannerSDK').projectDir = new File(settingsDir, './ScannerSDK/')
  • gradle文件夾
    里面有兩個(gè)文件派诬,gradle-wrapper.jargradle-wrapper.properties劳淆,后者當(dāng)中指定了gradle的版本。
distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
  • gradlewgradlew.bat
    分別是Linuxwindows下的批處理文件默赂,它們的作用是根據(jù)gradle-wrapper.properties文件中的distributionUrl下載對應(yīng)的gradle版本沛鸵,這樣即使環(huán)境沒有安裝gradle也可以編譯。

5.4 gradle倉庫

gradle有三種倉庫:maven/ivy/flat本地缆八。

maven{
    url  "..."
}
ivy{
    url  "..."
}
flatDir{
    dirs 'xxx'
}

有些倉庫取了別名:

repositories{
    mavenCentral()
    jcenter()
    mavenLocal()
}

5.5 gradle任務(wù)

通過以下指令曲掰,可以看到支持的任務(wù):

./gradlew tasks

Task1.png

Task2.png

六、常見問題

6.1 導(dǎo)入本地Jar

導(dǎo)入單個(gè)jar文件:

compile files('libs/xxx.jar')

導(dǎo)入libs的多個(gè)jar文件:

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

6.2 導(dǎo)入maven

compile 'groupId:artifactId:version'

6.3 導(dǎo)入Project

在導(dǎo)入之前奈辰,需要在settings.gradle中把模塊包含進(jìn)來栏妖,例如前面的ScannerSDK模塊:

compile project(':ScannerSDK')

6.4 聲明第三方maven

如果項(xiàng)目中需要的一些庫文件不再中央倉庫中,而是在某個(gè)特定地址里奖恰,那么就需要在Project中的build.gradle中的allprojects結(jié)點(diǎn)下或者直接配到某個(gè)模塊中:

allprojects {
    repositories {
        maven {
            url '地址'
        }
    }
}

6.5 依賴第三方aar

compile 'com.aaa.xxx:core:1.0.1@aar'

6.6 將庫導(dǎo)出為aar

首先吊趾,你的項(xiàng)目必須是一個(gè)庫項(xiàng)目,之后在build.gradle中進(jìn)行配置:

apply plugin : 'com.android.library'

之后瑟啃,進(jìn)入到該項(xiàng)目中论泛,執(zhí)行gradle命令:

./gradlew assembleRelease

生成的aar放在/build/output/aar文件當(dāng)中

6.7 引用本地aar

首先,將aar文件拷貝到對應(yīng)目錄下蛹屿,然后在該模塊的build.gradle中聲明flat倉庫:

repositories{
   flatDir{
      dirs '以build.gradle為根目錄的相對路徑'
   }
}

之后屁奏,在dependencies結(jié)點(diǎn)下依賴該aar模塊:

dependencies{
    compile (name:'xxx',ext:'aar')
}

七、多版本打包

在此之前错负,我們先了解幾個(gè)基本的概念:

  • buildTypes構(gòu)建類型坟瓢,Android StudioGradle組件默認(rèn)提供了debugrelease兩個(gè)默認(rèn)配置勇边,這里主要用于是否需要混淆,是否調(diào)試折联。
  • productFlavors產(chǎn)品渠道粥诫,在實(shí)際發(fā)布中,根據(jù)不同渠道崭庸,可能需要使用不同的包名,甚至是不同的代碼谊囚。
  • buildVaiants:每個(gè)buildTypesproductFlavors組成一個(gè)buildvariant怕享。

以上我們討論的buildTypesproductFlavors可以通過每個(gè)Module中的build.gradleandroid標(biāo)簽來配置。

下面镰踏,我們先看一下不同的productFlavors函筋,分別用來支持讀取不同的文件和替換不同的字符串。

7.1 引用不同的代碼

我們首先在app/src目錄下新建兩個(gè)目錄奠伪,分別對應(yīng)兩個(gè)Flavor跌帐,再在其中建立相同名字的文件Constant.java,對里面的某個(gè)常量賦予不同的值绊率。

Flavor.png

  • constantFlavor1
package com.example.lizejun.repogradle;

public class Constant {
    public static final String NAME = "flavor1";
}
  • constantFlavor2
package com.example.lizejun.repogradle;

public class Constant {
    public static final String NAME = "flavor2";
}

我們的app下的build.gradle中的android標(biāo)簽下添加如下幾行代碼谨敛,讓兩個(gè)Flavor分別引用不同的Constant文件:

    sourceSets {
        constantFlavor1 {
            java.srcDirs =  ['src/constantFlavor1', 'src/constantFlavor1/java', 'src/constantFlavor1/java/']
        }
        constantFlavor2 {
            java.srcDirs =  ['src/constantFlavor2', 'src/constantFlavor2/java', 'src/constantFlavor2/java/']
        }
    }

    productFlavors {
        constantFlavor1 {}
        constantFlavor2 {}
    }

之后我們進(jìn)行打包,可以得到以下不同安裝包滤否,這兩個(gè)apk如果在其中引用的了NAME脸狸,那么它會得到不同的值:

2017-02-10 16:15:51屏幕截圖.png

7.2 自定義buildConfig

如果我們只需要定義一些簡單的值,那么我們可以用buildConfig類:

    productFlavors {
        constantFlavor1 {
            buildConfigField "boolean", "BOOLEAN_VALUE", "true"
        }
        constantFlavor2 {
            buildConfigField "boolean", "BOOLEAN_VALUE", "false"
        }
    }

7.3 占位符

    productFlavors {
        constantFlavor1 {
            buildConfigField "boolean", "BOOLEAN_VALUE", "true"
            manifestPlaceholders = [label:"constantFlavor1"]
        }
        constantFlavor2 {
            buildConfigField "boolean", "BOOLEAN_VALUE", "false"
            manifestPlaceholders = [label:"constantFlavor2"]
        }
    }

之后藐俺,我們再在AndroidManifest.xml中引用它:

android:label="${label}"

7.4 簽名配置

首先是在android標(biāo)簽下炊甲,我們使用signingConfigs來配置不同的簽名類型

    signingConfigs {
        eng {
            keyAlias 'androiddebugkey'
            keyPassword 'android'
            storeFile file('debug.keystore')
            storePassword 'android'
        }
        prd {
            keyAlias 'androiddebugkey'
            keyPassword 'android'
            storeFile file('debug.keystore')
            storePassword 'android'
        }
    }

之后,再在buildTypes的各個(gè)分支中引用對應(yīng)的簽名配置:

    buildTypes {
        debug {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.eng
        }
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.prd
        }
    }

7.5 依賴

有時(shí)候欲芹,我們需要在不同的buildTypes下卿啡,引用不同的依賴,例如內(nèi)存泄露的檢測工具菱父,我們希望在debug版本時(shí)檢查內(nèi)存泄露颈娜,并在發(fā)生時(shí)在桌面上生成圖標(biāo),但是在release版本上我們并不希望這么做滞伟,這時(shí)候我們可以這么寫:

debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'

這樣揭鳞,release版本就不會在桌面生成內(nèi)存泄露的圖標(biāo)。


更多文章梆奈,歡迎訪問我的 Android 知識梳理系列:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末野崇,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子亩钟,更是在濱河造成了極大的恐慌乓梨,老刑警劉巖鳖轰,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異扶镀,居然都是意外死亡蕴侣,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門臭觉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來昆雀,“玉大人,你說我怎么就攤上這事蝠筑∧欤” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵什乙,是天一觀的道長挽封。 經(jīng)常有香客問我,道長臣镣,這世上最難降的妖魔是什么辅愿? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮忆某,結(jié)果婚禮上点待,老公的妹妹穿的比我還像新娘。我一直安慰自己褒繁,他們只是感情好亦鳞,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著棒坏,像睡著了一般燕差。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上坝冕,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天徒探,我揣著相機(jī)與錄音,去河邊找鬼喂窟。 笑死测暗,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的磨澡。 我是一名探鬼主播碗啄,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼稳摄!你這毒婦竟也來了稚字?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎胆描,沒想到半個(gè)月后瘫想,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡昌讲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年国夜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片短绸。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡车吹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出醋闭,到底是詐尸還是另有隱情礼搁,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布目尖,位于F島的核電站,受9級特大地震影響扎运,放射性物質(zhì)發(fā)生泄漏瑟曲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一豪治、第九天 我趴在偏房一處隱蔽的房頂上張望洞拨。 院中可真熱鬧,春花似錦负拟、人聲如沸烦衣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽花吟。三九已至,卻和暖如春厨姚,著一層夾襖步出監(jiān)牢的瞬間衅澈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工谬墙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留今布,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓拭抬,卻偏偏與公主長得像部默,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子造虎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345

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