如果我离开我的应用程序并在一段时间后打开它,我会收到此异常。我的主要 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 混淆了 PagerSlidingTabStrip 的 CREATOR 成员,但由于 SavedState 是View.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/
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
我如何将像“root_path”这样的Rails路由助手作为类方法添加到像my_model.rb这样的类中?所以我的课是这样的:ClassMyModeldefself.fooreturnself.root_pathendendMyModel.foo以上不起作用,因为ClassMyModel不响应root_path这是我所知道的:我可以使用includeRails.application.routes.url_helpers,但这只会将模块的方法添加为实例方法我试过扩展Rails.application.routes.url_helpers但它没用请随时给我上课:)
在下面的片段中,是否可以从模块外部引用FOO常量,如果可以,如何?moduleXclass 最佳答案 class或classObjectdefmetaclassclass 关于ruby-类中的常量 https://stackoverflow.com/questions/2281057/
运行有问题或需要源码请点赞关注收藏后评论区留言一、利用ContentResolver读写联系人在实际开发中,普通App很少会开放数据接口给其他应用访问。内容组件能够派上用场的情况往往是App想要访问系统应用的通讯数据,比如查看联系人,短信,通话记录等等,以及对这些通讯数据及逆行增删改查。首先要给AndroidMaifest.xml中添加响应的权限配置 下面是往手机通讯录添加联系人信息的例子效果如下分成三个步骤先查出联系人的基本信息,然后查询联系人号码,再查询联系人邮箱代码 ContactAddActivity类packagecom.example.chapter07;importandroid
1.前言 在10.0的系统rom定制化开发中,在系统中有多个launcher的时候,会在开机进入launcher的时候弹窗launcher列表,让用户选择进入哪个launcher,这样显得特别的不方便所以产品开发中,要求用RoleManager的相关api来设置默认Launcher,但是在设置完默认Launcher以后,在安装一款Launcher的时候,默认Launcher就会失效,在系统设置的默认应用中Launcher选项就为空,点击home键的时候会弹出默认Launcher列表,让选择进入哪个默认Launcher.所以需要从安装Launcher的流程来分析相关的设置。来解决问题设置默认La
我正在尝试访问一个包含在模块中的各个类中的常量。作为一个基本的例子modulefoodefdo_something_to_constCONSTANT.each{...do_something...}endendclassbarincludefooCONSTANT=%w(Iwanttobeabletoaccessthisinfoo)endclassbazincludefooCONSTANT=%w(Adifferentconstanttoaccess)end由于模块的逻辑在多个类之间共享,我希望能够只引用常量(每个类的名称保持相同,但内容不同)。我将如何解决这个问题?
我想知道如何在另一个类的一个类的实例中调用一个方法。这是我想出来的classClassAdefmethodreturn"Thisisamethod_from_class_A"endendclassClassBdefinitialize@method_from_class_A=instance.methodenddefmethod_calls_method@method_from_class_Aendendinstance=ClassA.newinstance2=ClassB.newputsinstance2.method_calls_method但是我得到这个错误:Testing.rb
像下面这样在其父类下定义子类是惯例吗?classElementclassDiv还是让模块包含子类更合适?classElementendmoduleElementsclassDiv或者在一个模块中创建一个“基”类并在同一个模块中定义子类?moduleElementclassBaseendclassDiv或者强制命名约定更好?classElementendclassDivElement似乎每个库都选择不同的命名空间/命名约定。哪个最好用?各自的优缺点是什么? 最佳答案 TL;博士:最传统和最好的方法是使用包含基类及其子类的模块。但让我们
我有一个允许用户导入CSV数据的应用程序。一切正常,直到用户开始导入CSV文件中包含空白行的数据。我正在使用以下内容从CSV文件中获取行:CSV.readlines(import_file,headers:true,skip_blanks:true)我认为如果我将选项添加到skip_blanks它会这样做,但事实并非如此。关于如何忽略空白行的任何想法。谢谢! 最佳答案 这应该可行CSV.open(import_file,skip_blanks:true).reject{|row|row.all?(&:nil?)}编辑您请求了read