0

Я создаю приложение с библиотекой schematic, создающей для меня базу данных SQL и поставщика контента. Я также использую кучу других библиотек, я буду включать в себя мой файл gradle внизу.ClassNotFoundException с сгенерированным классом после повторного развертывания с помощью jack android

Когда я раскрываю мое приложение первым, он работает правильно, но если я что-то изменить в коде (даже если я просто вставить журнал) и перераспределять приложение он выходит из строя при запуске со следующим исключением:

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

+0

Привет, я сделал (почти) такое же приложение по udacity. Я использовал схему, и она работает хорошо. Почему вы используете «annotationProcessor» вместо «compile» в файле gradle для библиотеки schematic-compiler? (Я использовал «компиляцию»). Вы пытались его изменить? –

+0

ну, я просто скопировал две строки из файла readme библиотеки схемы. Я просто попробовал это с компиляцией, но это не решает проблему :( – bendaf

ответ

1

Я решил эту проблему, это потому, что я использовал домкрат и Java 1.8. После того, как я удалил эти строки из моего Gradle (и лямбда-функции из моего приложения) аварии исчезли:

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

Спасибо за помощь!

0

Это может быть из-за минификация, сделанный ProGuard. Вы должны указать вручную, чтобы игнорировать внешние библиотеки от получения минимума.

Вы можете указать его в proguard-rules.pro файл, как это ..

-keep class com.package.** { *; } 

here Подробнее ..

+0

Я поместил это в свой файл proguard-rules.pro, но это не решило проблему :( '-keep class hu. bendaf.udacity.popularmovies.popularmoviesapp.data.generated. ** {*;} ' – bendaf

+0

Добавьте это ' -keep class hu.bendaf.udacity. ** {*;} ' – Msp

+0

Попробуйте также и для других внешних библиотек. , вы должны сохранить классы из 'com.android'. – Msp