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

  • 相关阅读:
    仿360拖拽
    js 鼠标拖拽元素移动
    js 随机生成颜色
    vue多视图
    vue 全局组件的注册
    一键分享到QQ空间、QQ好友、新浪微博、微信代码
    vuex如何管理需要即时更新的全局变量
    js检测是哪个浏览器
    for in,Object.keys()与for of的用法与区别
    js三元运算符
  • 原文地址:https://www.cnblogs.com/didikee/p/7942916.html
Copyright © 2011-2022 走看看