Search code examples
androidkotlingsonproguard

Kotlin 1.6.0 (There are no problems in 1.5.21) + Proguard + Gson (Registering an InstanceCreator with Gson...)


I have enabled Proguard and configured the rules

            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
  • For GSON I used these rules
  • added my models to exceptions (-keep class my.package.model.** { *; })
  • Also used other rules for various libraries

I have this error -> Registering an InstanceCreator with Gson for this type may fix this problem. the error occurred when switching to kotlin 1.6.0 and 1.6.10. There is no error on version Kotlin 1.5.21!

Error (I have a bug only on Kotlin 1.6.0/1.6.10. There is no error on kotlin 1.5.21) --->

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.project.main, PID: 2943
java.lang.RuntimeException: Unable to invoke no-args constructor for class com.project.main.domain.entity.MyEntityClass. Registering an InstanceCreator with Gson for this type may fix this problem.
    at com.google.gson.internal.c$e.a(SourceFile:228)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(SourceFile:212)
    at com.google.gson.Gson.h(SourceFile:963)
    at com.google.gson.Gson.j(SourceFile:928)
    at com.google.gson.Gson.l(SourceFile:877)
    at com.project.main.data.cache.converter.MyEntityClassConverter.toMyEntityClass(SourceFile:14)
    at com.project.main.data.cache.dao.MyProjectDao_Impl$21.call(SourceFile:947)
    at com.project.main.data.cache.dao.MyProjectDao_Impl$21.call(SourceFile:889)
    at k1.c$a$a$a$a.invokeSuspend(SourceFile:128)
    at uh.a.resumeWith(SourceFile:33)
    at uk.z0.run(SourceFile:106)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
    at java.lang.Thread.run(Thread.java:923)
 Caused by: java.lang.UnsupportedOperationException: Abstract class can't be instantiated! Class name: com.project.main.domain.entity.MyEntityClass
    at com.google.gson.internal.l.a(SourceFile:120)
    at com.google.gson.internal.l$a.c(SourceFile:49)
    at com.google.gson.internal.c$e.a(SourceFile:225)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(SourceFile:212) 
    at com.google.gson.Gson.h(SourceFile:963) 
    at com.google.gson.Gson.j(SourceFile:928) 
    at com.google.gson.Gson.l(SourceFile:877) 
    at com.project.main.data.cache.converter.MyEntityClassConverter.toMyEntityClass(SourceFile:14) 
    at com.project.main.data.cache.dao.MyProjectDao_Impl$21.call(SourceFile:947) 
    at com.project.main.data.cache.dao.MyProjectDao_Impl$21.call(SourceFile:889) 
    at k1.c$a$a$a$a.invokeSuspend(SourceFile:128) 
    at uh.a.resumeWith(SourceFile:33) 
    at uk.z0.run(SourceFile:106) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 
    at java.lang.Thread.run(Thread.java:923) 

I have rules for this error. -keep class com.project.main.domain.entity.MyEntityClass { ; } but I'm adding the whole package -keep class com.project.main.domain.entity.* { *; }

I also have all the other rules for GSON -> rules

  @TypeConverter
  fun toMyEntityClass(value: String): MyEntityClass = 
gson.fromJson(value, object : TypeToken<MyEntityClass>() {}.type) //Error

I also tried to prescribe just one rule. The rule helps to run the project on 1.5.21 and works. But it doesn't work on 1.6.0 - 1.6.10. I don't want to create an Instance Creator. I have too many models and I will waste a lot of time.

-keep class ** { *; }

Solution

  • The problem was solved by itself, after updating the libraries gson 2.9.0 and kotlin 2.6.21 I didn't do anything, just updated to these versions I haven't checked 1.6.0 and 1.6.10 works in tandem with gson 2.9.0 but gson didn't work with the previous release version As a result, I upgraded Kotlin from 1.5.21 -> 1.6.21