Android 12设备Parcel解包异常,低版本设备无此问题
Android 12设备Parcel反序列化异常解决
问题现象
仅Android 12设备出现如下异常,Android 12以下版本运行正常:
java.lang.RuntimeException: Parcel android.os.Parcel@d674dcb: Unmarshalling unknown type code 6881394 at offset 508 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3771) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3938) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2318) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:210) at android.os.Looper.loop(Looper.java:299) at android.app.ActivityThread.main(ActivityThread.java:8306) at java.lang.reflect.Method.invoke(Method.java) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:576) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1073)
相关跳转代码:
val intent= Intent(this,MyInfosActivity::class.java) var bundle = Bundle() bundle.putParcelable(STORE_DATA, storeData) intent.putExtras(bundle) startActivityForResult(intent, REQUEST_CODE_WISHLIST)
原因分析
Android 12对Parcelable的序列化/反序列化机制增加了更严格的校验,以下情况都可能触发该异常:
- Parcelable实现类中,
writeToParcel的字段写入顺序与createFromParcel的读取顺序不一致 - 自定义Parcelable类存在字段遗漏读写,或嵌套的子对象未正确实现Parcelable
- 使用
@Parcelize注解时遗漏字段,或插件版本未适配Android 12 - 反序列化时未指定正确的类加载器,导致系统无法识别自定义Parcelable类型
解决步骤
校验Parcelable实现
检查StoreData类的writeToParcel和createFromParcel方法,确保字段的读写顺序、类型完全匹配,无遗漏或多余操作。若使用@Parcelize,确认所有需要序列化的字段都被注解覆盖,且kotlin-parcelize插件版本已更新至适配Android 12的版本。检查嵌套对象
若StoreData中包含自定义子对象,确保这些子对象同样正确实现了Parcelable接口,读写逻辑无问题。指定类加载器
在接收数据的MyInfosActivity中,获取Parcelable对象前先为Bundle设置正确的类加载器:override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val bundle = intent.extras bundle?.setClassLoader(StoreData::class.java.classLoader) val storeData = bundle?.getParcelable<StoreData>(STORE_DATA) // 后续逻辑 }排查第三方依赖
若StoreData来自第三方库,尝试升级库版本至适配Android 12的最新版,避免库中Parcelable实现存在兼容性问题。
内容的提问来源于stack exchange,提问作者Alex - Exaland Concept
相关产品推荐
相关产品推荐

