Подтвердить что ты не робот

Java.lang.RuntimeException: Не удалось прочитать дескрипторы файла входного канала из пакета

Я использую 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)

Я знаю, что есть один подобный вопрос об этом здесь. Но есть немного другое. И как статистика от краштитики, авария происходит главным образом в телефоне SAMSUNG android.

Я новичок в андроиде и не знаю, почему произошел сбой и как устранить этот крах.

Любое предложение было бы очень оценено.

4b9b3361

Ответ 1

Думайте, что это очень широкая область, и может быть много ситуаций, которые могут вызвать это исключение на системном уровне. Но, возможно, этот пример того, как он был исправлен в конкретном проекте, может помочь кому-то.

Я испытал подобное исключение:
"Could not read input channel file descriptors from parcel" на телефоне Samsung:

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)

Это произошло в большом старом проекте, который я получил для обслуживания, и эта плавающая ошибка произошла только через несколько часов. Я потратил довольно много времени на это, а также прочитал некоторые связанные ответы на SO в отношении этого и не имел понятия, кроме того, что это ошибка системного уровня Android, и в памяти должны быть дополнительные данные или дубликаты объектов или больших объектов и т.д.:

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

Последнее, о чем я мог подумать, это SoundPool. Он не очень много использовал в проекте - время от времени воспроизводится не более 10 различных звуков.
Но это была первопричина! Иногда из SoundPool "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);

Итак, был создан новый идентификатор, и звуковой ресурс перезагружался каждый раз, когда приложение называлось звуковым методом воспроизведения! И через некоторое время некоторые независящие исключения начали происходить до тех пор, пока приложение не завершилось с исключением "Could not read input channel file descriptors from parcel".
Интересно, что одно из этих не связанных исключений: "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:

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

"Логика загрузки повторяется через список звуков, вызывающих соответствующий SoundPool.load() function. Обычно это делается на раннем этапе процесса, чтобы предоставить время для распаковки аудио в необработанный формат PCM, прежде чем они понадобятся для воспроизведения.
Как только звук загрузится и начнется воспроизведение, приложение может запускать звуки, вызывая SoundPool.play(). "

Итак, я переместил soundPool.load() out from play() method и исключение:
"Could not read input channel file descriptors from parcel" прошло, а также исключение "unable to open database file (code 14)".

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

И soundPool.release(); soundPool = null следует вызывать, когда он больше не нужен. И, возможно, это также может повлиять на такие исключения, см. Подробности здесь.

Не удалось прочитать дескрипторы файла входного канала из пакета

Скорее всего, это не точная ситуация для исходного вопроса, но надеюсь, что он может дать некоторую информацию, чтобы копать дальше. То есть поиск некоторых дополнительных исключений, проглатывание исключений или неправильные файлы/обработка данных.

Ответ 2

Я ищу ответ в течение долгого времени, например, другие, сталкивающиеся с этим исключением.

Как я вижу, этот сбой также может быть вызван исключительным TextView или EditText, который работает с InputMethodManager:

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, и это приводит к сбою в создании InputBindResult, который считывает ошибку из посылки.

В этом случае обходной путь очень прост: не вызывайте append on textview напрямую, используйте StringBuilder или SpannableStringBuilder для создания текста и вызывайте TextView.setText(text) вместо этого!

Ответ 3

Предыдущие пользователи отметили, что это может быть сложной ошибкой для отслеживания. Я вызвал это, создав диалоговое окно настраиваемого предупреждения (содержащее несколько объектов TextView) внутри инструкции while для цикла . Приложение разбилось перед отображением диалогового окна (ов).

Ответ 4

Я недавно встречал эту проблему.

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

Я ищу в журнале следующую информацию:

01-01 09: 07: 52.164 5162 6777 W zygote64: ashmem_create_region не удалось для "косвенной таблицы ref": слишком много открытых файлов

Проблема заключается в том, что я неоднократно создаю HandlerThread, но не делаю этого метода quit(), наконец, результат в fd утечка.

Ответ 5

Я получил эту ошибку из-за запуска слишком большого количества запросов при запуске Activity (для каждой строки в виде списка). Поскольку я пытался повторно открыть ту же активность, пока выполнялись запросы.

Исправление: я выполнил только один запрос для списка.