升級(jí)了Android Studio 3.0后 , 首次創(chuàng)建項(xiàng)目就報(bào)錯(cuò)了 , 經(jīng)過一番折騰總算是解決了 , 但是仔細(xì)想想 , 還是感覺自己的gradle相比于java來說還是太弱了.這篇博客也希望能提醒一下各位 , 工欲善其事,必先利其器.
首先是我解決今天遇到問題的解決方法
首先查看對(duì)應(yīng)的gradle版本
-
手動(dòng)下載Gradle . 即根目錄->gradle->wrapper->gradle-wrapper.properties文件中 , 相對(duì)應(yīng)的gradle版本 , 如圖所示
其實(shí)對(duì)于這個(gè)問題 , 網(wǎng)上有很多解決方案 , 比如說手動(dòng)修改對(duì)應(yīng)的gradle版本為自己已有的版本坛缕。已有版本可以在如圖所示的文件中找到,一般來說 , 只需要輸入已經(jīng)完整下載的gradle包即可(完整下載指的是魏保,打開文件后有個(gè).ok的文件烂翰,文件大小為0,這個(gè)文件是一個(gè)標(biāo)志文件,標(biāo)志著這個(gè)文件夾下的東西已經(jīng)完全下載)
但是我們今天不能這樣做,如果你修改了gradle的版本,會(huì)在gradle中報(bào)一大堆錯(cuò)誤指么,錯(cuò)誤稍后再談。所以還是科學(xué)上網(wǎng)驰吓,或者是手動(dòng)下載新版本吧
修改了gradle版本帶來的錯(cuò)誤
修改了gradle的文件時(shí)涧尿,會(huì)提示app/build.gradle文件中大量標(biāo)紅 , 細(xì)心的老哥們會(huì)發(fā)現(xiàn) , 包引入的方式居然發(fā)生了改變:
這里從compile變成了implementation這種新的方式 , 因?yàn)檫@里是使用默認(rèn)的gradle版本來生成的語句,手動(dòng)修改版本必然會(huì)出現(xiàn)問題檬贰」昧可以自己手動(dòng)修改過來就好了,如果直接用新版本的gradle這里不用理會(huì)翁涤。至于為什么會(huì)出現(xiàn)這種改變桥言,這里就不再討論了
仍然報(bào)錯(cuò)?
這就是平時(shí)的習(xí)慣問題了葵礼,檢查設(shè)置中g(shù)radle是不是設(shè)置為離線模式了号阿。在默認(rèn)新版本的gradle下回引入新版本的包,比如v7包鸳粉,離線模式時(shí)候扔涧,在本地當(dāng)然找不到這個(gè)包。如果你把引用的包改掉也可以(會(huì)有不少需要改)届谈,但這里建議你關(guān)閉離線模式枯夜,讓gradle去下載新的包就行啦
其實(shí)說到底,還是對(duì)gradle不夠了解艰山。所以接下來就來總結(jié)一下Gradle文件中湖雹,各個(gè)字段的含義以及用法,小技巧在另一篇博客中收集(待更新)曙搬。
app/build.gradle文件
1. android->defaultConfig 默認(rèn)偏好設(shè)置
動(dòng)態(tài)的在build時(shí)配置AndroidManifest.xml里的項(xiàng)目摔吏,defaultConfig里的配置可以覆蓋manifest里的配置鸽嫂。
- 在build.gradle文件生成一個(gè)applicationId,對(duì)應(yīng)的屬性值是填寫的package name征讲。applicationId表示真正的包名据某,而package不再被認(rèn)為是包名,因?yàn)閼?yīng)用程序被打包成apk文件的時(shí)候稳诚,原先在manifest聲明的package被applicationId代替哗脖。也剛好說明為什么應(yīng)用程序安裝到手機(jī)后瀑踢,手機(jī)上顯示的是applicationId扳还,而不是顯示package,同時(shí)如果想在應(yīng)用程序中接入第三方的API橱夭,填寫的包名也必須是applicationId氨距。
- versionName,versionCode: 版本名和版本號(hào)
- minSdkVersion棘劣,targetSdkVersion: 支持的安卓設(shè)備版本的區(qū)間
- testInstrumentationRunner:允許自動(dòng)化測(cè)試
- ndk { // 設(shè)置支持的SO庫(kù)架構(gòu)
abiFilters 'armeabi', 'x86', 'x86','x86_64', 'armeabi-v7a', 'arm64- v8a'
} - buildConfigField:自定義字段俏让,方便調(diào)試時(shí)打log,如
buildConfigField("int", "SLEEP_TIME", "5000")
public static final boolean DEBUG = BuildConfig.API_ENV;
2. android-> signingConfigs 自定義簽名設(shè)置
(懶得配置了,個(gè)人喜歡手動(dòng)簽名)
3. android->buildTypes 構(gòu)建類型
每一個(gè)APP至少包含debug和release兩種構(gòu)建類型茬暇,debug定義APP的調(diào)試版本
- debug模式的幾個(gè)特點(diǎn):
支持?jǐn)帱c(diǎn)調(diào)試和log信息打印首昔,debuggable屬性值為true
使用系統(tǒng)默認(rèn)的密鑰庫(kù)簽署apk文件
沒有對(duì)apk文件進(jìn)行代碼和資源文件的優(yōu)化(包括文件壓縮、冗余文件刪除)
沒有對(duì)代碼進(jìn)行混淆 - release定義APP的發(fā)布版本:
不支持?jǐn)帱c(diǎn)調(diào)試糙俗,debuggable默認(rèn)為false
沒有壓縮類文件代碼勒奇,minifyEnabled,默認(rèn)為false
沒有壓縮資源文件巧骚,shrinkResources赊颠,默認(rèn)為false
沒有指定自定義簽名文件,默認(rèn)使用系統(tǒng)的密鑰庫(kù)簽署apk- minifyEnable定義是否壓縮代碼劈彪,false表示不壓縮
-
proguardFiles定義混淆代碼的默認(rèn)混淆規(guī)則:
proguard-android.txt表示系統(tǒng)自帶的混淆規(guī)則竣蹦,
proguard-rules.pro位于當(dāng)前module根目錄下,用于定義開發(fā)者自己的混淆規(guī)則沧奴。
這里貼上自己的代碼:
buildTypes {
release {
//混淆配置打開時(shí)痘括,才會(huì)自動(dòng)上傳符號(hào)表到 BugHD
minifyEnabled false
//對(duì)齊優(yōu)化設(shè)置為true,否則找不到該task (默認(rèn)不寫也是true)
zipAlignEnabled true
//配置正式版簽名證書信息滔吠,否則上傳release版本是unsigned_apk纲菌,導(dǎo)致無法安裝。
signingConfig signingConfigs.release
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
shrinkResources true //移除無用的資源文件
}
debug {
minifyEnabled false// 是否混淆
shrinkResources true //移除無用的資源文件
}
}
4. android->dexOptions DEX文件構(gòu)建屬性配置(加快構(gòu)建速度)
Android Studio在每次構(gòu)建的時(shí)候屠凶,都感覺花好長(zhǎng)時(shí)間驰后,這時(shí)候我們可以配置一下dexOption加快構(gòu)建速度
- preDexLibraries 聲明是否預(yù)先編譯依賴庫(kù),實(shí)質(zhì)是通過延時(shí)清除已生成的依賴庫(kù)的構(gòu)建文件矗愧,達(dá)到加快速度的目的灶芝。
- maxProcessCount 設(shè)置進(jìn)程運(yùn)行過程中可以使用的最大線程數(shù)郑原。默認(rèn)值為4。
- javaMaxHeapSize 設(shè)置DEX編譯器的最大堆大小夜涕,堆或者棧都是用于存放暫時(shí)不用的垃圾犯犁,當(dāng)內(nèi)存不足時(shí),垃圾回收機(jī)制會(huì)清除過時(shí)的緩存女器,堆大小決定垃圾清除的頻率酸役,影響著構(gòu)建的速度
dexOptions {
incremental true //使用增量構(gòu)建
javaMaxHeapSize "4g" //設(shè)置堆內(nèi)存
jumboMode = true //大工程模式
maxProcessCount=8
}
以上的配置,在引入MultiDex的時(shí)候驾胆,有幾率會(huì)在debug模式下報(bào)錯(cuò)涣澡,但是在release時(shí)正常,所以在引入MultiDex的情況下丧诺,debug時(shí)手動(dòng)注釋掉入桂,release時(shí)放開
5. android->splits 將一個(gè)apk拆分成多個(gè)相關(guān)配置(拆分依據(jù):屏幕密度、系統(tǒng)架構(gòu))
(姑且沒用過)
6. dependencies 引入的依賴包
dependencies {
compile project(':third-party:FilePicker')
compile files('libs/zxing.jar')
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:appcompat-v7:25.1.0'
compile group: 'com.android.support', name: 'appcompat-v7', version: '25.1.0'
}
以上的依賴分別對(duì)應(yīng):
-
模塊依賴項(xiàng)(工程依賴驳阎,module依賴)
聲明了一個(gè)名為third-party/FilePicker的本地 Android 庫(kù)模塊作為依賴項(xiàng)抗愁,并要求構(gòu)建系統(tǒng)在構(gòu)建應(yīng)用時(shí)編譯并包含該本地模塊。
本地二進(jìn)制依賴項(xiàng)
本地二進(jìn)制依賴樹
本地依賴呵晚,告訴構(gòu)建系統(tǒng)在編譯類路徑和最終的應(yīng)用軟件包中包含 app/libs/ 目錄內(nèi)的指定或全部 JAR 文件蜘腌。如果有模塊需要本地二進(jìn)制依賴項(xiàng),這些依賴項(xiàng)的 JAR 文件必須復(fù)制到項(xiàng)目?jī)?nèi)部的 /libs 中饵隙。遠(yuǎn)程二進(jìn)制依賴項(xiàng)
遠(yuǎn)程二進(jìn)制依賴組
遠(yuǎn)程二進(jìn)制依賴撮珠,通過指定其 JCenter 坐標(biāo),針對(duì) Android 支持庫(kù)的 添加依賴癞季。默認(rèn)情況下劫瞳,Android Studio 會(huì)將項(xiàng)目配置為使用頂級(jí)構(gòu)建文件中的 JCenter 存儲(chǔ)區(qū)。當(dāng)您將項(xiàng)目與構(gòu)建配置文件同步時(shí)绷柒,Gradle 會(huì)自動(dòng)從 JCenter 中抽取依賴項(xiàng)志于。或者废睦,您也可以通過使用 SDK 管理器下載和安裝特定的依賴項(xiàng)伺绽。當(dāng)然也可以自己制作開源庫(kù)上傳,再到這里用一句話引用嗜湃。