java.lang.IllegalStateException:在 android.os.Parcel.readException

问题描述

我在 Android Vitals 中看到此异常:

java.lang.RuntimeException: 
  at android.app.ActivityThread.performlaunchActivity (ActivityThread.java:3303)
  at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3411)
  at android.app.ActivityThread.-wrap12 (UnkNown Source)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1994)
  at android.os.Handler.dispatchMessage (Handler.java:108)
  at android.os.Looper.loop (Looper.java:166)
  at android.app.ActivityThread.main (ActivityThread.java:7529)
  at java.lang.reflect.Method.invoke (Method.java)
  at com.android.internal.os.Zygote$MethodAndArgsCaller.run (Zygote.java:245)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:921)
Caused by: java.lang.IllegalStateException: 
  at android.os.Parcel.readException (Parcel.java:1962)
  at android.database.DatabaseUtils.readExceptionFromParcel (DatabaseUtils.java:183)
  at android.database.DatabaseUtils.readExceptionFromParcel (DatabaseUtils.java:135)
  at android.content.ContentProviderProxy.call (ContentProviderProxy.java:651)
  at android.provider.Settings$NameValueCache.getStringForUser (Settings.java:1996)
  at android.provider.Settings$Global.getStringForUser (Settings.java:10437)
  at android.provider.Settings$Global.getString (Settings.java:10426)
  at android.provider.Settings$Global.getInt (Settings.java:10608)
  at com.android.internal.policy.PhoneWindow.<init> (PhoneWindow.java:385)
  at com.android.internal.policy.HwPhoneWindow.<init> (HwPhoneWindow.java:91)
  at com.android.internal.policy.HwPolicyFactoryImpl.getHwPhoneWindow (HwPolicyFactoryImpl.java:49)
  at com.android.internal.policy.HwPolicyFactory.getHwPhoneWindow (HwPolicyFactory.java:50)
  at android.app.Activity.attach (Activity.java:7314)
  at android.app.ActivityThread.performlaunchActivity (ActivityThread.java:3233)
  at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3411)
  at android.app.ActivityThread.-wrap12 (UnkNown Source)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1994)
  at android.os.Handler.dispatchMessage (Handler.java:108)
  at android.os.Looper.loop (Looper.java:166)
  at android.app.ActivityThread.main (ActivityThread.java:7529)
  at java.lang.reflect.Method.invoke (Method.java)
  at com.android.internal.os.Zygote$MethodAndArgsCaller.run (Zygote.java:245)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:921)

如何找出原因,因为它没有引用我的任何代码

唯一的大变化是我将 .m4a 文件添加到 RAW 资源文件夹中,并将它们与 SoundPool 一起使用。我猜这与此有关,并且间歇性地在启动应用程序时崩溃。

搜索后,我发现将其添加到我的 build.gradle 文件中:

aaptOptions {
   noCompress "mp3"
}

添加了这个,用 mp3 代替 m4a。还是应该是aac?我最好使用 .wav 文件吗?谢谢。

编辑: 以下说明更清楚,即未找到资源文件。但大多数时候我运行的应用程序发现它没问题。

java.lang.RuntimeException: 
  at android.app.ActivityThread.performlaunchActivity (ActivityThread.java:3303)
  at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3411)
  at android.app.ActivityThread.-wrap12 (UnkNown Source)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1994)
  at android.os.Handler.dispatchMessage (Handler.java:108)
  at android.os.Looper.loop (Looper.java:166)
  at android.app.ActivityThread.main (ActivityThread.java:7529)
  at java.lang.reflect.Method.invoke (Method.java)
  at com.android.internal.os.Zygote$MethodAndArgsCaller.run (Zygote.java:245)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:921)
Caused by: android.content.res.Resources$NotFoundException: 
  at android.content.res.ResourcesImpl.openRawResourceFd (ResourcesImpl.java:380)
  at android.content.res.Resources.openRawResourceFd (Resources.java:1443)
  at android.media.soundPool.load (SoundPool.java:235)
  at [appname].GlobalVariables.getSoundPool (GlobalVariables.java:553)
  at [appname].MainActivity.onCreate (MainActivity.java:85)
  at android.app.Activity.performCreate (Activity.java:7383)
  at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1218)
  at android.app.ActivityThread.performlaunchActivity (ActivityThread.java:3256)
  at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3411)
  at android.app.ActivityThread.-wrap12 (UnkNown Source)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1994)
  at android.os.Handler.dispatchMessage (Handler.java:108)
  at android.os.Looper.loop (Looper.java:166)
  at android.app.ActivityThread.main (ActivityThread.java:7529)
  at java.lang.reflect.Method.invoke (Method.java)
  at com.android.internal.os.Zygote$MethodAndArgsCaller.run (Zygote.java:245)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:921)
Caused by: java.io.FileNotFoundException: 
  at android.content.res.AssetManager.openNonAssetFdNative (AssetManager.java)
  at android.content.res.AssetManager.openNonAssetFd (AssetManager.java:803)
  at android.content.res.ResourcesImpl.openRawResourceFd (ResourcesImpl.java:378)
  at android.content.res.Resources.openRawResourceFd (Resources.java:1443)
  at android.media.soundPool.load (SoundPool.java:235)
  at [appname].GlobalVariables.getSoundPool (GlobalVariables.java:553)
  at [appname].MainActivity.onCreate (MainActivity.java:85)
  at android.app.Activity.performCreate (Activity.java:7383)
  at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1218)
  at android.app.ActivityThread.performlaunchActivity (ActivityThread.java:3256)
  at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3411)
  at android.app.ActivityThread.-wrap12 (UnkNown Source)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1994)
  at android.os.Handler.dispatchMessage (Handler.java:108)
  at android.os.Looper.loop (Looper.java:166)
  at android.app.ActivityThread.main (ActivityThread.java:7529)
  at java.lang.reflect.Method.invoke (Method.java)
  at com.android.internal.os.Zygote$MethodAndArgsCaller.run (Zygote.java:245)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:921)

解决方法

它看起来像是一个平台错误,影响了应用安装后的首次运行。操作系统在提取所有 apk 内容之前启动应用程序,因此它会遇到丢失的资源。由于外部存储的工作负载不断变化(取决于当时有多少进程正在使用它),它可能会间歇性地发生。您可能会注意到启动画面可绘制对象的相同行为,尤其是当它们很大时(第一次运行应用程序时,您会在启动图像出现之前看到较长时间的白/黑屏幕 - 当设备正在解压缩文件时).

最快的解决方法是延迟加载资源,直到它准备好(通过异常处理反复检查)。

如果这不是一个选项,您可以尝试将您的资源转换为资产(java/.../res/raw -> /assets),这可能会将其推到解包队列的前面并使其可用于应用程序早点。但是,不能保证这会(一直)有效。

最后的方法是将声音文件(如果它们不是太大)作为字节数组存储在代码/类中(但这很难看)。这将确保数据与代码同时加载,早在执行之前。