我在生产环境中遇到异常。它与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
。我没有将任何可分配的对象传递给活动。它是发射器之一。如何找到指定的哪个parcelable
Unmarshalling unknown type code -15962911 at offset 816
另外根据Crashlytics,设备状态如下:
100%接近
3%的应用程序在后台
它发生在多个操作系统版本上。
主要信息
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();
}
}
}
由于它在生产中发生,很可能是因为ProGuard混淆了Parcelable类。
尝试将此包含在ProGuard配置文件中:
-keepclassmembers class * implements android.os.Parcelable {
static ** CREATOR;
}
有关详细信息,请参阅ProGuard Manual中推荐的Android应用程序配置,并提供有关条目的详细说明。
错误:
在偏移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);
(使用上面的示例)。这是最常见问题发生的地方:
示例:您有一个类型为long的变量id
,您正在读取它像id = source.readInt();
Parcelable
中没有的值。示例:你尝试id = source.readInt();
但你忘了dest.writeInt(id);
Parcelable
从另一个也是Parcelable
的对象扩展而你忘了在读写方法中调用super。例:
@Override
public void writeToParcel(Parcel dest, int flags) {
// This is missing
super.writeToParcel(dest, flags);
}
这将保留所有Parcelable实现的特殊字段:
-keepclassmembers class * implements android.os.Parcelable {
static ** CREATOR;
}
tl; dr如果没有所有源代码,很难找到问题所在。因此,我向您提出的建议是,检查您在所提及的活动中使用的所有Parcelable
对象,并检查它们是否格式正确。