Android Studio 升級到3.0 提示 java.lang.NoClassDefFoundError
這個問題折騰了2個小時,最後解決了,Stack Overflow 上也有一次類似的問題,但是沒有人提供解答。
這個錯誤的意思是執行時沒有找到類,所以一般是你編譯通過了但是無法執行。
寫完這個就去解答,希望更多的人看到並避免,節省大家的精力。
解決方法
首先把方法寫出來,起因和經過和原理寫在後面,時間倉促的直接看解決方法吧。
一般出現這個錯都是使用的provided
導致的
例如,我的舊配置如下:
Project build.gradle
檔案:
buildscript {
dependencies {
classpath `com.android.tools.build:gradle:3.0.1`
// need delete in gradle3.x version
classpath `com.neenbedankt.gradle.plugins:android-apt:1.8`
}
}
Module build.gradle
檔案:
apply plugin: `com.android.library`
apply plugin: `android-apt`
android {
// ...
}
configurations {
provided
}
dependencies {
// ...
// Fyber Annotations
provided `com.fyber:fyber-annotations:1.3.0`
apt `com.fyber:fyber-annotations-compiler:1.4.0`
// ...
}
改為最新的build.gradle3.x 的配置:Project build.gradle
檔案:
buildscript {
dependencies {
classpath `com.android.tools.build:gradle:3.0.1`
}
}
Module build.gradle
檔案:
apply plugin: `com.android.library`
android {
// ...
// add this code to enable annotationProcessor
javaCompileOptions {
annotationProcessorOptions {
includeCompileClasspath = true
}
}
}
dependencies {
// ...
// Fyber Annotations
compileOnly `com.fyber:fyber-annotations:1.3.0`
annotationProcessor `com.fyber:fyber-annotations-compiler:1.4.0`
// ...
}
更改完以上配置在build Project
後即可成功執行了。如果不能請往下看:
注意事項:
上面的Module build.gralde
的配置必須寫在使用註解所在的 Module
中!
例如我在 Module A
中的 MainActivity
使用了 @FyberSDK
的註解,那麼我將上述配置寫在Module A
的build.gralde
檔案中。
@FyberSDK
public class MainActivity extends BaseActivity<MainPresenter, MainModel> implements
IBannerDelegate, IMainView,
View.OnClickListener {
//....
}
補充相關知識
關於 apt 的介紹
1、什麼是APT?
APT(Annotation Processing Tool)是一種處理註釋的工具,它對原始碼檔案進行檢測找出其中的Annotation,根據註釋自動生成程式碼。Annotation處理器在出來Annotation時可以根據原始檔中的Annotation生成額外的原始檔和其它的檔案(檔案具體內容由Annotation處理器的編寫者決定),APT還會編譯生成的原始檔和原來的原始檔,將它們一起生成class檔案。
2、annotationProcessor
annotationProcessor是APT工具中的一種,他是google開發的內建框架,不需要引入,可以直接在build.gradle檔案中使用
3、android-apt
android-apt是由一位開發者自己開發的apt框架,原始碼託管在這裡,隨著Android Gradle 外掛 2.2 版本的釋出,Android Gradle 外掛提供了名為 annotationProcessor 的功能來完全代替 android-apt ,自此android-apt 作者在官網發表宣告最新的Android Gradle外掛現在已經支援annotationProcessor,並警告和或阻止android-apt ,並推薦大家使用 Android 官方外掛annotationProcessor。
其他
新配置 | 對應的過時配置 | 描述 |
---|---|---|
implementation | compile | module編譯時可用,module的使用者執行時可用,對於大量使用library的專案,可以顯著提高編譯時間,因為它可以減少構建系統重新編譯一些module.大多數app/test因為使用這種配置 |
api | compile | module編譯時可用,module的使用者編譯和執行時可用,這個和過時的compile一樣的。一般是library模組會使用它,如果app模組一定要使用它,必須是在它想暴露api給test模組使用 |
compileOnly | provided | module 編譯時可用,但是module的使用者,在編譯和執行時均不可用。跟過時的provided一樣的。 |
runtimeOnly | apk | module和它的使用者,執行時可用.它跟過時的apk是一樣. |
最後
別人已經試了很多關於 Android Studio 3.0的坑了
當你遇到坑時可以參考:
官方的升級3.0指南
填坑系列Android Studio 3.0配置更改