Android: Parcelable исключение - PullRequest
       13

Android: Parcelable исключение

0 голосов
/ 25 октября 2018

Я получаю следующее исключение в производственной среде.Это связано с предметом продажи классов.Но это не показывает, какой класс является проблематичным.Ниже приведен подробный журнал трассировки:

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% приложение в фоновом режиме
Это происходит в нескольких версиях ОС.

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 голосов
/ 04 ноября 2018

Ошибка:

Unmarshalling неизвестного кода типа 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();

Вы пытаетесь прочитать значение, которое недоступно в вашем 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);
}
Отсутствует правило proguard:

Это сохранит специальные поля всех реализаций Parcelable:

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

tl; dr Этодовольно сложно найти в чем проблема без всего исходного кода.Поэтому я предлагаю вам проверить все свои Parcelable объекты, которые вы используете в упомянутых вами действиях, и проверить, правильно ли они сформированы.

0 голосов
/ 29 октября 2018

Поскольку это происходит в производственной среде, высока вероятность того, что это происходит из-за ProGuard обфускации Parcelable классов.

Попробуйте включить это в файл конфигурации ProGuard:

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

Для получения дополнительной информации, есть рекомендуемая конфигурация для приложений Android, доступная в Руководстве ProGuard , с подробным объяснением записей.

...