Android 在proGuard之后从Bundle获取int[]]时发生ClassCastException

Android 在proGuard之后从Bundle获取int[]]时发生ClassCastException,android,proguard,classcastexception,Android,Proguard,Classcastexception,我已经在这个问题上花了好几天时间,但仍然无法理解它,也无法通过谷歌找到任何与这个问题相关的东西 在我的游戏中,我有int[8][8]array-gameFieldArray。 为了在屏幕旋转或接收呼叫等过程中保存游戏状态,我将其放入saveInstanceState(Bundle outState)中的Bundle中: 然后在onCreateI检索数组: gameFieldArray = (int[][])savedInstanceState.getSerializable(SC.SAVE_GA

我已经在这个问题上花了好几天时间,但仍然无法理解它,也无法通过谷歌找到任何与这个问题相关的东西

在我的游戏中,我有
int[8][8]
array-gameFieldArray。 为了在屏幕旋转或接收呼叫等过程中保存游戏状态,我将其放入saveInstanceState(Bundle outState)中的Bundle中

然后在
onCreate
I检索数组:

gameFieldArray = (int[][])savedInstanceState.getSerializable(SC.SAVE_GAME_FIELD);
一切都很顺利,直到我开始发布已签名的apk,并将其交给朋友进行发布前测试。 已签名的apk由proGuard使用以下设置进行处理:

-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontwarn android.support.**
-verbose

-dontoptimize
-dontpreverify

-keepattributes *Annotation*, SourceFile, LineNumberTable, Signature
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService
-keep public class * extends android.support.v4.app.Fragment
-keep public class * extends android.app.Fragment

-keepclasseswithmembernames class * {
    native <methods>;
}

-keepclasseswithmembernames class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembernames class * {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}

 -keepclassmembers public class * extends android.view.View {
  void set*(***);
  *** get*();
 }

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}

-keepclassmembers class **.R$* {
  public static <fields>;
}

#ACRA-specific:
-keep class org.acra.ACRA {
    *;
}

-keep class org.acra.ReportingInteractionMode {
    *;
}

-keepnames class org.acra.sender.HttpSender$** {
    *;
}

-keepnames class org.acra.ReportField {
    *;
}

-keep public class org.acra.ErrorReporter
{
    public void addCustomData(java.lang.String,java.lang.String);
    public void putCustomData(java.lang.String,java.lang.String);
    public void removeCustomData(java.lang.String);
}

-keep public class org.acra.ErrorReporter
{
    public void handleSilentException(java.lang.Throwable);
}
这是我从ACRA得到的:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.game.maxstr8/com.game.maxstr8.GameFieldForAI}: java.lang.ClassCastException: java.lang.Object[] cannot be cast to int[][]
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2185)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2210)
at android.app.ActivityThread.access$600(ActivityThread.java:142)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1208)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4931)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassCastException: java.lang.Object[] cannot be cast to int[][]
at com.game.maxstr8.f.<init>(GameLogic.java:36)
at com.game.maxstr8.GameField.onCreate(GameField.java:192)
at com.game.maxstr8.GameFieldForAI.onCreate(GameFieldForAI.java:24)
at android.app.Activity.performCreate(Activity.java:5008)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2139)
... 11 more
java.lang.ClassCastException: java.lang.Object[] cannot be cast to int[][]
at com.game.maxstr8.f.<init>(GameLogic.java:36)
at com.game.maxstr8.GameField.onCreate(GameField.java:192)
at com.game.maxstr8.GameFieldForAI.onCreate(GameFieldForAI.java:24)
at android.app.Activity.performCreate(Activity.java:5008)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2139)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2210)
at android.app.ActivityThread.access$600(ActivityThread.java:142)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1208)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4931)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558)
at dalvik.system.NativeStart.main(Native Method)

-正在从保存的捆绑包中检索int[][]数组。

我看不出您的Proguard配置有任何问题。然而,ACRA错误指向第36行的
GameLogic
类。也许先看看这个。GameLogic类中是否有您不想让其他人看到的专有代码(如果他们反编译您的应用程序)?如果没有,请尝试添加
-keep class.GameLogic…
,看看错误是否消失。@Chungpham我修改了问题的结尾-这就是异常发生的地方。另外:保留GameLogic几乎没有问题,但我打赌这是可以解决的-我相信proguard不会做任何坏事,因为它被广泛使用。我看不出你上面的更新有任何问题。您可以尝试保留该类并查看错误是否消失。如果没有,请访问Proguard网站,给Eric LaFortune写封短信,问他是否能帮助你。我不认为代码会出错,即使有Proguard。如果代码在其他设备上运行正常,则此手机可能存在错误。可能很难弄清楚到底是什么触发了它。您可以尝试在一个小样本应用程序中复制它。
    1) he recieves call
    2) talks, hangs up
    3) game crashes
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.game.maxstr8/com.game.maxstr8.GameFieldForAI}: java.lang.ClassCastException: java.lang.Object[] cannot be cast to int[][]
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2185)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2210)
at android.app.ActivityThread.access$600(ActivityThread.java:142)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1208)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4931)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassCastException: java.lang.Object[] cannot be cast to int[][]
at com.game.maxstr8.f.<init>(GameLogic.java:36)
at com.game.maxstr8.GameField.onCreate(GameField.java:192)
at com.game.maxstr8.GameFieldForAI.onCreate(GameFieldForAI.java:24)
at android.app.Activity.performCreate(Activity.java:5008)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2139)
... 11 more
java.lang.ClassCastException: java.lang.Object[] cannot be cast to int[][]
at com.game.maxstr8.f.<init>(GameLogic.java:36)
at com.game.maxstr8.GameField.onCreate(GameField.java:192)
at com.game.maxstr8.GameFieldForAI.onCreate(GameFieldForAI.java:24)
at android.app.Activity.performCreate(Activity.java:5008)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2139)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2210)
at android.app.ActivityThread.access$600(ActivityThread.java:142)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1208)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4931)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558)
at dalvik.system.NativeStart.main(Native Method)
gameFieldArray = (int[][])savedInstanceState.getSerializable(SC.SAVE_GAME_FIELD);