最近 Android Studio 3.0 版本正式推出,趁著項(xiàng)目剛發(fā)完版本青扔,趕緊更新試試水,結(jié)果發(fā)現(xiàn)項(xiàng)目完全跑不起來(lái)翩伪,折騰了幾個(gè)小時(shí)才搞好微猖。記錄一下填坑過(guò)程,希望能幫助其他同學(xué)缘屹。
1. gradle 和 buildToolsVersion 版本
Android Studio 3.0 要求 gradle 版本為 4.1 凛剥,對(duì)應(yīng)的 buildToolsVersion 為 26.0.2 ,然后記得在項(xiàng)目最外層的 build.gradle
添加 google()
轻姿,如果不添加將會(huì)導(dǎo)致某些官方依賴(lài)下載不了犁珠。
buildscript {
repositories {
...
google()
}
}
2. module 依賴(lài)方式變更
原先依賴(lài) module 使用的是 compile
,現(xiàn)在需要替換為 api
或 implementation
互亮。
api
: module 編譯時(shí)可用犁享,module 的使用者編譯和運(yùn)行時(shí)可用,這個(gè)和過(guò)時(shí)的 compile
一樣的豹休。
implementation
: module 編譯時(shí)可用炊昆,module 的使用者運(yùn)行時(shí)可用,對(duì)于大量使用 library 的項(xiàng)目,可以顯著提高編譯時(shí)間,因?yàn)樗梢詼p少構(gòu)建系統(tǒng)重新編譯一些 module 凤巨。
那么什么時(shí)候用 api
视乐,什么時(shí)候用 implementation
呢?由于公司項(xiàng)目采用的是組件化開(kāi)發(fā)敢茁,有個(gè) common module 需要被各個(gè)組件依賴(lài)佑淀,一開(kāi)始采用的是 implementation
,結(jié)果發(fā)現(xiàn)會(huì)導(dǎo)致別的組件無(wú)法引用 common 中的庫(kù)( common -> A module 卷要,A module 無(wú)法引用 common 依賴(lài)的庫(kù) )渣聚。
試驗(yàn)過(guò)后得出結(jié)論独榴,當(dāng)這個(gè) module 會(huì)被多次引用應(yīng)該使用 api
僧叉,不會(huì)被別的 module 引用使用 implementation
。
發(fā)一下我現(xiàn)在使用的方式
dependencies {
api fileTree(include: ['*.jar'], dir: 'libs')
api 'com.squareup.okhttp3:okhttp:3.4.2'
...
debugApi 'com.squareup.leakcanary:leakcanary-android:1.5.1'
releaseApi 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.1'
}
compileOnly
替換了 provided
棺榔,runtimeOnly
替換了 apk
瓶堕。
3. apt 插件更換
apt
插件已被廢棄,需更換為 annotationProcessor
症歇。
//apply plugin: 'android-apt'
dependencies {
...
annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'
}
4.第三方庫(kù)不兼容問(wèn)題
· retrolambda
Android Studio 3.0 已經(jīng)支持 Java 8 了郎笆,不需要第三方庫(kù)來(lái)支持,因此需要去掉 retrolambda
庫(kù)忘晤。
項(xiàng)目最外層的 build.gradle
buildscript {
...
dependencies {
...
//classpath 'me.tatarka:gradle-retrolambda:3.2.5'
}
}
module 中的 build.gradle
//apply plugin: 'me.tatarka.retrolambda'
android {
...
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
...
//retrolambdaConfig 'net.orfjackal.retrolambda:retrolambda:2.3.0'
}
· butterknife
butterknife
最新版本為 8.8.0宛蚓,與 Android Studio 3.0 不兼容,會(huì)提示
Caused by: java.lang.NoSuchMethodError: com.android.build.gradle.tasks.ProcessAndroidResources.getPackageForR()Ljava/lang/String;
官方 issue 已經(jīng)有人提過(guò)這個(gè)問(wèn)題设塔,貌似是 gradle 的問(wèn)題凄吏。解決辦法:版本降級(jí)到 8.5.1 即可解決。
· 項(xiàng)目中同一個(gè)第三庫(kù)有多個(gè)版本導(dǎo)致編譯失敗
不知道是不是 Android Studio 3.0 編譯現(xiàn)在比以前嚴(yán)格了闰蛔,以前有的庫(kù)沒(méi)有統(tǒng)一過(guò)版本痕钢,現(xiàn)在直接編譯不過(guò)了。解決辦法:統(tǒng)一第三方庫(kù)的版本序六。
在 Terminal 中輸入 gradle app:dependencies
(gradle環(huán)境配置可以百度)
...
+--- com.meituan.android.walle:library:1.1.5
| +--- com.android.support:support-annotations:24.1.1 -> 25.2.0
| \--- com.meituan.android.walle:payload_reader:1.1.5
...
如果出現(xiàn)了 com.android.support:support-annotations:24.1.1 -> 25.2.0
代表該庫(kù)中有自己依賴(lài)的庫(kù)被升級(jí)了任连,需要去除這個(gè)依賴(lài)。
dependencies {
...
api('com.meituan.android.walle:library:1.1.5') {
exclude(group: 'com.android.support', module: 'support-annotations')
}
}
group
是 :
前面的包名例诀,:
后面的是 module 名字随抠。
如果依賴(lài)的是 jar 包,寫(xiě)法為 exclude(module: 'libs/xxx.jar')
繁涂。
exclude(group: 'com.android.support')
是忽略所有 com.android.support
的module拱她。
另外 apk 的輸出目錄變了,多了一層目錄結(jié)構(gòu) debug 爆土。
由 app/build/outputs/apk
變?yōu)?app/build/outputs/apk/debug
椭懊,如果是用 Jenkins 打包項(xiàng)目拷貝文件的腳本需要修改下。