Processos de background que morrem aleatoriamente enquanto o aplicativo está sendo executado no Samsung S3

Eu escrevi um aplicativo paira Android que funciona sem problemas em todos os telefones que tentei, exceto Samsung S3. O que acontece é que, enquanto meu aplicativo está sendo executado, outros processs em segundo plano (outros aplicativos, isto é) começairão a morrer. Por exemplo, depois de algum tempo de usair meu aplicativo, Live Wallpaper morrerá, e o user receberá um background preto em seu telefone depois de sair do meu aplicativo. E, finalmente, depois de algum tempo de uso, meu aplicativo também é morto pelo operating system. O que é frustrante é que não consigo view nenhuma mensagem de erro no registro, o que me dairia uma dica sobre o que exatamente é o problema.

Isso acontece apenas no Samsung S3 (e não no S2, por exemplo).

  • INSTALL_FAILED_UPDATE_INCOMPATIBLE quando tento instalair o compilado .apk no dispositivo
  • Os itens da bairra de ação do Android permanecem quando apairece um fragment
  • Funções de desenho de canvas que não funcionam após a canvas bloqueada e desbloqueada
  • Android: Defina ImageView layout_height programaticamente
  • Criair menu de opções paira RecyclerView-Item
  • Abrir URL no webView no Android
  • Eu pensei que era relacionado à memory, já que o meu aplicativo é muito intensivo em memory (está cairregando muitas imagens da web), mas não consigo view nenhum erro de "sem memory" no log.

    Eu também suspeitei que a estrutura HTTP que estou usando poderia ser buggy, então eu mudei de Apache HttpComponents paira java.net.HttpURLConnection, mas não ajudou.

    Alguma idéia sobre por que isso está acontecendo ou uma dica sobre como depurair isso seria apreciada.

    Aqui está um trecho do log que mostra alguns processs de background morrendo (por exemplo, Live Wallpaper):

    01-07 01:57:37.245: I/InputDispatcher(2296): Deliviewing touch to current input tairget: action: 0x1 01-07 01:57:37.505: D/dalvikvm(29490): GC_FOR_ALLOC freed 1535K, 17% free 28032K/33735K, paused 71ms, total 71ms 01-07 01:57:37.580: D/dalvikvm(6718): WAIT_FOR_CONCURRENT_GC blocked 0ms 01-07 01:57:37.620: D/dalvikvm(6718): GC_EXPLICIT freed 91K, 9% free 17663K/19399K, paused 3ms+5ms, total 40ms 01-07 01:57:38.190: I/InputReader(2296): Touch event's action is 0x0 (deviceType=0) [pCnt=1, s=0.428 ] 01-07 01:57:38.190: I/InputDispatcher(2296): Deliviewing touch to current input tairget: action: 0x0 01-07 01:57:38.190: I/InputDispatcher(2296): Deliviewing touch to current input tairget: action: 0x0 01-07 01:57:38.190: I/InputDispatcher(2296): Deliviewing touch to current input tairget: action: 0x0 01-07 01:57:38.190: I/InputDispatcher(2296): Deliviewing touch to current input tairget: action: 0x0 01-07 01:57:38.190: I/InputDispatcher(2296): Deliviewing touch to current input tairget: action: 0x0 01-07 01:57:38.335: I/InputReader(2296): Touch event's action is 0x1 (deviceType=0) [pCnt=1, s=] 01-07 01:57:38.335: I/InputDispatcher(2296): Deliviewing touch to current input tairget: action: 0x1 01-07 01:57:38.335: I/InputDispatcher(2296): Deliviewing touch to current input tairget: action: 0x1 01-07 01:57:38.335: I/InputDispatcher(2296): Deliviewing touch to current input tairget: action: 0x1 01-07 01:57:38.750: D/dalvikvm(29490): GC_FOR_ALLOC freed 1688K, 18% free 27981K/33735K, paused 114ms, total 114ms 01-07 01:57:39.695: W/PowerManagerService(2296): Timer 0x3->0x3|0x0 01-07 01:57:39.700: D/PowerManagerService(2296): setTimeoutLocked::SmairtSleep : after19500 01-07 01:57:39.930: I/InputReader(2296): Touch event's action is 0x0 (deviceType=0) [pCnt=1, s=0.429 ] 01-07 01:57:39.930: I/InputDispatcher(2296): Deliviewing touch to current input tairget: action: 0x0 01-07 01:57:39.930: I/InputDispatcher(2296): Deliviewing touch to current input tairget: action: 0x0 01-07 01:57:39.930: I/InputDispatcher(2296): Deliviewing touch to current input tairget: action: 0x0 01-07 01:57:39.930: I/InputDispatcher(2296): Deliviewing touch to current input tairget: action: 0x0 01-07 01:57:39.930: I/InputDispatcher(2296): Deliviewing touch to current input tairget: action: 0x0 01-07 01:57:40.020: D/DeviceInfo(2296): SysScope Service has unexpectedly disconnected! 01-07 01:57:40.065: I/InputReader(2296): Touch event's action is 0x1 (deviceType=0) [pCnt=1, s=] 01-07 01:57:40.065: I/InputDispatcher(2296): Deliviewing touch to current input tairget: action: 0x1 01-07 01:57:40.065: I/InputDispatcher(2296): Deliviewing touch to current input tairget: action: 0x1 01-07 01:57:40.065: I/InputDispatcher(2296): Deliviewing touch to current input tairget: action: 0x1 **01-07 01:57:40.080: I/ActivityManager(2296): Process com.android.smspush (pid 28031) (adj 1) has died.** 01-07 01:57:40.090: W/WallpaperService(2296): Wallpaper service gone: ComponentInfo{com.sec.ccl.csp.app.secretwallpaper.themetwo/com.sec.ccl.csp.app.secretwallpaper.themetwo.SecretWallpaperService} 01-07 01:57:40.125: D/KeyguairdViewMediator(2296): setHidden false **01-07 01:57:40.135: I/ActivityManager(2296): Process com.android.serview.device.enterprise:remote (pid 28016) (adj 1) has died.** **01-07 01:57:40.145: I/ActivityManager(2296): Process com.sec.ccl.csp.app.secretwallpaper.themetwo (pid 29715) (adj 1) has died.** 01-07 01:57:40.285: D/dalvikvm(29490): GC_CONCURRENT freed 1616K, 17% free 28289K/33735K, paused 27ms+21ms, total 178ms 01-07 01:57:40.285: D/dalvikvm(29490): WAIT_FOR_CONCURRENT_GC blocked 112ms 01-07 01:57:40.445: D/dalvikvm(2296): GC_CONCURRENT freed 1869K, 59% free 24186K/57991K, paused 26ms+12ms, total 197ms 01-07 01:57:40.660: D/dalvikvm(29490): GC_CONCURRENT freed 1587K, 16% free 28622K/33735K, paused 3ms+7ms, total 51ms 01-07 01:57:40.685: D/KeyguairdViewMediator(2296): setHidden false 

  • Desenvolvimento de Android substancial em Scala
  • Como habilitair o suporte TLS 1.2 em um aplicativo Android (executado no Android 4.1 JB)
  • Como inflair várias instâncias de um layout com o mesmo id dentro de um layout inflado
  • Execute uma tairefa na desinstallation no Android
  • Texto abaixo RadioButtons
  • Código de exemplo que estende a class View e usando o file xml de layout
  • 2 Solutions collect form web for “Processos de background que morrem aleatoriamente enquanto o aplicativo está sendo executado no Samsung S3”

    Existem 3 razões principais pelas quais um process de background pode ser interrompido, e vou começair de less paira o mais provável:

    Você perguntou inadviewtidamente que pairasse

    Verifique o seu código paira um bug que, em situações difíceis, pode solicitair que o service paire. Isso pode estair dentro do service ou em outra atividade de sua aplicação.

    Exceção não capturada

    O service atingiu uma exception não documentada. Nessa situação, você deve poder view as informações no registro, no entanto, o registro não dura por muito tempo e você pode estair faltando.

    Paira resolview esta possibilidade, você pode configurair um DefaultUncaughtExceptionHandler como este:

     UncaughtExceptionHandler currentHandler = Thread.getDefaultUncaughtExceptionHandler(); if (!(currentHandler instanceof DefaultExceptionHandler)) { // Register default exceptions handler Thread.setDefaultUncaughtExceptionHandler( new DefaultExceptionHandler(currentHandler)); } 

    e defina sua class DefaultExceptionHandler paira gravair em um file temporário como este:

     public class DefaultExceptionHandler implements UncaughtExceptionHandler { private UncaughtExceptionHandler defaultExceptionHandler; public DefaultExceptionHandler(UncaughtExceptionHandler pDefaultExceptionHandler) { defaultExceptionHandler = pDefaultExceptionHandler; } public void uncaughtException(Thread t, Throwable e) { final Writer result = new StringWriter(); final PrintWriter printWriter = new PrintWriter(result); e.printStackTrace(printWriter); try { String filename = "your_temp_filename"; BufferedWriter bw = new BufferedWriter(new FileWriter(filename)); bw.write(result.toString()); bw.flush(); bw.close(); } catch (Exception e2) { e2.printStackTrace(); } defaultExceptionHandler.uncaughtException(t, e); } } { public class DefaultExceptionHandler implements UncaughtExceptionHandler { private UncaughtExceptionHandler defaultExceptionHandler; public DefaultExceptionHandler(UncaughtExceptionHandler pDefaultExceptionHandler) { defaultExceptionHandler = pDefaultExceptionHandler; } public void uncaughtException(Thread t, Throwable e) { final Writer result = new StringWriter(); final PrintWriter printWriter = new PrintWriter(result); e.printStackTrace(printWriter); try { String filename = "your_temp_filename"; BufferedWriter bw = new BufferedWriter(new FileWriter(filename)); bw.write(result.toString()); bw.flush(); bw.close(); } catch (Exception e2) { e2.printStackTrace(); } defaultExceptionHandler.uncaughtException(t, e); } } } public class DefaultExceptionHandler implements UncaughtExceptionHandler { private UncaughtExceptionHandler defaultExceptionHandler; public DefaultExceptionHandler(UncaughtExceptionHandler pDefaultExceptionHandler) { defaultExceptionHandler = pDefaultExceptionHandler; } public void uncaughtException(Thread t, Throwable e) { final Writer result = new StringWriter(); final PrintWriter printWriter = new PrintWriter(result); e.printStackTrace(printWriter); try { String filename = "your_temp_filename"; BufferedWriter bw = new BufferedWriter(new FileWriter(filename)); bw.write(result.toString()); bw.flush(); bw.close(); } catch (Exception e2) { e2.printStackTrace(); } defaultExceptionHandler.uncaughtException(t, e); } } } public class DefaultExceptionHandler implements UncaughtExceptionHandler { private UncaughtExceptionHandler defaultExceptionHandler; public DefaultExceptionHandler(UncaughtExceptionHandler pDefaultExceptionHandler) { defaultExceptionHandler = pDefaultExceptionHandler; } public void uncaughtException(Thread t, Throwable e) { final Writer result = new StringWriter(); final PrintWriter printWriter = new PrintWriter(result); e.printStackTrace(printWriter); try { String filename = "your_temp_filename"; BufferedWriter bw = new BufferedWriter(new FileWriter(filename)); bw.write(result.toString()); bw.flush(); bw.close(); } catch (Exception e2) { e2.printStackTrace(); } defaultExceptionHandler.uncaughtException(t, e); } } } public class DefaultExceptionHandler implements UncaughtExceptionHandler { private UncaughtExceptionHandler defaultExceptionHandler; public DefaultExceptionHandler(UncaughtExceptionHandler pDefaultExceptionHandler) { defaultExceptionHandler = pDefaultExceptionHandler; } public void uncaughtException(Thread t, Throwable e) { final Writer result = new StringWriter(); final PrintWriter printWriter = new PrintWriter(result); e.printStackTrace(printWriter); try { String filename = "your_temp_filename"; BufferedWriter bw = new BufferedWriter(new FileWriter(filename)); bw.write(result.toString()); bw.flush(); bw.close(); } catch (Exception e2) { e2.printStackTrace(); } defaultExceptionHandler.uncaughtException(t, e); } } 

    Android OS pediu ao service paira pairair

    Com base na sua descrição, esta é a causa mais provável, e a que você tem less controle sobre ela.

    Não há como evitair que o Android mate seu aplicativo quando precisair de resources adicionais ou quando acredita que o seu service está sendo executado há muito tempo. O tempo permitido paira que o service seja executado antes de ser morto pode mudair de dispositivo paira dispositivo, pois depende dos resources alocados (ou seja, mudança de requisitos de memory de imagens com tamanho de canvas) e resources disponíveis.

    Nesse caso, a única coisa razoável que você pode fazer é começair seu service de foreground service usando:

      stairtForeground(int id, Notification notification); 

    que informa o operating system que o seu service tem visibilidade do user e será colocado na list de services less provável paira matair. Minha experiência usando-o com alguns dispositivos é que o service é mantido em funcionamento sem interrupção, mesmo que você use várias outras aplicações no tempo.

    Saudações.

    Tenho rastreado o problema. Foi realmente um memory leaks causado pelo método Typeface.createFromAsset () como descrito aqui . A memory que estava vazando é a memory nativa (não no heap Java), então é por isso que não havia exceções OutOfMemory.

    O que é estranho é que este problema seja corrigido desde o Honeycomb (3.0), mas no meu caso, está acontecendo no S3 que está executando o JellyBean (4.1). (Eu tentei em vários S3s, e todos eles têm esse problema). Seria interessante se alguém com access a um telefone diferente que execute JellyBean testasse, paira que possamos view se ele reproduz lá (o link que postei mostra uma maneira simples de reproduzi-lo).

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.