build.gradle文件使用

導(dǎo)讀
<a name="label">1、初識(shí)build.gradle</a>
<a name="label">2、使用build.gradle文件</a>
<a name="label">3、settings.gradle文件</a>
(ps:由于Markdown在簡(jiǎn)書(shū)里對(duì)錨點(diǎn)的支持效果不是很好,就沒(méi)設(shè)置跳轉(zhuǎn))

一、初識(shí)build.gradle

在一個(gè)標(biāo)準(zhǔn)的AS工程中,最少都會(huì)有兩個(gè)build.gradle文件,其一在項(xiàng)目的根目錄,而另一個(gè)在module的根目錄里面。如下圖:

build.gradle文件

我們先來(lái)理了解下兩個(gè)build.gradle文件的區(qū)別?

AS的工程結(jié)構(gòu)其實(shí)可以理解為就是由module組成,但是只運(yùn)行有一個(gè)主module作為我們實(shí)際運(yùn)行的項(xiàng)目,其他module都是以依賴module形式存在,如上圖中所示:就僅有module——app,并且是我們當(dāng)前Demo的主module。AS中,每一個(gè)module都必須會(huì)有一個(gè)屬于自己的build.gradle文件<br />
主module:有個(gè)手機(jī)圖片標(biāo)識(shí)<br />
依賴module:有個(gè)類似列表柱狀圖片標(biāo)識(shí)<br >


主module和依賴module

了解了module后,回到我們問(wèn)題,其實(shí)就很好理解兩個(gè)build.gradle文件的區(qū)別了<br />

工程根目錄的build.gradle文件

項(xiàng)目構(gòu)建時(shí),會(huì)先找到該文件執(zhí)行構(gòu)建,里面的配置對(duì)整個(gè)工程全局有效,我們可以在這里做些全局性的配置,在創(chuàng)建一個(gè)新AS工程時(shí),會(huì)默認(rèn)創(chuàng)建該文件,并且添加相關(guān)默認(rèn)配置,如:gralde插件,jcenter倉(cāng)庫(kù),maven倉(cāng)庫(kù)。當(dāng)然也可以在這里自定義一些全局的設(shè)置,后面我們會(huì)提到<br >

module的build.gradle文件

構(gòu)建具體到每一個(gè)module時(shí),會(huì)執(zhí)行該文件,里面的配置僅對(duì)當(dāng)前module生效。在創(chuàng)建一個(gè)新module時(shí),也會(huì)默認(rèn)創(chuàng)建該文件,并且添加相關(guān)默認(rèn)配置,如我們Demo中主module app的build.gradle文件:

apply plugin: 'com.android.application'//聲明主module,com.android.application

android {//android工程配置
compileSdkVersion 25  //編譯sdk版本號(hào)
buildToolsVersion "25.0.2"http://編譯工具版本
defaultConfig {//工程默認(rèn)配置
    applicationId "com.example.myapplication"http://程序運(yùn)行時(shí)真正的包名,可以與java中包名不同
    minSdkVersion 15//最小sdk版本號(hào)
    targetSdkVersion 25//目標(biāo)sdk版本號(hào)
    versionCode 1//應(yīng)用程序的版本號(hào),以這里修改為準(zhǔn),manifest文件中配置無(wú)效
    versionName "1.0"http://應(yīng)用程序的版本名,以這里修改為準(zhǔn),manifest文件中配置無(wú)效

}
buildTypes {//運(yùn)行方式配置,可以配置debug,release或者其他自定義
    release {//release運(yùn)行方式執(zhí)行的配置
        minifyEnabled false //混淆開(kāi)關(guān)
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//混淆文件
    }
}
}

dependencies {//依賴配置
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
    exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.2.0'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12'
}

二、使用build.gradle文件

