java.lang.RuntimeException:无法从parcel中读取input通道文件描述符

我正在使用crashlytics来跟踪我的应用程序的崩溃。 有一个很难弄明白的错误。 crashlytics的堆栈跟踪如下:

java.lang.RuntimeException: Could not read input channel file descriptors from parcel. at android.view.InputChannel.nativeReadFromParcel(InputChannel.java) at android.view.InputChannel.readFromParcel(InputChannel.java:148) at android.view.InputChannel$1.createFromParcel(InputChannel.java:39) at android.view.InputChannel$1.createFromParcel(InputChannel.java:36) at com.android.internal.view.InputBindResult.<init>(InputBindResult.java:62) at com.android.internal.view.InputBindResult$1.createFromParcel(InputBindResult.java:102) at com.android.internal.view.InputBindResult$1.createFromParcel(InputBindResult.java:99) at com.android.internal.view.IInputMethodManager$Stub$Proxy.windowGainedFocus(IInputMethodManager.java:851) at android.view.inputmethod.InputMethodManager.startInputInner(InputMethodManager.java:1292) at android.view.inputmethod.InputMethodManager.onWindowFocus(InputMethodManager.java:1518) at android.view.ViewRootImpl$ViewRootHandler.handleMessage(ViewRootImpl.java:3550) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:157) at android.app.ActivityThread.main(ActivityThread.java:5293) at java.lang.reflect.Method.invokeNative(Method.java) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081) at dalvik.system.NativeStart.main(NativeStart.java) 

我知道这里有一个类似的问题。 但是有一点不同。 而作为crashlytics的统计,崩溃主要发生在三星android手机。

我是新来的机器人,不知道为什么崩溃发生,以及如何解决这种崩溃。

任何build议将不胜感激。

Solutions Collecting From Web of "java.lang.RuntimeException:无法从parcel中读取input通道文件描述符"

认为这是一个非常广泛的领域,可能会有很多情况可以触发这个系统级别的exception。 但也许这个例子是如何固定在一个特定的项目可以帮助某人。

我遇到了类似的例外情况:
三星手机上的"Could not read input channel file descriptors from parcel"

 java.lang.RuntimeException: Could not read input channel file descriptors from parcel. at android.view.InputChannel.nativeReadFromParcel(Native Method) at android.view.InputChannel.readFromParcel(InputChannel.java:148) at android.view.IWindowSession$Stub$Proxy.addToDisplay(IWindowSession.java:690) at android.view.ViewRootImpl.setView(ViewRootImpl.java:525) at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:269) at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69) at android.widget.Toast$TN.handleShow(Toast.java:402) at android.widget.Toast$TN$1.run(Toast.java:310) at android.os.Handler.handleCallback(Handler.java:730) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:5103) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:525) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) at dalvik.system.NativeStart.main(Native Method) 

这发生在一个大的旧项目,我得到维护,这个浮动错误发生只有几个小时后。 我花了相当长的时间,也读了一些关于它的相关答案,除了它是Android的系统级错误外,没有线索,在内存中应该有一些额外的数据或对象或大对象的副本:

https://code.google.com/p/android/issues/detail?id=32470

