史上最全的Android build.gradle配置教程
前言
Android Studio是采用gradle來(lái)構(gòu)建項(xiàng)目的,gradle是基于groovy語(yǔ)言的,如果只是用它構(gòu)建普通Android項(xiàng)目的話,是可以不去學(xué)groovy的。當(dāng)我們創(chuàng)建一個(gè)Android項(xiàng)目時(shí)會(huì)包含兩個(gè)Android build.gradle配置詳解文件,如下圖:
一、Project的build.gradle文件:
對(duì)應(yīng)的build.gradle代碼如下:
// Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript {//這里是gradle腳本執(zhí)行所需依賴,分別是對(duì)應(yīng)的maven庫(kù)和插件 repositories { google()//從Android Studio3.0后新增了google()配置,可以引用google上的開(kāi)源項(xiàng)目 jcenter()//是一個(gè)類似于github的代碼托管倉(cāng)庫(kù),聲明了jcenter()配置,可以輕松引用 jcenter上的開(kāi)源項(xiàng)目 } dependencies { classpath 'com.android.tools.build:gradle:3.0.0'////此處是android的插件gradle,gradle是一個(gè)強(qiáng)大的項(xiàng)目構(gòu)建工具 // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects {//這里是項(xiàng)目本身需要的依賴,比如項(xiàng)目所需的maven庫(kù) repositories { google() jcenter() } } // 運(yùn)行g(shù)radle clean時(shí),執(zhí)行此處定義的task任務(wù)。 // 該任務(wù)繼承自Delete,刪除根目錄中的build目錄。 // 相當(dāng)于執(zhí)行Delete.delete(rootProject.buildDir)。 // gradle使用groovy語(yǔ)言,調(diào)用method時(shí)可以不用加()。 task clean(type: Delete) { delete rootProject.buildDir }
- buildscript{}閉包里是gradle腳本執(zhí)行所需依賴,分別是對(duì)應(yīng)的maven庫(kù)和插件。
- allprojects{}閉包里是項(xiàng)目本身需要的依賴,比如項(xiàng)目所需的maven庫(kù)。
- task clean(type: Delete){}是運(yùn)行g(shù)radle clean時(shí),執(zhí)行此處定義的task任務(wù),該任務(wù)繼承自Delete,刪除根目錄中的build目錄。其中buildscript包含repositories閉包和dependencies閉包。
repositories{}閉包:配置遠(yuǎn)程倉(cāng)庫(kù)
該閉包中聲明了jcenter()和google()的配置,其中jcenter是一個(gè)代碼托管倉(cāng)庫(kù),上面托管了很多Android開(kāi)源項(xiàng)目,在這里配置了jcenter后我們可以在項(xiàng)目中方便引用jcenter上的開(kāi)源項(xiàng)目,從Android Studio3.0后新增了google()配置,可以引用google上的開(kāi)源項(xiàng)目。
dependencies{}閉包:配置構(gòu)建工具
該閉包使用classpath聲明了一個(gè)Gradle插件,由于Gradle并不只是用來(lái)構(gòu)建Android項(xiàng)目,因此此處引入相關(guān)插件來(lái)構(gòu)建Android項(xiàng)目,其中'3.3.3'為該插件的版本號(hào),可以根據(jù)最新的版本號(hào)來(lái)調(diào)整。
二、Module的build.gradle文件:
從文件內(nèi)容可以看出,主要分為三大部分,如下圖所示:
1、apply plugin:
// 聲明是Android程序, //com.android.application 表示這是一個(gè)應(yīng)用程序模塊 //com.android.library 標(biāo)識(shí)這是一個(gè)庫(kù)模塊 //而這區(qū)別:前者可以直接運(yùn)行,后著是依附別的應(yīng)用程序運(yùn)行 apply plugin: 'com.android.application'
文件中第一行使用apply plugin表示應(yīng)用了一個(gè)插件,該插件一般有兩種值可選:
- 'com.android.application',表示該模塊為應(yīng)用程序模塊,可以直接運(yùn)行,打包得到的是.apk文件
- 'com.android.library',表示該模塊為庫(kù)模塊,只能作為代碼庫(kù)依附于別的應(yīng)用程序模塊來(lái)運(yùn)行,打包得到的是.aar文件
2、android{}閉包:
這個(gè)閉包主要為了配置項(xiàng)目構(gòu)建的各種屬性:
2.1、添加signingConfigs{}閉包:
signingConfigs {// 自動(dòng)化打包配置 release {// 線上環(huán)境 keyAlias 'test' keyPassword '123456' storeFile file('test.keystore') storePassword '123456' } debug {// 開(kāi)發(fā)環(huán)境 keyAlias 'test' keyPassword '123456' storeFile file('test.keystore') storePassword '123456' } }
可以手動(dòng)添加簽名配置,也可以通過(guò)Project Structure 選中app,點(diǎn)擊Singing添加,具體步驟如下圖所示:
配置Singing.png
簽名配置完成后可以方便帶簽名打包,在module的Build Variants中有兩個(gè)Type,分別是debug和release,可以選擇任意一個(gè)類型進(jìn)行打包,并且他們會(huì)利用各自配置的Key進(jìn)行打包,執(zhí)行 Run app或者Build->Build apk就會(huì)自動(dòng)在module name/app/build/outputs/apk路徑下生成Apk文件。另一種打包方式是Build->Generate Signed APK填寫簽名信息生成Apk。
2.2、compileSdkVersion:設(shè)置編譯時(shí)用的Android版本
2.3、buildToolsVersion:設(shè)置編譯時(shí)使用的構(gòu)建工具的版本,Android Studio3.0后去除此項(xiàng)配置
2.4、defaultConfig{}閉包:
compileSdkVersion 27//設(shè)置編譯時(shí)用的Android版本 defaultConfig { applicationId "com.billy.myapplication"http://項(xiàng)目的包名 minSdkVersion 16//項(xiàng)目最低兼容的版本 targetSdkVersion 27//項(xiàng)目的目標(biāo)版本 versionCode 1//版本號(hào) versionName "1.0"http://版本名稱 testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"http://表明要使用AndroidJUnitRunner進(jìn)行單元測(cè)試 }
- applicationId:指定了項(xiàng)目的包名。
- minSdkVersion:指定項(xiàng)目最低兼容的版本,如果設(shè)備小于這個(gè)版本或者大于maxSdkVersion(一般不用)將無(wú)法安裝這個(gè)應(yīng)用,這里指定為16,表示最低兼容到Android 4.1系統(tǒng)。
- targetSdkVersion:指定項(xiàng)目的目標(biāo)版本,表示在該目標(biāo)版本上已經(jīng)做過(guò)充分測(cè)試,系統(tǒng)會(huì)為該應(yīng)用啟動(dòng)一些對(duì)應(yīng)該目標(biāo)系統(tǒng)的最新功能特性,Android系統(tǒng)平臺(tái)的行為變更,只有targetSdkVersion的屬性值被設(shè)置為大于或等于該系統(tǒng)平臺(tái)的API版本時(shí),才會(huì)生效。例如,若指定targetSdkVersion值為22,則表示該程序最高只在Android5.1版本上做過(guò)充分測(cè)試,在Android6.0系統(tǒng)上(對(duì)應(yīng)targetSdkVersion為23)擁有的新特性如系統(tǒng)運(yùn)行時(shí)權(quán)限等功能就不會(huì)被啟用。
- versionCode:表示版本號(hào),一般每次打包上線時(shí)該值只能增加,打包后看不見(jiàn)。
- versionName:表示版本名稱,展示在應(yīng)用市場(chǎng)上。
- testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"表明要使用AndroidJUnitRunner進(jìn)行單元測(cè)試。
2.5、 buildTypes{}閉包:
這個(gè)閉包主要指定生成安裝文件的主要配置,一般包含兩個(gè)子閉包,一個(gè)是debug閉包,用于指定生成測(cè)試版安裝文件的配置,可以忽略不寫;另一個(gè)是release閉包,用于指定生成正式版安裝文件的配置。兩者能配置的參數(shù)相同,最大的區(qū)別默認(rèn)屬性配置不一樣,兩種模式支持的屬性配置如下圖:
buildTypes配置.png
buildTypes {// 生產(chǎn)/測(cè)試環(huán)境配置 release {// 生產(chǎn)環(huán)境 buildConfigField("boolean", "LOG_DEBUG", "false")//配置Log日志 buildConfigField("String", "URL_PERFIX", "\"https://release.cn/\"")// 配置URL前綴 minifyEnabled false//是否對(duì)代碼進(jìn)行混淆 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//指定混淆的規(guī)則文件 signingConfig signingConfigs.release//設(shè)置簽名信息 pseudoLocalesEnabled false//是否在APK中生成偽語(yǔ)言環(huán)境,幫助國(guó)際化的東西,一般使用的不多 zipAlignEnabled true//是否對(duì)APK包執(zhí)行ZIP對(duì)齊優(yōu)化,減小zip體積,增加運(yùn)行效率 applicationIdSuffix 'test'//在applicationId 中添加了一個(gè)后綴,一般使用的不多 versionNameSuffix 'test'//在applicationId 中添加了一個(gè)后綴,一般使用的不多 } debug {// 測(cè)試環(huán)境 buildConfigField("boolean", "LOG_DEBUG", "true")//配置Log日志 buildConfigField("String", "URL_PERFIX", "\"https://test.com/\"")// 配置URL前綴 minifyEnabled false//是否對(duì)代碼進(jìn)行混淆 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//指定混淆的規(guī)則文件 signingConfig signingConfigs.debug//設(shè)置簽名信息 debuggable false//是否支持?jǐn)帱c(diǎn)調(diào)試 jniDebuggable false//是否可以調(diào)試NDK代碼 renderscriptDebuggable false//是否開(kāi)啟渲染腳本就是一些c寫的渲染方法 zipAlignEnabled true//是否對(duì)APK包執(zhí)行ZIP對(duì)齊優(yōu)化,減小zip體積,增加運(yùn)行效率 pseudoLocalesEnabled false//是否在APK中生成偽語(yǔ)言環(huán)境,幫助國(guó)際化的東西,一般使用的不多 applicationIdSuffix 'test'//在applicationId 中添加了一個(gè)后綴,一般使用的不多 versionNameSuffix 'test'//在applicationId 中添加了一個(gè)后綴,一般使用的不多 } }
release{}閉包和debug{}閉包兩者能配置的參數(shù)相同,最大的區(qū)別默認(rèn)屬性配置不一樣:
- minifyEnabled:表明是否對(duì)代碼進(jìn)行混淆,true表示對(duì)代碼進(jìn)行混淆,false表示對(duì)代碼不進(jìn)行混淆,默認(rèn)的是false。
- proguardFiles:指定混淆的規(guī)則文件,這里指定了proguard-android.txt文件和proguard-rules.pro文件兩個(gè)文件,proguard-android.txt文件為默認(rèn)的混淆文件,里面定義了一些通用的混淆規(guī)則。proguard-rules.pro文件位于當(dāng)前項(xiàng)目的根目錄下,可以在該文件中定義一些項(xiàng)目特有的混淆規(guī)則。
- buildConfigField:用于解決Beta版本服務(wù)和Release版本服務(wù)地址不同或者一些Log打印需求控制的。例如:配置buildConfigField("boolean", "LOG_DEBUG", "true"),這個(gè)方法接收三個(gè)非空的參數(shù),第一個(gè):確定值的類型,第二個(gè):指定key的名字,第三個(gè):傳值,調(diào)用的時(shí)候BuildConfig.LOG_DEBUG即可調(diào)用。
- debuggable:表示是否支持?jǐn)帱c(diǎn)調(diào)試,release默認(rèn)為false,debug默認(rèn)為true。
- jniDebuggable:表示是否可以調(diào)試NDK代碼,使用lldb進(jìn)行c和c++代碼調(diào)試,release默認(rèn)為false
- signingConfig:設(shè)置簽名信息,通過(guò)signingConfigs.release或者signingConfigs.debug,配置相應(yīng)的簽名,但是添加此配置前必須先添加signingConfigs閉包,添加相應(yīng)的簽名信息。
- renderscriptDebuggable:表示是否開(kāi)啟渲染腳本就是一些c寫的渲染方法,默認(rèn)為false。
- renderscriptOptimLevel:表示渲染等級(jí),默認(rèn)是3。
- pseudoLocalesEnabled:是否在APK中生成偽語(yǔ)言環(huán)境,幫助國(guó)際化的東西,一般使用的不多。
- applicationIdSuffix:和defaultConfig中配置是一的,這里是在applicationId 中添加了一個(gè)后綴,一般使用的不多。
- versionNameSuffix:表示添加版本名稱的后綴,一般使用的不多。
- zipAlignEnabled:表示是否對(duì)APK包執(zhí)行ZIP對(duì)齊優(yōu)化,減小zip體積,增加運(yùn)行效率,release和debug默認(rèn)都為true。
2.6、sourceSets{}閉包:配置目錄指向
sourceSets {//目錄指向配置 main { jniLibs.srcDirs = ['libs']//指定lib庫(kù)目錄 } }
配置 jniLibs.srcDirs = ['libs'],可以在Android studio的Android視圖下生成jniLibs文件夾,可以方便我們存放jar包和庫(kù)文件,其中Android視圖下的jniLibs和project視圖下的libs指向同一文件夾(app→libs),如下圖所示:
2.7、packagingOptions{}閉包:打包時(shí)的相關(guān)配置
當(dāng)項(xiàng)目中依賴的第三方庫(kù)越來(lái)越多時(shí),有可能會(huì)出現(xiàn)兩個(gè)依賴庫(kù)中存在同一個(gè)(名稱)文件。如果這樣,Gradle在打包時(shí)就會(huì)提示錯(cuò)誤(警告)。那么就可以根據(jù)提示,然后使用以下方法將重復(fù)的文件剔除,比較常用的是通過(guò)exclude去除重復(fù)的文件,例如:
packagingOptions{ //pickFirsts做用是 當(dāng)有重復(fù)文件時(shí) 打包會(huì)報(bào)錯(cuò) 這樣配置會(huì)使用第一個(gè)匹配的文件打包進(jìn)入apk // 表示當(dāng)apk中有重復(fù)的META-INF目錄下有重復(fù)的LICENSE文件時(shí) 只用第一個(gè) 這樣打包就不會(huì)報(bào)錯(cuò) pickFirsts = ['META-INF/LICENSE'] //merges何必 當(dāng)出現(xiàn)重復(fù)文件時(shí) 合并重復(fù)的文件 然后打包入apk //這個(gè)是有默認(rèn)值得 merges = [] 這樣會(huì)把默默認(rèn)值去掉 所以我們用下面這種方式 在默認(rèn)值后添加 merge 'META-INF/LICENSE' //這個(gè)是在同時(shí)使用butterknife、dagger2做的一個(gè)處理。同理,遇到類似的問(wèn)題,只要根據(jù)gradle的提示,做類似處理即可。 exclude 'META-INF/services/javax.annotation.processing.Processor' }
2.8、productFlavors{}閉包:多個(gè)渠道配置
這個(gè)配置是經(jīng)常會(huì)使用到的,通常在適配多個(gè)渠道的時(shí)候,需要為特定的渠道做部分特殊的處理,比如設(shè)置不同的包名、應(yīng)用名等。場(chǎng)景:當(dāng)我們使用友盟統(tǒng)計(jì)時(shí),通常需要設(shè)置一個(gè)渠道ID,那么我們就可以利用productFlavors來(lái)生成對(duì)應(yīng)渠道信息的包,如:
android { productFlavors { wandoujia { //豌豆莢渠道包配置 manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"] //manifestPlaceholders的使用在后續(xù)章節(jié)(AndroidManifest里的占位符)中介紹 } xiaomi { manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"] applicationId "com.wiky.gradle.xiaomi" //配置包名 } _360 { manifestPlaceholders = [UMENG_CHANNEL_VALUE: "_360"] } //... } }
當(dāng)然也有更簡(jiǎn)潔的方式:
android { productFlavors { wandoujia {} xiaomi {} _360 {} //... } productFlavors.all { //批量修改,類似一個(gè)循序遍歷 flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name] } }
配置完之后,在命令行窗口中(Terminal)中輸入gradlew assembleRelease(windows)即可開(kāi)始打包,在Mac系統(tǒng)中對(duì)應(yīng)指令應(yīng)該是./gradlew assembleRelease。當(dāng)然,如果想要debug版本的包,將指令中assembleRelease改為assembleDebug即可。最后生成的包還是在app/build/outputs/apk中,默認(rèn)命名格式如app-wandoujia-release-unsigned.apk,在module的Build Variants中可以選擇相應(yīng)的渠道。
注:Android Studio3.0需在主app的build.gradle里面的
defaultConfig { targetSdkVersion:*** minSdkVersion :*** versionCode:*** versionName :*** //版本名后面添加一句話,意思就是flavor dimension 它的維度就是該版本號(hào),這樣維度就是都是統(tǒng)一的了 flavorDimensions "versionCode" }
2.9、lintOptions{}閉包:代碼掃描分析
Lint 是Android Studio 提供的 代碼掃描分析工具,它可以幫助我們發(fā)現(xiàn)代碼結(jié)構(gòu)/質(zhì)量問(wèn)題,同時(shí)提供一些解決方案,而且這個(gè)過(guò)程不需要我們手寫測(cè)試用例。
Lint 發(fā)現(xiàn)的每個(gè)問(wèn)題都有描述信息和等級(jí)(和測(cè)試發(fā)現(xiàn) bug 很相似),我們可以很方便地定位問(wèn)題,同時(shí)按照嚴(yán)重程度進(jìn)行解決。
//程序在編譯的時(shí)候會(huì)檢查lint,有任何錯(cuò)誤提示會(huì)停止build,我們可以關(guān)閉這個(gè)開(kāi)關(guān) lintOptions { abortOnError false //即使報(bào)錯(cuò)也不會(huì)停止打包 checkReleaseBuilds false //打包release版本的時(shí)候進(jìn)行檢測(cè) }
3、dependencies{}閉包:
該閉包定義了項(xiàng)目的依賴關(guān)系,一般項(xiàng)目都有三種依賴方式:本地依賴、庫(kù)依賴和遠(yuǎn)程依賴。本地依賴可以對(duì)本地的jar包或目錄添加依賴關(guān)系,庫(kù)依賴可以對(duì)項(xiàng)目中的庫(kù)模塊添加依賴關(guān)系,遠(yuǎn)程依賴可以對(duì)jcener庫(kù)上的開(kāi)源項(xiàng)目添加依賴關(guān)系。從Android Studio3.0后compile引入庫(kù)不在使用,而是通過(guò)api和implementation,api完全等同于以前的compile,用api引入的庫(kù)整個(gè)項(xiàng)目都可以使用,用implementation引入的庫(kù)只有對(duì)應(yīng)的Module能使用,其他Module不能使用,由于之前的項(xiàng)目統(tǒng)一用compile依賴,導(dǎo)致的情況就是模塊耦合性太高,不利于項(xiàng)目拆解,使用implementation之后雖然使用起來(lái)復(fù)雜了但是做到降低偶合興提高安全性。
dependencies {//項(xiàng)目的依賴關(guān)系 implementation fileTree(include: ['*.jar'], dir: 'libs')//本地jar包依賴 implementation 'com.android.support:appcompat-v7:27.1.1'//遠(yuǎn)程依賴 implementation 'com.android.support.constraint:constraint-layout:1.1.2' testImplementation 'junit:junit:4.12'//聲明測(cè)試用例庫(kù) androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' }
- implementation fileTree(include: ['*.jar'], dir: 'libs'):implementation fileTree是一個(gè)本地依賴聲明,表示將libs目錄下所有.jar后綴的文件都添加到項(xiàng)目的構(gòu)建路徑當(dāng)中。
- implementation 'com.android.support:appcompat-v7:27.1.1':implementation語(yǔ)句為 遠(yuǎn)程依賴聲明,'com.android.support:appcompat-v7:27.1.1'為一個(gè)標(biāo)準(zhǔn)的遠(yuǎn)程依賴庫(kù)格式,其中com.android.support為域名部分,用于區(qū)分不同公司的庫(kù);appcompat-v7為組件名稱,用于區(qū)分同一個(gè)公司的不同庫(kù);27.1.1為版本號(hào),用于區(qū)分同一個(gè)庫(kù)的不同版本。加上這句聲明后,Gradle在構(gòu)建項(xiàng)目時(shí)會(huì)先檢查一下本地是否已經(jīng)緩存過(guò)該庫(kù),若沒(méi)有緩存則自動(dòng)聯(lián)網(wǎng)下載,下載后自動(dòng)添加到項(xiàng)目的構(gòu)建路徑中去。
- testImplementation和androidTestImplementation:表示聲明測(cè)試用例庫(kù)。
Module完整的build.gradle配置如下:
// 聲明是Android程序, //com.android.application 表示這是一個(gè)應(yīng)用程序模塊 //com.android.library 標(biāo)識(shí)這是一個(gè)庫(kù)模塊 //而這區(qū)別:前者可以直接運(yùn)行,后著是依附別的應(yīng)用程序運(yùn)行 apply plugin: 'com.android.application' android { signingConfigs {// 自動(dòng)化打包配置 release {// 線上環(huán)境 keyAlias 'test' keyPassword '123456' storeFile file('test.jks') storePassword '123456' } debug {// 開(kāi)發(fā)環(huán)境 keyAlias 'test' keyPassword '123456' storeFile file('test.jks') storePassword '123456' } } compileSdkVersion 27//設(shè)置編譯時(shí)用的Android版本 defaultConfig { applicationId "com.billy.myapplication"http://項(xiàng)目的包名 minSdkVersion 16//項(xiàng)目最低兼容的版本 targetSdkVersion 27//項(xiàng)目的目標(biāo)版本 versionCode 1//版本號(hào) versionName "1.0"http://版本名稱 flavorDimensions "versionCode" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"http://表明要使用AndroidJUnitRunner進(jìn)行單元測(cè)試 } buildTypes {// 生產(chǎn)/測(cè)試環(huán)境配置 release {// 生產(chǎn)環(huán)境 buildConfigField("boolean", "LOG_DEBUG", "false")//配置Log日志 buildConfigField("String", "URL_PERFIX", "\"https://release.cn/\"")// 配置URL前綴 minifyEnabled false//是否對(duì)代碼進(jìn)行混淆 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//指定混淆的規(guī)則文件 signingConfig signingConfigs.release//設(shè)置簽名信息 pseudoLocalesEnabled false//是否在APK中生成偽語(yǔ)言環(huán)境,幫助國(guó)際化的東西,一般使用的不多 zipAlignEnabled true//是否對(duì)APK包執(zhí)行ZIP對(duì)齊優(yōu)化,減小zip體積,增加運(yùn)行效率 applicationIdSuffix 'test'//在applicationId 中添加了一個(gè)后綴,一般使用的不多 versionNameSuffix 'test'//在applicationId 中添加了一個(gè)后綴,一般使用的不多 } debug {// 測(cè)試環(huán)境 buildConfigField("boolean", "LOG_DEBUG", "true")//配置Log日志 buildConfigField("String", "URL_PERFIX", "\"https://test.com/\"")// 配置URL前綴 minifyEnabled false//是否對(duì)代碼進(jìn)行混淆 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//指定混淆的規(guī)則文件 signingConfig signingConfigs.debug//設(shè)置簽名信息 debuggable false//是否支持?jǐn)帱c(diǎn)調(diào)試 jniDebuggable false//是否可以調(diào)試NDK代碼 renderscriptDebuggable false//是否開(kāi)啟渲染腳本就是一些c寫的渲染方法 zipAlignEnabled true//是否對(duì)APK包執(zhí)行ZIP對(duì)齊優(yōu)化,減小zip體積,增加運(yùn)行效率 pseudoLocalesEnabled false//是否在APK中生成偽語(yǔ)言環(huán)境,幫助國(guó)際化的東西,一般使用的不多 applicationIdSuffix 'test'//在applicationId 中添加了一個(gè)后綴,一般使用的不多 versionNameSuffix 'test'//在applicationId 中添加了一個(gè)后綴,一般使用的不多 } } sourceSets {//目錄指向配置 main { jniLibs.srcDirs = ['libs']//指定lib庫(kù)目錄 } } packagingOptions{//打包時(shí)的相關(guān)配置 //pickFirsts做用是 當(dāng)有重復(fù)文件時(shí) 打包會(huì)報(bào)錯(cuò) 這樣配置會(huì)使用第一個(gè)匹配的文件打包進(jìn)入apk // 表示當(dāng)apk中有重復(fù)的META-INF目錄下有重復(fù)的LICENSE文件時(shí) 只用第一個(gè) 這樣打包就不會(huì)報(bào)錯(cuò) pickFirsts = ['META-INF/LICENSE'] //merges何必 當(dāng)出現(xiàn)重復(fù)文件時(shí) 合并重復(fù)的文件 然后打包入apk //這個(gè)是有默認(rèn)值得 merges = [] 這樣會(huì)把默默認(rèn)值去掉 所以我們用下面這種方式 在默認(rèn)值后添加 merge 'META-INF/LICENSE' //這個(gè)是在同時(shí)使用butterknife、dagger2做的一個(gè)處理。同理,遇到類似的問(wèn)題,只要根據(jù)gradle的提示,做類似處理即可。 exclude 'META-INF/services/javax.annotation.processing.Processor' } productFlavors { wandoujia {} xiaomi {} _360 {} } productFlavors.all { //批量修改,類似一個(gè)循序遍歷 flavor -> flavor.manifestPlaceholders = [IFLYTEK_CHANNEL: name] } //程序在編譯的時(shí)候會(huì)檢查lint,有任何錯(cuò)誤提示會(huì)停止build,我們可以關(guān)閉這個(gè)開(kāi)關(guān) lintOptions { abortOnError false //即使報(bào)錯(cuò)也不會(huì)停止打包 checkReleaseBuilds false //打包release版本的時(shí)候進(jìn)行檢測(cè) } } dependencies { //項(xiàng)目的依賴關(guān)系 implementation fileTree(include: ['*.jar'], dir: 'libs') //本地jar包依賴 implementation 'com.android.support:appcompat-v7:27.1.1' //遠(yuǎn)程依賴 implementation 'com.android.support.constraint:constraint-layout:1.1.2' testImplementation 'junit:junit:4.12' //聲明測(cè)試用例庫(kù) androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' }
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- AndroidStudio 使用過(guò)程中出現(xiàn)的異常(Gradle sync failed)處理辦法
- Android studio gradle環(huán)境變量配置教程
- android studio 一直卡在Gradle:Build Running的幾種解決辦法
- 詳解關(guān)于Android Studio中安裝和gradle的一些坑
- Android報(bào)錯(cuò)Error:Could not find com.android.tools.build:gradle:4.1解決辦法
- Android Studio3.6設(shè)置Gradle Offline Mode的方法
- 詳解AndroidStudio JNI +Gradle3.0以上JNI爬坑之旅
- Android Gradle依賴管理、去除重復(fù)依賴、忽略的方式
- Android使用Gradle依賴配置compile、implementation與api的區(qū)別介紹
- android自定義gradle插件并且發(fā)布到本地倉(cāng)庫(kù)詳細(xì)教程
相關(guān)文章
淺談Android獲取ImageView上的圖片,和一個(gè)有可能遇到的問(wèn)題
下面小編就為大家?guī)?lái)一篇淺談Android獲取ImageView上的圖片,和一個(gè)有可能遇到的問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04ListView實(shí)現(xiàn)下拉動(dòng)態(tài)渲染數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了ListView實(shí)現(xiàn)下拉動(dòng)態(tài)渲染數(shù)據(jù)的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06Android LinearLayout實(shí)現(xiàn)自動(dòng)換行效果
這篇文章主要為大家詳細(xì)介紹了Android LinearLayout實(shí)現(xiàn)自動(dòng)換行效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08Kotlin圖文并茂講解續(xù)體與續(xù)體攔截器和調(diào)度器
這篇文章主要介紹了Kotlin開(kāi)發(fā)中續(xù)體與續(xù)體攔截器和調(diào)度器的相關(guān)使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08Android自定義可左右滑動(dòng)和點(diǎn)擊的折線圖
這篇文章主要為大家詳細(xì)介紹了Android自定義可左右滑動(dòng)和點(diǎn)擊的折線圖,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04Android自定義Toast樣式實(shí)現(xiàn)方法詳解
這篇文章主要介紹了Android自定義Toast樣式,Toast是一種很方便的消息提示框,會(huì)在 屏幕中顯示一個(gè)消息提示框,沒(méi)任何按鈕,也不會(huì)獲得焦點(diǎn)一段時(shí)間過(guò)后自動(dòng)消失!非常常用!本文就來(lái)通過(guò)一個(gè)例子把Toast的使用講透2023-01-01Android開(kāi)發(fā)之時(shí)間日期組件用法實(shí)例
這篇文章主要介紹了Android開(kāi)發(fā)之時(shí)間日期組件用法,主要介紹了TimePicker和DatePicker組件,對(duì)于Android程序開(kāi)發(fā)有不錯(cuò)的借鑒價(jià)值,需要的朋友可以參考下2014-08-08android教程之intent的action屬性使用示例(intent發(fā)短信)
這篇文章主要介紹了android中intent的action屬性使用示例,提供了使用intent撥打電話、發(fā)送短信、播放mp3的代碼2014-01-01