2015-07-15 10 views
5

Zrobiłem aplikację dla systemu Android, który działa mniej więcej tak:android błąd: Nie można odczytać wejściowych deskryptorów kanał z paczki

  • Aplikacja komunikuje się z informacjami usługi sieci Web i transferów (nie pliki)
  • mogę przejść do innego ekranu i za pomocą IntentstartActivity

Niestety, czasami awarie aplikacji z powodu następującego błędu w różnej aktywności:

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:135) 
at android.view.IWindowSession$Stub$Proxy.add(IWindowSession.java:523) 
at android.view.ViewRootImpl.setView(ViewRootImpl.java:481) 
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:301) 
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:215) 
at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:140) 
at android.view.Window$LocalWindowManager.addView(Window.java:537) 
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2507) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1986) 
at android.app.ActivityThread.access$600(ActivityThread.java:123) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:137) 
at android.app.ActivityThread.main(ActivityThread.java:4424) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
at dalvik.system.NativeStart.main(Native Method) 

Ale nie wiem, co oznacza ten błąd, ponieważ nie pracuję z plikami. Dowolny pomysł?

Odpowiedz

11

To pytanie wydaje się być takie samo jak Could not read input channel file descriptors from parcel, które zostało (niepoprawnie) zamknięte jako nie na temat. Jest również mniej więcej taki sam jak Could not read input channel file descriptors from parcel crash report. Niestety te pytania nie uzyskały zadowalającej (i wystarczająco ogólnej) odpowiedzi, więc i tak spróbuję.

deskryptory plików są używane w wielu miejscach w Androidzie:

  • Gniazda (tak, połączenia sieciowe są otwarte „Pliki” zbyt);
  • Rzeczywiste pliki (niekoniecznie pliki na dyskach, mogą również być instancjami android.os.MemoryFile);
  • Pipes-Linux używa ich wszędzie, na przykład próba otwarcia potoku, która spowodowała twój wyjątek, prawdopodobnie wymagała wysłania zdarzeń wejściowych między procesem IME (klawiatura) a twoją aplikacją.

Wszystkie deskryptory podlegają shared maximum limit; kiedy liczba ta zostanie przekroczona, Twoja aplikacja zacznie doświadczać poważnych problemów z poważnymi. Posiadanie matrycy procesowej jest najlepszym scenariuszem w takim przypadku, ponieważ w przeciwnym razie jądro zabrakło pamięci (deskryptory plików są przechowywane w pamięci jądra).

Być może problemy z deskryptorami (pliki, połączenia sieciowe) nie są zamykane. Musisz je zamknąć JAK NAJSZYBCIEJ. Mogą również wystąpić problemy z wyciekami pamięci - obiekty nie są gromadzone podczas zbierania śmieci, gdy powinny (a niektóre z wyciekanych obiektów mogą z kolei przechwytywać deskryptory plików).

Twój własny kod nie musi być winny, biblioteki, których używasz, a nawet niektóre składniki systemu mogą mieć błędy, prowadzące do wycieków pamięci i wycieków deskryptorów plików. Polecam użyć Square's Leak Canary - prostej, łatwej w użyciu biblioteki do automatycznego wykrywania wycieków (co najmniej najczęstszych wycieków pamięci).

1

Przyczyną awarii może być zbyt duża aktywność urządzenia, co powoduje, że system kończy działanie deskryptorów plików. Chociaż nie możesz zadeklarować plików ani deskryptorów plików w swoim kodzie, są one używane wewnętrznie przez system, a liczba używanych zwiększa się wraz z liczbą działań, usług, wątków itp. Twój ślad stosu jest bardzo podobny do wielu śladów stosu w AOSP issue 32470. Pierwszym krokiem w kierunku rozwiązania awarii może być sprawdzenie projektu, aby potwierdzić, że nie tworzysz zbyt wielu wątków/działań/usług/itp.

Możesz także spróbować uruchomić z włączoną opcją StrictMode.VmPolicy, aby sprawdzić, czy zasoby są wyciekane.

+0

Zauważ, że 'StrictMode.VmPolicy "wykrywa tylko przecieki, które i tak są banalne, aby uniknąć (głównie te, związane z niektórymi anonimowymi klasami wewnętrznymi). Nie wykrywa w sposób niezawodny przecieków deskryptorów plików (wszystkie wykryte deskryptory są już zamknięte przed uruchomieniem komunikatu). Leak Canary robi o wiele lepszą robotę w wykrywaniu wycieków pamięci, ponieważ wykonuje analizę pełnotwarzową. – user1643723

Powiązane problemy