我在生产环境中遇到异常。它与可包裹类有关。但这并没有显示哪个类是有问题的。下面是详细的日志跟踪:
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();
}
}
}
答案 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);
(使用上面的示例)。这是最常见的问题发生的地方:
示例:您有一个变量id
,它来自long类型,并且您正在像这样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
对象,并检查它们是否格式正确。