nhachicha / SnappyDB

A key-value database for Android
1.78k stars 220 forks source link

Android app crashes when Proguard is enabled. #49

Open manishkungwani opened 9 years ago

manishkungwani commented 9 years ago

Hi, I am using Proguard in my app, can you please help in adding the relevant Proguard rules? We are getting exceptions such as these:

java.lang.IllegalArgumentException: Unable to create serializer "com.c.a.c.bg" for class: com.iam.nearer.model.Interest
       at com.esotericsoftware.kryo.factories.ReflectionSerializerFactory.makeSerializer()
       at com.esotericsoftware.kryo.factories.ReflectionSerializerFactory.makeSerializer()
       at com.esotericsoftware.kryo.Kryo.newDefaultSerializer()
       at com.esotericsoftware.kryo.Kryo.addDefaultSerializer()
       at com.esotericsoftware.kryo.Kryo.register()
       at com.snappydb.internal.DBImpl.close()
       at com.iam.nearer.fragments.BestHereFragment.getAllInterestsFromDB()
       at com.iam.nearer.fragments.BestHereFragment.getDataFromLocal()
       at com.iam.nearer.fragments.BestHereFragment.onCreateView()
       at android.support.v4.app.Fragment.performCreateView()
       at android.support.v4.app.FragmentManagerImpl.throwException()
       at android.support.v4.app.FragmentManagerImpl.throwException()
       at android.support.v4.app.BackStackRecord.run()
       at android.support.v4.app.FragmentManagerImpl.makeInactive()
       at android.support.v4.app.FragmentManagerImpl.executePendingTransactions()
       at android.support.v4.app.FragmentPagerAdapter.setPrimaryItem()
       at android.support.v4.view.ViewPager.initViewPager()
       at android.support.v4.view.ViewPager.populate()
       at android.support.v4.view.ViewPager.onMeasure()
       at android.view.View.measure(View.java:17448)
       at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:727)
       at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:463)
       at android.view.View.measure(View.java:17448)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5465)
       at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
       at android.view.View.measure(View.java:17448)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5465)
       at android.support.v7.internal.widget.ActionBarOverlayLayout.onMeasure()
       at android.view.View.measure(View.java:17448)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5465)
       at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
       at android.view.View.measure(View.java:17448)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5465)
       at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
       at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
       at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
       at android.view.View.measure(View.java:17448)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5465)
       at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
       at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2560)
       at android.view.View.measure(View.java:17448)
       at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2031)
       at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1189)
       at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1402)
       at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1077)
       at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5884)
       at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
       at android.view.Choreographer.doCallbacks(Choreographer.java:580)
       at android.view.Choreographer.doFrame(Choreographer.java:550)
       at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
       at android.os.Handler.handleCallback(Handler.java:739)
       at android.os.Handler.dispatchMessage(Handler.java:95)
       at android.os.Looper.loop(Looper.java:135)
       at android.app.ActivityThread.main(ActivityThread.java:5312)
       at java.lang.reflect.Method.invoke(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:372)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
Caused by: java.lang.InstantiationException: class com.c.a.c.bg has no zero argument constructor
       at java.lang.Class.newInstance(Class.java:1563)
       at com.esotericsoftware.kryo.factories.ReflectionSerializerFactory.makeSerializer()
       at com.esotericsoftware.kryo.factories.ReflectionSerializerFactory.makeSerializer()
       at com.esotericsoftware.kryo.Kryo.newDefaultSerializer()
       at com.esotericsoftware.kryo.Kryo.addDefaultSerializer()
       at com.esotericsoftware.kryo.Kryo.register()
       at com.snappydb.internal.DBImpl.close()
       at com.iam.nearer.fragments.BestHereFragment.getAllInterestsFromDB()
       at com.iam.nearer.fragments.BestHereFragment.getDataFromLocal()
       at com.iam.nearer.fragments.BestHereFragment.onCreateView()
       at android.support.v4.app.Fragment.performCreateView()
       at android.support.v4.app.FragmentManagerImpl.throwException()
       at android.support.v4.app.FragmentManagerImpl.throwException()
       at android.support.v4.app.BackStackRecord.run()
       at android.support.v4.app.FragmentManagerImpl.makeInactive()
       at android.support.v4.app.FragmentManagerImpl.executePendingTransactions()
       at android.support.v4.app.FragmentPagerAdapter.setPrimaryItem()
       at android.support.v4.view.ViewPager.initViewPager()
       at android.support.v4.view.ViewPager.populate()
       at android.support.v4.view.ViewPager.onMeasure()
       at android.view.View.measure(View.java:17448)
       at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:727)
       at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:463)
       at android.view.View.measure(View.java:17448)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5465)
       at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
       at android.view.View.measure(View.java:17448)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5465)
       at android.support.v7.internal.widget.ActionBarOverlayLayout.onMeasure()
       at android.view.View.measure(View.java:17448)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5465)
       at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
       at android.view.View.measure(View.java:17448)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5465)
       at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
       at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
       at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
       at android.view.View.measure(View.java:17448)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5465)
       at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
       at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2560)
       at android.view.View.measure(View.java:17448)
       at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2031)
       at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1189)
       at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1402)
       at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1077)
       at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5884)
       at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
       at android.view.Choreographer.doCallbacks(Choreographer.java:580)
       at android.view.Choreographer.doFrame(Choreographer.java:550)
       at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
       at android.os.Handler.handleCallback(Handler.java:739)
       at android.os.Handler.dispatchMessage(Handler.java:95)
       at android.os.Looper.loop(Looper.java:135)
       at android.app.ActivityThread.main(ActivityThread.java:5312)
       at java.lang.reflect.Method.invoke(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:372)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