清楚了兩種build.gradle文件的區(qū)別后,那么我們就可以進(jìn)行些我們自定義的配置了;假想下這么一種場(chǎng)景,自己的工程如果有好幾個(gè)module,而每一個(gè)module都會(huì)有自己的build.gradle文件,因?yàn)槭莂ndroid工程,所以都會(huì)存在compileSdkVersion 、buildToolsVersion等一些默認(rèn)配置,有時(shí)候自己項(xiàng)目中明明是配置ok了,而且一直編譯沒(méi)有問(wèn)題,或許突然某一天,其他同時(shí)把他自己環(huán)境的一些配置提交上來(lái)了,那么可能就會(huì)出現(xiàn)原來(lái)好好的可以跑,突然就報(bào)錯(cuò)勒,當(dāng)然這解決起來(lái)也非常簡(jiǎn)單,會(huì)說(shuō)了,我把他改回來(lái)不就好了。但是我們能不能通過(guò)一些簡(jiǎn)單配置,這種問(wèn)題盡可能的減少出現(xiàn)呢?<br />

1.使用根目錄build.gradle文件,配置共有的屬性

build.gradle文件代碼,ext里面就是我們自定義的一些配置

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

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

ext {
compileSdkVersion=25
buildToolsVersion="25.0.2"
minSdkVersion=14
targetSdkVersion=25
versionCode=1
versionName="1.0"
}

allprojects {
repositories {
    jcenter()
}
}

task clean(type: Delete) {
delete rootProject.buildDir
}

使用代碼:

compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion 

defaultConfig {
    applicationId "com.example.myapplication"
    minSdkVersion rootProject.ext.minSdkVersion
    targetSdkVersion rootProject.ext.targetSdkVersion
    versionCode rootProject.ext.versionCode
    versionName rootProject.ext.versionName
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}

2.自動(dòng)使用簽名配置

在主module的build.gradle文件的android區(qū)域里面添加如下代碼,下面配置中,debug和release都配置了同一簽名

    signingConfigs {

    debugConfig {
        keyAlias 'debug'
        keyPassword '123456'
        storeFile file('/debug.keystore')
        storePassword '123456'
    }
    releaseConfig {
        keyAlias 'debug'
        keyPassword '123456'
        storeFile file('/debug.keystore')
        storePassword '123456'
    }
}

3.快速區(qū)分調(diào)試環(huán)境和生產(chǎn)環(huán)境

上面僅僅配置好了簽名信息,運(yùn)行起來(lái)實(shí)際上仍然是沒(méi)效果的,這是因?yàn)槲覀冞€需要在運(yùn)行類型配置上進(jìn)行添加相關(guān)配置才能生效,同樣的也是在主module的build.gradle文件中進(jìn)行添加代碼,添加區(qū)域在buildTypes里面

buildTypes {
    //調(diào)試環(huán)境
    debug {
        buildConfigField "boolean", "isDebug", "true"http://debug標(biāo)識(shí),方便項(xiàng)目里面一些只在debug模式下生效代碼做區(qū)分標(biāo)識(shí)
        buildConfigField "String", "HOST", '"https://www.baidu.com/"'//項(xiàng)目里面,測(cè)試服務(wù)器地址
        resValue "string", "app_name", "**測(cè)試版"http://配置了該屬性,需要在values中strings.xml里面把a(bǔ)pp_name刪掉,否則編譯會(huì)報(bào)錯(cuò),測(cè)試版本的APK名字,以區(qū)分正式測(cè)試不同版本

        //混淆
        minifyEnabled false

        //前一部分代表系統(tǒng)默認(rèn)的android程序的混淆文件,該文件已經(jīng)包含了基本的混淆聲明,后一個(gè)文件是自己的定義混淆文件
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

        signingConfig signingConfigs.debugConfig//使用上面簽名配置中的debugConfig配置

        applicationIdSuffix'.debug'//區(qū)分debug版本的包名,會(huì)自動(dòng)在正式包名后面帶上.debug,方便測(cè)試服務(wù)器版本和正式服務(wù)器版本APK同時(shí)安裝
    }
    //發(fā)布環(huán)境
    release {
        buildConfigField "boolean", "isDebug", "true"
        buildConfigField "String", "HOST", '"http://www.itdecent.cn/"'//項(xiàng)目里面,正式服務(wù)器地址
        resValue "string", "app_name", "*****"http://配置了該屬性,需要在values中strings.xml里面把a(bǔ)pp_name刪掉,否則編譯會(huì)報(bào)錯(cuò),正式版本的APK名字,以區(qū)分正式測(cè)試不同版本

        //混淆
        minifyEnabled true

        //前一部分代表系統(tǒng)默認(rèn)的android程序的混淆文件,該文件已經(jīng)包含了基本的混淆聲明,后一個(gè)文件是自己的定義混淆文件
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//混淆配置文件
        signingConfig signingConfigs.releaseConfig//使用上面簽名配置中的releaseConfig配置
    }
}
app_name的特殊處理

