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

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

這個問題折騰了2個小時,最後解決了,Stack Overflow 上也有一次相似的問題,可是沒有人提供解答。
這個錯誤的意思是運行時沒有找到類,因此通常是你編譯經過了可是沒法運行。
寫完這個就去解答,但願更多的人看到並避免,節省你們的精力。java

解決方法

首先把方法寫出來,原由和通過和原理寫在後面,時間倉促的直接看解決方法吧。android

通常出現這個錯都是使用的provided致使的
例如,個人舊配置以下:api

Project build.gradle文件:app

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文件:ide

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後便可成功運行了。若是不能請往下看:gradle

注意事項:

上面的Module build.gralde的配置必須寫在使用註解所在的 Module 中!ui

例如我在 Module A中的 MainActivity 使用了 @FyberSDK的註解,那麼我將上述配置寫在Module Abuild.gralde 文件中。

@FyberSDK
public class MainActivity extends BaseActivity<MainPresenter, MainModel> implements
        IBannerDelegate, IMainView,
        View.OnClickListener {
        //....
        }

補充相關知識

關於 apt 的介紹

一、什麼是APT?
APT(Annotation Processing Tool)是一種處理註釋的工具,它對源代碼文件進行檢測找出其中的Annotation,根據註釋自動生成代碼。Annotation處理器在出來Annotation時能夠根據源文件中的Annotation生成額外的源文件和其它的文件(文件具體內容由Annotation處理器的編寫者決定),APT還會編譯生成的源文件和原來的源文件,將它們一塊兒生成class文件。
二、annotationProcessor
annotationProcessor是APT工具中的一種,他是google開發的內置框架,不須要引入,能夠直接在build.gradle文件中使用
三、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配置更改

相關文章
相關標籤/搜索