Android中ArrayMap出现null重复键异常,无法复现求排查思路
排查
java.lang.IllegalArgumentException: Duplicate key in ArrayMap: null异常 我们遇到java.lang.IllegalArgumentException: Duplicate key in ArrayMap: null异常,且无法复现该问题。已检查代码中所有使用Parcels的潜在位置,未发现实现缺陷,恳请提供排查方向或解决思路。
异常堆栈信息如下:
java.lang.IllegalArgumentException: Duplicate key in ArrayMap: null at android.util.ArrayMap.validate()(ArrayMap.java:688) at android.os.Parcel.readArrayMapInternal()(Parcel.java:3587) at android.os.BaseBundle.initializeFromParcelLocked()(BaseBundle.java:292) at android.os.BaseBundle.unparcel()(BaseBundle.java:236) at android.os.Bundle.getSparseParcelableArray()(Bundle.java:1079) at com.android.internal.policy.PhoneWindow.restoreHierarchyState()(PhoneWindow.java:2265) at android.app.Activity.onRestoreInstanceState()(Activity.java:1719) at android.app.Activity.performRestoreInstanceState()(Activity.java:1672) at android.app.Instrumentation.callActivityOnRestoreInstanceState()(Instrumentation.java:1356) at android.app.ActivityThread.handleStartActivity()(ActivityThread.java:3869) at android.app.servertransaction.TransactionExecutor.performLifecycleSequence()(TransactionExecutor.java:221) at android.app.servertransaction.TransactionExecutor.cycleToPath()(TransactionExecutor.java:201) at android.app.servertransaction.TransactionExecutor.executeLifecycleState()(TransactionExecutor.java:173) at android.app.servertransaction.TransactionExecutor.execute()(TransactionExecutor.java:97) at android.app.ActivityThread$H.handleMessage()(ActivityThread.java:2317) at android.os.Handler.dispatchMessage()(Handler.java:106) at android.os.Looper.loop()(Looper.java:246) at android.app.ActivityThread.main()(ActivityThread.java:8625) at java.lang.reflect.Method.invoke()(Method.java:-2) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run()(RuntimeInit.java:602) at com.android.internal.os.ZygoteInit.main()(ZygoteInit.java:1130)
排查方向与解决思路
- 聚焦View状态恢复流程:异常触发点在
PhoneWindow.restoreHierarchyState(),核心是Activity恢复时View状态对应的Bundle存在结构异常。重点检查自定义View的onSaveInstanceState()和onRestoreInstanceState()实现,确认是否存在往Bundle写入含null键的ArrayMap/SparseArray,或重复写入相同null键的情况。 - 系统版本兼容性分析:统计出现异常的设备系统版本,部分Android版本(如Android 10/11)的ArrayMap
validate()逻辑对null键的重复校验更严格,对比对应版本的Parcel、ArrayMap源码差异,定位系统层面的触发条件。 - 跨进程Bundle传递检查:若App存在跨进程传递Activity状态相关Bundle的场景(如多进程Service、ContentProvider交互),跨进程序列化/反序列化过程可能导致Bundle结构损坏,引发null键重复问题,需排查这类场景下的Bundle传递逻辑。
- 第三方库排查:检查项目中UI相关第三方库(如自定义控件库、状态管理库),确认是否有库在内部处理View状态时生成含重复null键的ArrayMap,可通过临时移除可疑库验证异常是否消失。
- 异常兜底与日志采集:在Activity的
onRestoreInstanceState()中捕获该异常,执行兜底逻辑(如跳过部分View状态恢复、重置页面状态)避免Crash,同时记录设备信息、恢复前的状态参数等详细日志,为后续定位提供依据。
内容的提问来源于stack exchange,提问作者mike192
相关产品推荐
相关产品推荐

