2013-09-02 15 views
9

Pracuję nad aplikacją dla systemu Android, która powoduje, że system operacyjny się blokuje.Jak aplikacja może zamrozić system operacyjny Android?

Moje pytanie jest raczej proste, ale po długich poszukiwaniach nie zbliżyłem się do odpowiedzi.

Pytanie brzmi, w jaki sposób aplikacja piaskowana może spowodować zawieszenie całego systemu operacyjnego Android (4.0.4, 4.1.1, 4.1.2)?

W szczególności cały system operacyjny zawiesza się. Bez logcat, bez adb, nic! Jest tak zamrożony, jak może uzyskać OS. Urządzeniem jest tablet Samsung Galaxy Tab 2. Aplikacja korzysta z UsbManager i biblioteki z usb-serial-for-android project. Chociaż biblioteka może korzystać z NDK, moja aplikacja tego nie robi. Zasadniczo aplikacja komunikuje się szeregowo z kartą własności, odbierając dane i wysyłając polecenia szeregowe. Odbywa się to na wątku roboczego, które są opróżniane w ten sposób:

try { 

     thread.interrupt(); 
     thread.join();   
     while(thread.getState() != Thread.State.TERMINATED){ 
       // wait until thread finishes 
     } 

} catch (InterruptedException e) { 
     e.printStackTrace(); 
} 

To wszystko działa dobrze, to jest aż do zamrożenia występuje - po odłączeniu kabla USB lub polecić obiekt biblioteki, aby odłączyć. Tak czy inaczej, cały system operacyjny staje się niestabilny i zamarza natychmiast lub po ponownym podłączeniu urządzenia (płyta lub komputer). Wysłałem ten problem z zamrożeniem do projektu usb-serial-for-android, ale nie otrzymałem jeszcze żadnych komentarzy. Uważam, że podążam za prawidłowymi protokołami, kiedy wyłączam urządzenie.

Rozumiem, że wiele rzeczy może pójść źle - moja aplikacja może się zawiesić. glin. Ale jak to się dzieje, że aplikacja piaskownicy powoduje awarię systemu operacyjnego - nie wydaje się być piaskownicą, jeśli może to zrobić.

UPDATE

mam po wielu eksperymentach stwierdzono, że poprzez usunięcie linii thread.interrupt();, że działa bez awarii aplikacji lub zamrożenie OS. Wciąż blokuje system operacyjny, jeśli USB jest odłączony, bez jego wcześniejszego odinstalowania.

Nadal chcę zrozumieć, jak aplikacja piaskownicy może zamrozić cały system operacyjny. Są tu komentarze, które wymykają się odpowiedzi, ale nie są odpowiedzią samą w sobie.

+1

zamrażać, ponieważ nie można nawet iść do domu za pomocą przycisku strony głównej? używasz emulatora lub prawdziwego urządzenia? jeśli używałeś urządzenia, czym jest to urządzenie? jeśli jest podłączony do komputera, co powiedział logcat? co się dzieje, co może spowodować zamrożenie? – Keale

+1

Wiele rzeczy. Musisz być bardziej konkretny. –

+1

Szukałbym ciasnej pętli z niezadowalającymi warunkami wypowiedzenia lub zachowaniem takim jak rekursywne ponowne uruchamianie się.Ponieważ jesteś * (oczywiście) * przy użyciu kontroli źródła, wycofaj do ostatniej znanej działającej wersji i krok do przodu, aby znaleźć zmiany, które powodują problem. – andy256

Odpowiedz

0

Gdzie znajduje się powyższy przykładowy kod?

Powinien znajdować się w wątku UI, potencjalnie blokując interakcje użytkownika.

Czy otrzymujesz także wiadomości ANR przed zamrożeniem?

thread.join(); 

będzie blokować w nieskończoność. Zobacz Thread.join() documentation.

Również dla mnie poniższy przykład wygląda na zajęty.

Co robisz w komentarzu? Jeśli nic, to pętla obróci się jak szalona (pomyśl while (true) { }).

while(thread.getState() != Thread.State.TERMINATED){ 
      // wait until thread finishes 
    } 
+0

Brak ANR tylko zamrożenie systemu operacyjnego. Wątki robocze służą do blokowania blokowania interfejsu użytkownika. Jak stwierdzono we wpisie, wszystko działa poprawnie, dopóki usb nie zostanie odłączony. –

+0

Przepraszam, przegapiłem twoją wzmiankę o Robotniku. Wygląda na to, że [destroy] (http://developer.android.com/reference/java/lang/Thread.html#destroy()) jest przestarzałe. Skomentuję to. Dołącz także może blokować, proponuję spróbować dołączyć (milli, nano); Również umieść w końcowym} catch (Exception e) {jako catch catch i skomentuj całą pętlę while. – stackunderflow

+0

Widziałem wiele postów zalecających proces kończenia wątku, którego używam - nie możesz zabić nici bezpośrednio (możesz, ale nie jest to zalecane), musisz powiedzieć, że już go nie potrzebujesz ('with join') i czekać - w ten sposób pętla. Przetestowałem to bez użycia biblioteki USB w scenariuszu proof-of-concept, aby odnieść sukces. Nie czekanie w pętli do czasu zakończenia wątku nie jest zalecane, ponieważ zniszczenie obiektu, który ją tworzy, powoduje, że aplikacja staje się bardzo niestabilna i głupia. –

Powiązane problemy