gpt4 book ai didi

android - Proguard 在 Parcelable 类中导致 RuntimeException(Unmarshalling unknown type code)

转载 作者:IT老高 更新时间:2023-10-28 21:37:45 24 4
gpt4 key购买 nike

如果我离开我的应用程序并在一段时间后打开它,我会收到此异常。我的主要 Activity 包括一个带有三个不同 fragment 的 ViewPager。我还在 Application 类中做了一些我认为与问题无关的东西。

这是个异常(exception):

RuntimeException (@Parcel:readValue:2065) {Unable to start activity ComponentInfo{com.emu/com.emu.ActivityMain}: java.lang.RuntimeException: Parcel android.os.Parcel@419526d0: Unmarshalling unknown type code 2131361816 at offset 332}

我在谷歌分析中看到很多这种异常发生在用户手机上。除了 readValue 后面的数字和 @ 后面的十六进制数字在上述异常中分别为 2065 和 419526d0 之外,它们都是相同的。

异常不指向任何代码行。我对此进行了搜索,似乎与错误的包裹书写有关。虽然我的 MainActivity 中没有任何包裹。不知道是什么原因造成的。

--- 编辑 ------------------------------------------- -----------------------------

我重现了异常。当应用程序离开主页按钮并在打开其他一些内存消耗应用程序后从内存中清除时会发生这种情况。再次启动时会发生异常。直到现在我还在想,从最近的任务或 DDMS 中关闭应用程序具有相同的效果,但显然它没有。

@EricWoodruf 帮助我找到了包裹在导入库中的某个位置。我在从网上下载的 PagerSlidingTabStrip 中找到了包裹。这是包裹相关的代码,但我真的不知道这里有什么问题:

public class PagerSlidingTabStrip extends HorizontalScrollView
{
@Override
public void onRestoreInstanceState(Parcelable state)
{
SavedState savedState = (SavedState) state;
super.onRestoreInstanceState(savedState.getSuperState());
currentPosition = savedState.currentPosition;
requestLayout();
}

@Override
public Parcelable onSaveInstanceState()
{
Parcelable superState = super.onSaveInstanceState();
SavedState savedState = new SavedState(superState);
savedState.currentPosition = currentPosition;
return savedState;
}

static class SavedState extends BaseSavedState
{
int currentPosition;

public SavedState(Parcelable superState)
{
super(superState);
}

private SavedState(Parcel in)
{
super(in);
currentPosition = in.readInt();
}

@Override
public void writeToParcel(Parcel parcel, int flags)
{
super.writeToParcel(parcel, flags);
parcel.writeInt(currentPosition);
}

public static final Parcelable.Creator<SavedState> CREATOR = new Parcelable.Creator<SavedState>()
{
@Override
public SavedState createFromParcel(Parcel in)
{
return new SavedState(in);
}

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

---- 编辑 2 ----------------------------------------- ------------------------------------

在我可以重现该问题后,我发现这只发生在由我的 key 签名并经过保护的 Artifact 中!调试的没有问题!

我在神器上禁用了 proguard,它毫无异常(exception)地像一个护身符一样工作。但是,什么 proguard 会导致这个问题?

我尝试将其添加到 proguard 但没有奏效:

-keep class toolfa.android.base.ui.PagerSlidingTabStrip { *; }
-dontwarn toolfa.android.base.ui.PagerSlidingTabStrip

这是我当前的 proguard 配置:

-keep class com.nineoldandroids.** { *; }
-dontwarn com.nineoldandroids.**

-keep class ir.adad.** { *; }
-dontwarn ir.adad.**

-keep class android.support.v4.** { *; }
-dontwarn android.support.v4.**

-keep class toolfa.android.base.ui.PagerSlidingTabStrip { *; }
-dontwarn toolfa.android.base.ui.PagerSlidingTabStrip

-keep class toolfa.android.sega.ActivityEmulator { *; }
-keep class toolfa.android.sega.Zip { *; }

最佳答案

正如我们在评论中发现的,异常是 ProGuard 的结果。混淆 Parcelable 类。修复方法是在 ProGuard 配置文件中包含此代码段:

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

我猜这里的具体问题是 ProGuard 混淆了 PagerSlidingTabStripCREATOR 成员,但由于 SavedStateView.BaseSavedState ,父类(super class)成员仍然可用(这就是它没有抛出 BadParcelableException 的原因),但是它使用了不同的数据结构并且没有将自定义属性写入 Parcel 输出。

ProGuard Manual 中提供了适用于 Android 应用程序的推荐配置。 ,并附有关于条目的详细说明。例如,它包括您应该保留 list 或其他 XML 文件中使用的所有类名。

关于android - Proguard 在 Parcelable 类中导致 RuntimeException(Unmarshalling unknown type code),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21342700/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com