zoukankan      html  css  js  c++  java
  • Android Studio 升级到3.0 提示 java.lang.NoClassDefFoundError

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

  • 相关阅读:
    HDU 2544 最短路
    HDU 3367 Pseudoforest
    USACO 2001 OPEN
    HDU 3371 Connect the Cities
    HDU 1301 Jungle Roads
    HDU 1879 继续畅通工程
    HDU 1233 还是畅通工程
    HDU 1162 Eddy's picture
    HDU 5745 La Vie en rose
    HDU 5744 Keep On Movin
  • 原文地址:https://www.cnblogs.com/didikee/p/7942916.html
Copyright © 2011-2022 走看看