Android:可包裹异常

时间:2018-10-25 07:25:29

标签: android parcelable

我在生产环境中遇到异常。它与可包裹类有关。但这并没有显示哪个类是有问题的。下面是详细的日志跟踪:

Fatal Exception: java.lang.RuntimeException: Unable to start activity ComponentInfo{in.app/in.app.activity.MainActivity}: java.lang.RuntimeException: Parcel android.os.Parcel@ae3c90f: Unmarshalling unknown type code -15962911 at offset 816
   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2957)
   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)
   at android.app.ActivityThread.-wrap11(Unknown Source)
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
   at android.os.Handler.dispatchMessage(Handler.java:105)
   at android.os.Looper.loop(Looper.java:164)
   at android.app.ActivityThread.main(ActivityThread.java:6942)
   at java.lang.reflect.Method.invoke(Method.java)
   at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)

这在活动的onStart中发生。我没有将任何可包裹物品传递给活动。它是发射器之一。 如何在指定的位置找到哪个包裹
Unmarshalling unknown type code -15962911 at offset 816

同样根据Crashlytics,设备状态如下:
100%接近
3%的应用在后台
这是在多个OS版本上发生的。

MainActivity

public class MainActivity extends BaseActivity implements CleanUpDelegate,
    OnFilterAppliedListener,
    UpdatePhoneNoDialog.UpdatePhoneNoListener, GoogleApiClient.ConnectionCallbacks,
    GoogleApiClient.OnConnectionFailedListener, GenericDialogOperationListener,
    DAPopupFragment.DAPopupOperationsListener,
    OnLoginListener, HomeScreenFragmentV2.showECOOrderPopup, BottomNavigationRVAdapter.BottomNavigationItemClick

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);
        createBottomNavigation();
    }

    @Override
    protected void onStart() {
        super.onStart();
        if (mGoogleApiClient != null) {
            mGoogleApiClient.connect();
        }
    }
}

2 个答案:

答案 0 :(得分:1)

由于它是在生产中发生的,因此很有可能是因为ProGuard混淆了可打包类。

尝试将其包含在ProGuard配置文件中

-keepclassmembers class * implements android.os.Parcelable {
     static ** CREATOR;
}

有关更多信息,ProGuard Manual中提供了建议的Android应用程序配置,其中包含有关条目的详细说明。

答案 1 :(得分:0)

错误:

  

以XXXXX偏移量解组未知类型代码XXXXX

当您有一个实现格式错误的Parcelable的对象时发生。

public static final Parcelable.Creator<MyClass> CREATOR = new Parcelable.Creator<MyClass>(){

    @Override
    public MyClass createFromParcel(Parcel source){
        // The most common issues are in this constructor.
        return new MyClass(source);
    }

    @Override
    public MyClass[] newArray(int size){
        return new MyClass[size];
    }
}

当您需要重新创建Parcelable对象时,将调用return new MyClass(source);(使用上面的示例)。这是最常见的问题发生的地方:

  1. 您在某种类型上有一个变量,而您正在将其解组为另一种类型。

示例:您有一个变量id,它来自long类型,并且您正在像这样id = source.readInt();

读取它
  1. 您正在尝试读取Parcelable中不可用的值。

示例:您尝试id = source.readInt();但忘记了dest.writeInt(id);

  1. 您的Parcelable从另一个也是Parcelable的对象开始,您忘记了在读写方法中调用super。

示例:

@Override
public void writeToParcel(Parcel dest, int flags) {
    // This is missing
    super.writeToParcel(dest, flags);
}
  1. 缺少保护者规则:

这将保留所有Parcelable实现的特殊字段:

-keepclassmembers class * implements android.os.Parcelable {
     static ** CREATOR;
}

tl; dr 这很难找到没有所有源代码的问题所在。因此,我建议您检查所提及活动中使用的所有Parcelable对象,并检查它们是否格式正确。