我能想到的最后一件事是SoundPool。 这个项目并没有太多的用处 – 不时有超过10个不同的声音播放。
但这是根本原因! 有时,SoundPool会出现浮动exception, "unable to load sample (null)" 。 这有助于认识到SoundPool被错误地使用了:

 public void play(int rscId) { ... final int soundId = soundPool.load(mContext, rscId, 1); ... soundPool.play(soundId, volume, volume, 5, 0, 1f); 

所以生成新的id,并且每次应用程序调用播放声音方法时都会重新载入声音资源! 经过一段时间后,一些不相关的exception开始发生,直到应用程序崩溃, "Could not read input channel file descriptors from parcel"exception。
有趣的是,其中一个不相关的例外是:
"ExceptionHandled in unable to open database file (code 14)"

 ExceptionHandled in unable to open database file (code 14) android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file (code 14) at android.database.sqlite.SQLiteConnection.nativeExecuteForCursorWindow (Native Method) at android.database.sqlite.SQLiteConnection.executeForCursorWindow (SQLiteConnection.java:845) 

当然这与数据库和面包/包裹无关。 针对特定情况的修复非常简单:只需按照Android文档中的build议预先加载所有声音即可:

http://developer.android.com/reference/android/media/SoundPool.html

“加载逻辑通过调用相应SoundPool.load() function的声音列表进行迭代,这通常应该在stream程的早期完成,以便在需要播放之前有时间将audio解压为原始PCM格式。
一旦声音加载并开始播放,应用程序可以通过调用SoundPool.play()来触发声音。

所以我soundPool.load() out from play() method移除了soundPool.load() out from play() method并且exception:
"Could not read input channel file descriptors from parcel"已经消失,以及"unable to open database file (code 14)"的exception。

 public void play(int soundId) { ... soundPool.play(soundId, volume, volume, 5, 0, 1f); 

soundPool.release(); soundPool = null 当不需要的时候也应该调用soundPool.release(); soundPool = null 。 也许这也可以对这种例外产生影响,详情请看这里

无法从宗地读取input通道文件描述符

很可能这不是原来问题的确切情况,但希望能够提供一些信息进一步挖掘。 即寻找一些额外的例外,吞食exception,或错误的文件/数据处理。

我正在寻找很长一段时间的答案,例如在这个例外情况下面临的其他问题。

正如我所看到的,这种崩溃也可以通过与InputMethodManager工作的普通TextViewEditText来触发:

 java.lang.RuntimeException: Could not read input channel file descriptors from parcel. at android.view.InputChannel.nativeReadFromParcel(Native Method) at android.view.InputChannel.readFromParcel(InputChannel.java:148) at android.view.InputChannel$1.createFromParcel(InputChannel.java:39) at android.view.InputChannel$1.createFromParcel(InputChannel.java:36) at com.android.internal.view.InputBindResult.<init>(InputBindResult.java:68) at com.android.internal.view.InputBindResult$1.createFromParcel(InputBindResult.java:112) at com.android.internal.view.InputBindResult$1.createFromParcel(InputBindResult.java:109) at com.android.internal.view.IInputMethodManager$Stub$Proxy.startInput(IInputMethodManager.java:697) at android.view.inputmethod.InputMethodManager.startInputInner(InputMethodManager.java:1407) at android.view.inputmethod.InputMethodManager.checkFocus(InputMethodManager.java:1518) at android.view.inputmethod.InputMethodManager.restartInput(InputMethodManager.java:1286) at android.widget.TextView.setText(TextView.java:4718) at android.widget.TextView.setText(TextView.java:4656) at android.widget.TextView.append(TextView.java:4330) at android.widget.TextView.append(TextView.java:4320) ... 

TextView附加文本时,它会使文本变为Editable ,并启动InputMethodManager 。 但此时InputMethod进程出现问题,导致无法创build从包中读取错误的InputBindResult

在这种情况下,解决方法非常简单:不要直接在textview上调用append,使用StringBuilderSpannableStringBuilder构build文本并调用TextView.setText(text)

以前的用户已经评论说,这可能是一个难以追查的错误。 我通过构build一个自定义的警告对话框(包含多个TextView对象)在一个while循环副本if语句内引起了这一点。 显示对话框之前,应用程序崩溃。

我最近遇到这个问题。

 java.lang.RuntimeException: Could not read input channel file descr iptors from parcel. 

我search日志查找以下信息:

01-01 09:07:52.164 5162 6777 W zygote64:ashmem_create_region失败'间接参考表':打开的文件过多

问题是,我反复创buildHandlerThread,但不要做它的quit()方法,最后导致fd泄漏。

我得到这个错误是因为在Activity启动时(对于列表视图中的每一行)运行了太多的查询。 因为我试图在执行查询时重新打开相同的活动。

修复:我只运行一个查询的列表视图。