doubledotlabs / doki

An Android library that displays information from dontkillmyapp.com to users in a clean and presentable manner.
https://jitpack.io/#dev.doubledot/doki
MIT License
169 stars 16 forks source link

crash only in release mode #12

Closed westlinkin closed 2 years ago

westlinkin commented 2 years ago

Great work!

I implement this library into Flutter. When in debug mode, it goes well, but after I built it in release mode, it crashes.

Here is the log caught by Crashlytics:

Fatal Exception: java.lang.ExceptionInInitializerError
       at retrofit2.converter.gson.GsonConverterFactory.create(GsonConverterFactory.java)
       at dev.doubledot.doki.api.remote.DokiApiService$Companion.create(DokiApiService.java:12)
       at dev.doubledot.doki.api.tasks.DokiApi$dokiApiService$2.invoke(DokiApi.java:2)
       at dev.doubledot.doki.api.tasks.DokiApi$dokiApiService$2.invoke(DokiApi.java)
       at kotlin.SynchronizedLazyImpl.getValue(SynchronizedLazyImpl.java:20)
       at dev.doubledot.doki.api.tasks.DokiApi.getDokiApiService(DokiApi.java:7)
       at io.reactivex.Observable.subscribe(Observable.java:5)
       at dev.doubledot.doki.api.tasks.DokiApi.getManufacturer(DokiApi.java:5)
       at dev.doubledot.doki.views.DokiContentView.loadContent(DokiContentView.java:21)
       at dev.doubledot.doki.ui.DokiActivity.onCreate(DokiActivity.java:52)
       at android.app.Activity.performCreate(Activity.java:8109)
       at android.app.Activity.performCreate(Activity.java:8083)
       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1310)
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3474)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3661)
       at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
       at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
       at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2108)
       at android.os.Handler.dispatchMessage(Handler.java:106)
       at android.os.Looper.loop(Looper.java:236)
       at android.app.ActivityThread.main(ActivityThread.java:7876)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:656)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:967)

Caused by java.lang.RuntimeException: Missing type parameter.
       at com.google.gson.reflect.TypeToken.getSuperclassTypeParameter(TypeToken.java:3)
       at com.google.gson.Gson$1.<init>(Gson.java)
       at com.google.gson.Gson.<clinit>(Gson.java:2)
       at retrofit2.converter.gson.GsonConverterFactory.create(GsonConverterFactory.java)
       at dev.doubledot.doki.api.remote.DokiApiService$Companion.create(DokiApiService.java:12)
       at dev.doubledot.doki.api.tasks.DokiApi$dokiApiService$2.invoke(DokiApi.java:2)
       at dev.doubledot.doki.api.tasks.DokiApi$dokiApiService$2.invoke(DokiApi.java)
       at kotlin.SynchronizedLazyImpl.getValue(SynchronizedLazyImpl.java:20)
       at dev.doubledot.doki.api.tasks.DokiApi.getDokiApiService(DokiApi.java:7)
       at io.reactivex.Observable.subscribe(Observable.java:5)
       at dev.doubledot.doki.api.tasks.DokiApi.getManufacturer(DokiApi.java:5)
       at dev.doubledot.doki.views.DokiContentView.loadContent(DokiContentView.java:21)
       at dev.doubledot.doki.ui.DokiActivity.onCreate(DokiActivity.java:52)
       at android.app.Activity.performCreate(Activity.java:8109)
       at android.app.Activity.performCreate(Activity.java:8083)
       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1310)
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3474)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3661)
       at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
       at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
       at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2108)
       at android.os.Handler.dispatchMessage(Handler.java:106)
       at android.os.Looper.loop(Looper.java:236)
       at android.app.ActivityThread.main(ActivityThread.java:7876)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:656)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:967)

I'm thinking maybe caused by obfuscate problem?

westlinkin commented 2 years ago

Need to add this line -keep class com.google.gson.** { *; } into proguard config file

adlawan commented 2 years ago

Ok

samu-developments commented 1 year ago

With release of R8 full mode I had to add the retrofit proguard rules manually from here https://github.com/square/retrofit/blob/master/retrofit/src/main/resources/META-INF/proguard/retrofit2.pro in addition to

-keep class com.google.gson.reflect.TypeToken
-keep class * extends com.google.gson.reflect.TypeToken
-keep public class * implements java.lang.reflect.Type