1. 程式人生 > >Android Studio 升級到3.0 提示 java.lang.NoClassDefFoundError

Android Studio 升級到3.0 提示 java.lang.NoClassDefFoundError

nvi mpi ogl end 其他 註意 .com ner 功能

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 Abuild.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配置更改

Android Studio 升級到3.0 提示 java.lang.NoClassDefFoundError