前言
本來想多挖點(diǎn)坑總結(jié)再分享出來的簿盅,但最近的坑折磨的我夠嗆轧拄,想提前分享出來幫助其它受難的小伙伴揽祥,哎,不說了紧帕。盔然。。
持續(xù)刨坑中...
1.配置ButterKnife
只需設(shè)置如下代碼即可:
implementation 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
在module的build.gradle 文件中設(shè)置支持插件 是嗜,添加如下代碼
apply plugin: 'com.jakewharton.butterknife'
否則無法使用R.id.R2
2.組件化項(xiàng)目升級3.0以上后報(bào)錯(cuò)
Could not find runtime.aar (android.arch.lifecycle:runtime:1.0.0).
Searched in the following locations:
https://jcenter.bintray.com/android/arch/lifecycle/runtime/1.0.0/runtime-1.0.0.aar
// 組件化Architecture Components
compile "android.arch.lifecycle:runtime:1.1.1"
compile "android.arch.lifecycle:extensions:1.1.1"
annotationProcessor "android.arch.lifecycle:compiler:1.1.1"
3.依賴方式改變
implementation愈案、api、compileOnly等
https://blog.csdn.net/yuzhiqiang_1993/article/details/78366985?locationNum=6&fps=1
4.打開一個(gè)3.0的GitHub項(xiàng)目報(bào)錯(cuò)(使用的是3.0以下AS)
Q:Error:This Gradle plugin requires a newer IDE able to request IDE model level 3. For Android Studio this means version 3.0+
A:
(1): 升級android studio IDE的版本鹅搪。
(2):在項(xiàng)目的gradle.properties配置文件中加入以下這句:
gradle.properties中:android.injected.build.model.only.versioned = 3
5.Gradle自定義apk名稱報(bào)錯(cuò)
- 在AS 3.0之前自定義apk名稱:
variant.outputs.each { output ->
def fileName = "${variant.versionName}_release.apk"
def outFile = output.outputFile
if (outFile != null && outFile.name.endsWith('.apk')) {
output.outputFile =newFile(outFile.parent, fileName)
}
}
但是在AS 3.0之后站绪,同樣代碼自定義apk名稱卻會報(bào)錯(cuò):
由于3.0中outputFile
變?yōu)橹蛔x,不能修改輸出的名稱所以報(bào)錯(cuò)丽柿。
解決方式:
applicationVariants.all { variant ->
variant.outputs.all { output -> // each 改為 all
def fileName = "${variant.versionName}_release.apk"
def outFile = output.outputFile
if (outFile != null && outFile.name.endsWith('.apk')) {
outputFileName = fileName // output.outputFile 改為 outputFileName
}
}
把each
修改為all
恢准,然后通過outputFileName
修改生成apk的名稱。此外甫题,AS 3.0后打包完馁筐,除了apk包文件,還會多一個(gè)output.json
參數(shù)文件坠非。
6.AS3.0多渠道打包報(bào)錯(cuò)
解決方法:
flavorDimensions "default"
productFlavors {
kuan {
dimension "default"
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "kuan"]
}
xiaomi {
dimension "default"
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
}
qh360 {
dimension "default"
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "qh360"]
}
baidu {
dimension "default"
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]
}
wandoujia {
dimension "default"
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
}
}
或者寫成:
flavorDimensions "default"
productFlavors {
kuan {dimension "default"}
xiaomi {dimension "default"}
qh360 {dimension "default"}
baidu {dimension "default"}
wandoujia {dimension "default"}
}
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
7.第三方庫導(dǎo)致support版本沖突
一般這種問題解決方法是:在指定的有沖突的庫的依賴處敏沉,添加exclude group: 'com.android.support'
,可以將沖突庫不包含在編譯,如:
compile('xx.xxx.xxxxx:xxxxx:1.5.5') {
exclude group: 'com.android.support'
}
但是問題是我不知道哪個(gè)第三方庫沖突盟迟,不可能一個(gè)個(gè)檢查吧秋泳?
這時(shí)候只需要在gradle文件中添加如下代碼,讓所有的第三方包強(qiáng)制使用指定版本的support包:
configurations.all {
resolutionStrategy.eachDependency { DependencyResolveDetails details ->
def requested = details.requested
if (requested.group == 'com.android.support') {
if (!requested.name.startsWith("multidex")) {
details.useVersion '26.1.0'
}
}
}
}
同時(shí)攒菠,需要注意的是迫皱,在自己寫第三方庫給別人用的時(shí)候,對于support包的依賴方式改成provided
(或者compileOnly
辖众,gradle3.0)卓起,這樣不會把support打包,方便其他人使用赵辕。
8.組件化項(xiàng)目報(bào)錯(cuò) Manifest merger failed
這個(gè)錯(cuò)誤是我手賤升級AS3.1.2后既绩,報(bào)出來的
上網(wǎng)搜索好幾個(gè)夜晚。还惠。。沒有找到解決方法私杜,直到我發(fā)現(xiàn)了
新大陸蚕键,騷操作啊Kゴ狻B喙狻!
可以發(fā)現(xiàn)因?yàn)槲以O(shè)置了
tools:replace="android:exported"
铝耻,而我在Manifest中沒有給四大組件設(shè)置過android:exported
屬性誊爹,沒升級前沒報(bào)這個(gè)錯(cuò)。瓢捉。频丘。
去掉后就可以正常運(yùn)行啦E萏搂漠!:)
額外說一句哈,關(guān)于這個(gè)android:exported
屬性的
- 四大組件 Activity某弦,Service桐汤,Provider,Receiver 四大組件中都會有這么一個(gè)屬性靶壮。
- 它的主要作用是:是否支持其它應(yīng)用調(diào)用當(dāng)前組件怔毛。
- 默認(rèn)值:如果包含有intent-filter 默認(rèn)值為true; 沒有intent-filter默認(rèn)值為false。
詳細(xì)的可以看這里:
https://blog.csdn.net/watermusicyes/article/details/46460347
9.矢量圖報(bào)錯(cuò)
A: 問題出在矢量圖腾降,2.0+的Android Studio需要如下進(jìn)行設(shè)置:
defaultConfig{
vectorDrawables.useSupportLibrary = true
}
10.分包multidex問題
在依賴中添加了MultiDex后拣度,報(bào)錯(cuò)提示包重復(fù)。
// 添加MultiDex支持庫的依賴
api 'com.android.support:multidex:1.0.1'
找了好久,也沒發(fā)現(xiàn)在哪加了1.0.2的包啊蜡娶。混卵。。尼瑪
后來終于發(fā)現(xiàn)窖张,在3.0中只要設(shè)置
multiDexEnabled true
就會自動(dòng)添加上述兩個(gè)1.0.2的包幕随。
- Android 5.0以下的版本
Android 5.0(API leve 21)之前的系統(tǒng)使用Dalvik執(zhí)行應(yīng)用程序代碼。默認(rèn)情況下,Dalvik限制一個(gè)apk只有一個(gè)Dex文件宿接。為了繞過這個(gè)限制, 我們可以使用multidex support library,它成為我們APK的主要DEX文件的一部分,負(fù)責(zé)管理我們APK訪問其他DEX文件和代碼赘淮。
注意: 如果咱的項(xiàng)目minSdkVersion是20或更低,運(yùn)行到Android 4.4(API leve 20)或者更低版本的設(shè)備上時(shí)需要禁用AndroidStudio的即時(shí)運(yùn)行
- Android 5.0和更高版本
Android 5.0(API leve 21)和更高的系統(tǒng)使用runtime是ART ,原生支持從應(yīng)用的apk文件加載多個(gè)DEX文件。ART在安裝應(yīng)用時(shí)預(yù)編譯應(yīng)用程序,會掃描多個(gè)classes(..N).dex文件編譯成一個(gè).oat的文件睦霎。更多Android5.0 runtime的更多信息,請參見即時(shí)運(yùn)行-instant-run梢卸。
注意: 如果你使用即時(shí)運(yùn)行 , AndroidStudio自動(dòng)配置你的應(yīng)用程序,你應(yīng)用程序的minSdkVersion應(yīng)該設(shè)置為21或更高。因?yàn)榧磿r(shí)只工作在你APP的Debug版本,你任然需要配置你的release版本構(gòu)建時(shí)用multidex避免64k的限制副女。
綜上蛤高,multiDexEnabled true
即可解決問題。另外碑幅,別忘了
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(base);
}
11.Android Studio下載插件超時(shí)
File->Settings->Apparence & Behavior->System Settings->Updates->use secure connnection 勾去掉