Search code examples
androidkotlinandroid-proguardfasterxml

Sigend APK with proguard gives IncompatibleClassChangeError


Im trying to run signed apk with proguard at it gives me

IncompatibleClassChangeError error during runtime on fasterxml deserialization part.

this is error log :

java.lang.IncompatibleClassChangeError: Couldn't find kotlin.Metadata.bv
at libcore.reflect.AnnotationAccess.toAnnotationInstance(AnnotationAccess.java:659)
at libcore.reflect.AnnotationAccess.annotationSetToAnnotations(AnnotationAccess.java:633)
at libcore.reflect.AnnotationAccess.getDeclaredAnnotations(AnnotationAccess.java:161)
at java.lang.Class.getDeclaredAnnotations(Class.java:743)
at com.fasterxml.jackson.databind.util.ClassUtil.findClassAnnotations(:1095)
at com.fasterxml.jackson.databind.introspect.AnnotatedClassResolver.resolveClassAnnotations(:154)
at com.fasterxml.jackson.databind.introspect.AnnotatedClassResolver.resolveFully(:118)
at com.fasterxml.jackson.databind.introspect.AnnotatedClassResolver.resolve(:69)
at com.fasterxml.jackson.databind.introspect.BasicClassIntrospector._resolveAnnotatedClass(:282)
at com.fasterxml.jackson.databind.introspect.BasicClassIntrospector.collectProperties(:192)
at com.fasterxml.jackson.databind.introspect.BasicClassIntrospector.forDeserialization(:112)
at com.fasterxml.jackson.databind.introspect.BasicClassIntrospector.forDeserialization(:16)
at com.fasterxml.jackson.databind.DeserializationConfig.introspect(:731)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer(:324)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(:264)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(:244)
at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(:142)
at com.fasterxml.jackson.databind.DeserializationContext.findRootValueDeserializer(:477)
at com.fasterxml.jackson.databind.ObjectMapper._findRootDeserializer(:4190)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(:4009)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(:3023)
at com.khcai.mifrooshe.deserializers.AppVersionHitoryModelDeserializer.a(:25)
at com.khcai.mifrooshe.networking.GetAppVersionHistoryClient.a(:39)
at com.khcai.mifrooshe.activity.HomeActivity$versionChangeLog$1.a(:277)
at com.khcai.mifrooshe.activity.HomeActivity$versionChangeLog$1.invoke(:62)
at org.jetbrains.anko.AsyncKt$doAsync$1.invoke(:140)
at org.jetbrains.anko.AsyncKt$doAsync$1.invoke()
at org.jetbrains.anko.AsyncKt$sam$Callable$761a5578.call()
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:154)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)

and my proguard setting :

-ignorewarnings
-keep class * {
    public private *;
}

-keep class kotlin.reflect.** { *; }

-keepclassmembers class ** extends com.fasterxml.jackson.databind.ser.std.** {
   public <init>(...);
}

-keepclassmembers class ** extends com.fasterxml.jackson.databind.deser.std.** {
   public <init>(...);
}


-keep class com.squareup.okhttp.** { *; }
-keep class android.support.v7.widget.** { *; }
-dontwarn com.yalantis.ucrop**
-keep class com.yalantis.ucrop** { *; }
-keep interface com.yalantis.ucrop** { *; }
-keep class org.apache.http.** { *; }

-keepattributes *Annotation*,EnclosingMethod,Signature
-keepnames class com.fasterxml.jackson.** { *; }
-dontwarn com.fasterxml.jackson.databind.**
-keep class org.codehaus.** { *; }
-keepclassmembers public final enum org.codehaus.jackson.annotate.JsonAutoDetect$Visibility {
    public static final org.codehaus.jackson.annotate.JsonAutoDetect$Visibility *; }
-keep public class your.class.** {
    public void set*(***);
    public *** get*();
}

and package list in gradle file :

  buildTypes {
        release {
            debuggable true
            minifyEnabled true
            shrinkResources true
            useProguard true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.google.firebase:firebase-core:16.0.7'
    implementation (name:'rangeseekbar-debug', ext:'aar')
    implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'com.android.support:support-core-utils:28.0.0'
    implementation "com.android.support:exifinterface:28.0.0"
    implementation 'com.android.support:support-core-ui:28.0.0'
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support:gridlayout-v7:28.0.0'
    implementation 'com.android.support:design:28.0.0'
    implementation 'com.android.support:recyclerview-v7:28.0.0'
    implementation 'com.android.support:support-v4:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    implementation "org.jetbrains.anko:anko:$anko_version"
    implementation 'com.squareup.okhttp3:okhttp:3.10.0'
    implementation 'com.google.code.gson:gson:2.8.5'
    implementation 'com.fasterxml.jackson.module:jackson-module-kotlin:2.9.8'
    implementation 'com.github.ittianyu:BottomNavigationViewEx:1.2.4'
    implementation 'com.android.support:multidex:1.0.3'
    implementation 'com.github.GrenderG:Toasty:1.2.5'
    implementation 'com.github.bumptech.glide:glide:4.6.1'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.6.1'
    implementation 'com.github.esafirm.android-image-picker:imagepicker:1.12.0'
    implementation 'org.apache.commons:commons-io:1.3.2'
    implementation 'com.github.hamsaadev:Persian-Date-Picker-Dialog:V1.2'
    implementation 'jp.wasabeef:blurry:2.1.1'
    implementation 'com.github.firdausmaulan:GlideSlider:1.3.1'
    implementation 'com.github.yalantis:ucrop:2.2.2'
    implementation('io.socket:socket.io-client:1.0.0') {
        exclude group: 'org.json', module: 'json'
    }
    implementation 'com.squareup.picasso:picasso:2.71828'
}

apply plugin: 'com.google.gms.google-services'

Project runs fine when i use debug setting or remove the proguard with set these

to minifyEnabled,shrinkResources,useProguard to false.

even this guide didnt help :

update README.md to include proguard rule for kotlin.reflect

Any advice and suggestions will be greatly appreciated.


Solution

  • If you are seeing this on a Samsung Android 5.x device then this is a duplicate of: https://stackoverflow.com/a/30355502/85472

    Additional to that answer is also this issue filed on the jackson kotlin repo.