當(dāng)我們配置了app_name時(shí),需要去values中找到strings.xml文件,把里面的app_name刪除掉,否則編譯項(xiàng)目會(huì)報(bào)如下錯(cuò)誤,解決方案就是刪除strings.xml里面的app_name后重新構(gòu)建下就好了


有些配置我們?cè)撊绾卧陧?xiàng)目代碼中使用呢?<br />

比如測(cè)試正式服務(wù)器地址,debug標(biāo)識(shí)狀態(tài),我們?cè)撊绾问褂媚亍J紫热魏我粋€(gè)build.gradle修改了,都要重新構(gòu)建下才能生效。構(gòu)建完成后,我們就可以直接通過(guò)BuildConfig.配置的屬性名,進(jìn)行使用了,例如上述中的HOST:BuildConfig.HOST就可以取出我們上邊配置的url勒。<br />

配置了兩個(gè),具體什么時(shí)候取哪個(gè)呢?

這個(gè)具體取決于你運(yùn)行程序時(shí)AS里Build Variant設(shè)置了,點(diǎn)開(kāi)該設(shè)置,找到我們的主module,根據(jù)下圖我們可以看到默認(rèn)是debug配置,此時(shí)我們?nèi)绻枰褂胷elease的配置時(shí),只需要在此處進(jìn)行切換就好了


4.自動(dòng)按規(guī)范更改打包命名

在主module的build.gradle文件里,添加區(qū)域?yàn)閍ndroid{}

  applicationVariants.all { variant ->

    variant.outputs.each { output ->

        output.outputFile = new File(

                output.outputFile.parent,

                "demo-${variant.buildType.name}-${defaultConfig.versionName}.apk")//打包的命名為:demo-debug-1.0.apk(debug配置下)
                                                                                    //        demo-release-1.0.apk(release配置下)

    }

}

三、settings.gradle文件

這個(gè)文件里面所配置的是我們項(xiàng)目module信息,如果新導(dǎo)入進(jìn)來(lái)的module無(wú)法進(jìn)行添加依賴,那么需要檢查一下,在該文件中是否有添加該module,添加語(yǔ)法:

include ':app'//當(dāng)前Demo因?yàn)橹挥幸粋€(gè)app主module,所以就在打開(kāi)該文件只能看到這一條配置,如果需要添加其他module,直接把a(bǔ)pp替換成module名即可
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,733評(píng)論 25 709
  • 轉(zhuǎn)載注明出處:http://www.itdecent.cn/p/5255b100930e 0. 前言 完全由個(gè)人翻...
    王三的貓阿德閱讀 2,730評(píng)論 0 4
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,253評(píng)論 6 342
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評(píng)論 19 139
  • 這是第一次讀哈耶克,但相信不會(huì)是最后一次。哈耶克著作等身,直接選擇讀《致命的自負(fù)》可能不是一個(gè)好的選擇,沒(méi)有...
    kelinda閱讀 346評(píng)論 0 4

友情鏈接更多精彩內(nèi)容