java - 使用 jack android 重新部署后生成的类出现 ClassNotFoundException

标签 java android classnotfoundexception auto-generate generated-code

我正在使用schematic创建一个应用程序为我生成 SQL 数据库和内容提供程序的库。我还使用了一些其他库,我将在底部包含我的 gradle 文件。

当我首先部署应用程序时,它运行正常,但如果我更改代码中的某些内容(即使我只是插入日志)并重新部署应用程序,它会在启动时崩溃,并出现以下异常:

02-08 20:53:40.279 29400-29400/hu.bendaf.udacity.popularmovies.popularmoviesapp E/AndroidRuntime: FATAL EXCEPTION: main
    Process: hu.bendaf.udacity.popularmovies.popularmoviesapp, PID: 29400
    java.lang.RuntimeException: Unable to get provider hu.bendaf.udacity.popularmovies.popularmoviesapp.data.generated.MovieProvider: java.lang.ClassNotFoundException: Didn't find class "hu.bendaf.udacity.popularmovies.popularmoviesapp.data.generated.MovieProvider" on path: DexPathList[[zip file "/data/app/hu.bendaf.udacity.popularmovies.popularmoviesapp-1/base.apk"],nativeLibraryDirectories=[/data/app/hu.bendaf.udacity.popularmovies.popularmoviesapp-1/lib/arm64, /system/lib64, /vendor/lib64]]
    at android.app.ActivityThread.installProvider(ActivityThread.java:5856)
    at android.app.ActivityThread.installContentProviders(ActivityThread.java:5445)
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5384)
    at android.app.ActivityThread.-wrap2(ActivityThread.java)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1545)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6119)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
Caused by: java.lang.ClassNotFoundException: Didn't find class "hu.bendaf.udacity.popularmovies.popularmoviesapp.data.generated.MovieProvider" on path: DexPathList[[zip file "/data/app/hu.bendaf.udacity.popularmovies.popularmoviesapp-1/base.apk"],nativeLibraryDirectories=[/data/app/hu.bendaf.udacity.popularmovies.popularmoviesapp-1/lib/arm64, /system/lib64, /vendor/lib64]]
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:380)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
    at android.app.ActivityThread.installProvider(ActivityThread.java:5841)
    at android.app.ActivityThread.installContentProviders(ActivityThread.java:5445) 
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5384) 
    at android.app.ActivityThread.-wrap2(ActivityThread.java) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1545) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:154) 
    at android.app.ActivityThread.main(ActivityThread.java:6119) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 

MovieProvider 类应该与原理图库一起生成(这是在第一次部署时,但之后由于某种原因消失了)。

如果我清理项目,我可以正确部署并再次运行我的应用程序,但每次修改后清理项目非常烦人。 :)

您能帮我看看是什么原因导致了这个问题吗?

这是我的 build.gradle 文件:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    defaultConfig {
        applicationId "hu.bendaf.udacity.popularmovies.popularmoviesapp"
        minSdkVersion 15
        targetSdkVersion 25
        versionCode 2
        versionName "1.1"
        vectorDrawables.useSupportLibrary = true
        jackOptions {
            enabled true
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        targetCompatibility 1.8
        sourceCompatibility 1.8
    }
}

repositories {
    mavenCentral()
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.1.1'
    compile 'com.squareup.picasso:picasso:2.5.2'
    compile 'com.android.support:design:25.1.1'
    compile 'com.google.code.gson:gson:2.4'
    compile 'com.squareup.retrofit2:retrofit:2.1.0'
    compile 'com.squareup.retrofit2:converter-gson:2.0.2'
    compile 'com.android.support.constraint:constraint-layout:1.0.0-beta4'
    compile 'com.jakewharton:butterknife:8.5.1'
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'
    compile 'com.android.support:recyclerview-v7:25.1.1'
    compile 'com.android.support:cardview-v7:25.1.1'
    annotationProcessor 'net.simonvt.schematic:schematic-compiler:0.7.0'
    compile 'net.simonvt.schematic:schematic:0.7.0'
}

您可以在 github 上找到我的整个项目

最佳答案

我已经解决了这个问题,这是因为我使用了jack和java 1.8。当我从我的 gradle 中删除这些行(以及我的应用程序中的 lambda 函数)后,崩溃消失了:

jackOptions {
    enabled true
}
...
compileOptions {
    targetCompatibility 1.8
    sourceCompatibility 1.8
}

感谢您的帮助!

关于java - 使用 jack android 重新部署后生成的类出现 ClassNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42122840/

相关文章:

java - 如何通过方法调用在 Hibernate 中打开急切初始化

java - ClassNotFoundException:无法运行应用程序

java - 为什么我的类没有通过外部类加载器加载?

javascript - 从 GraalVM Java/Spring 运行基于 Javascript 的 CSS 缩减实用程序

java - Java中清晰的多维对象

android - 如何使用 kotlin 语言以编程方式从 Android 中的 SIM 卡获取手机号码?

android - 如何在 android 中创建以下 UI?

java - 清空后重新填充数组列表

java - 从 Fragment 启动 Activity 抛出 ClassNotFoundException

java - tomcat多线程问题