Caused by: java.lang.NoSuchMethodException: <init> []
       at java.lang.Class.getConstructor(Class.java:531)
       at java.lang.Class.getDeclaredConstructor(Class.java:510)
       at java.lang.Class.newInstance(Class.java:1561)
       at com.esotericsoftware.kryo.factories.ReflectionSerializerFactory.makeSerializer()
       at com.esotericsoftware.kryo.factories.ReflectionSerializerFactory.makeSerializer()
       at com.esotericsoftware.kryo.Kryo.newDefaultSerializer()
       at com.esotericsoftware.kryo.Kryo.addDefaultSerializer()
       at com.esotericsoftware.kryo.Kryo.register()
       at com.snappydb.internal.DBImpl.close()
       at com.iam.nearer.fragments.BestHereFragment.getAllInterestsFromDB()
       at com.iam.nearer.fragments.BestHereFragment.getDataFromLocal()
       at com.iam.nearer.fragments.BestHereFragment.onCreateView()
       at android.support.v4.app.Fragment.performCreateView()
       at android.support.v4.app.FragmentManagerImpl.throwException()
       at android.support.v4.app.FragmentManagerImpl.throwException()
       at android.support.v4.app.BackStackRecord.run()
       at android.support.v4.app.FragmentManagerImpl.makeInactive()
       at android.support.v4.app.FragmentManagerImpl.executePendingTransactions()
       at android.support.v4.app.FragmentPagerAdapter.setPrimaryItem()
       at android.support.v4.view.ViewPager.initViewPager()
       at android.support.v4.view.ViewPager.populate()
       at android.support.v4.view.ViewPager.onMeasure()
       at android.view.View.measure(View.java:17448)
       at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:727)
       at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:463)
       at android.view.View.measure(View.java:17448)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5465)
       at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
       at android.view.View.measure(View.java:17448)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5465)
       at android.support.v7.internal.widget.ActionBarOverlayLayout.onMeasure()
       at android.view.View.measure(View.java:17448)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5465)
       at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
       at android.view.View.measure(View.java:17448)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5465)
       at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
       at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
       at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
       at android.view.View.measure(View.java:17448)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5465)
       at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
       at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2560)
       at android.view.View.measure(View.java:17448)
       at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2031)
       at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1189)
       at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1402)
       at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1077)
       at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5884)
       at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
       at android.view.Choreographer.doCallbacks(Choreographer.java:580)
       at android.view.Choreographer.doFrame(Choreographer.java:550)
       at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
       at android.os.Handler.handleCallback(Handler.java:739)
       at android.os.Handler.dispatchMessage(Handler.java:95)
       at android.os.Looper.loop(Looper.java:135)
       at android.app.ActivityThread.main(ActivityThread.java:5312)
       at java.lang.reflect.Method.invoke(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:372)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)

Here are my Proguard rules:

# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in C:\Program Files\Android\android-sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

# Add any project specific keep options here:

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;
#}
# Keep our interfaces so they can be used by other ProGuard rules.
# See http://sourceforge.net/p/proguard/bugs/466/
#-keep,allowobfuscation @interface com.facebook.common.internal.DoNotStrip

# Do not strip any method/class that is annotated with @DoNotStrip
-keep @com.facebook.common.internal.DoNotStrip class *
-keepclassmembers class * {
    @com.facebook.common.internal.DoNotStrip *;
}
-dontwarn com.amazon.device.messaging.**
-dontwarn bo.app.**
-keep class bo.app.** { *; }
-keep class com.appboy.** { *; }
-keep class com.iam.nearer.model.** { *; }
#-keep class cn.pedant.** { *; }
-ignorewarnings
nhachicha commented 9 years ago

Hi @manishkungwani

According to the stack trace Kryo serializer couldn't find any default constructor for one of your class Caused by: java.lang.InstantiationException: class com.c.a.c.bg has no zero argument constructor has no zero argument constructor Caused by: java.lang.NoSuchMethodException: <init> []

please make sure your model respect the following Kryo constraints: 1- The class must have a default (no-arg) constructor. 2- The class must not have any (non-static) inner classes. 3- Any classes referenced in fields of your model class must also obey 1. and 2.

Also try this rule

-keep class com.iam.nearer.model.** {
  public protected *;
}

Checkout this blogpost http://klaas-loclet.tumblr.com/post/118370057170/using-snappydb-for-caching

Cheers,

huangcd commented 9 years ago

Hi nhachicha, any guideline on how to proguard the apk using SnappyDB (as well as Kryo)? I have the same issue and try to -keep as many class as I'm aware, but the crash still exists.

nhachicha commented 9 years ago

Hi @huangcd Do you have the same stacktrace as ?

I think the crash he is experiencing is related to the lake of the default constructor as I mentioned & not Proguard.

You should anyway exclude your model from Proguard What happen when you disable Proguard do you still have the same problem?

Can you write a small POC that reproduces this issue so I can investigate Thx