Infelizmente, o MyApp parou. Como posso resolver isso?
Estou desenvolvendo um aplicativo e sempre que o executo, recebo a mensagem:
Infelizmente, MyApp parou.
O que posso fazer para resolver isso?
Sobre esta questão - obviamente inspirado em O que é rastreamento de pilha e como posso usá-lo para depurar meus erros de aplicativo? , há muitas perguntas informando que o aplicativo travou, sem maiores detalhes. Esta pergunta tem como objetivo instruir os programadores Android novatos sobre como tentar resolver seus próprios problemas ou fazer as perguntas certas.
Respostas
Esta resposta descreve o processo de recuperação do rastreamento de pilha. Já tem o rastreamento de pilha? Leia sobre os rastreamentos de pilha em " O que é rastreamento de pilha e como posso usá-lo para depurar meus erros de aplicativo? "
O problema
Seu aplicativo foi encerrado porque um não capturado RuntimeException
foi lançado.
O mais comum deles é o NullPointerException
.
Como resolver isso?
Cada vez que um aplicativo Android trava (ou qualquer aplicativo Java para esse assunto), um Stack trace
é gravado no console (neste caso, logcat). Este rastreamento de pilha contém informações vitais para resolver seu problema.
Android Studio
Na barra inferior da janela, clique no Logcat
botão. Alternativamente, você pode pressionar alt+ 6. Certifique-se de que seu emulador ou dispositivo esteja selecionado no Devices
painel. Em seguida, tente encontrar o rastreamento de pilha, que é mostrado em vermelho. Pode haver muitas coisas registradas no logcat, então você pode precisar rolar um pouco. Uma maneira fácil de encontrar o rastreamento de pilha é limpar o logcat (usando a lixeira à direita) e deixar o aplicativo travar novamente.
Encontrei o rastreamento de pilha, e agora?
Yay! Você está no meio do caminho para resolver seu problema.
Você só precisa descobrir o que exatamente fez seu aplicativo travar, analisando o rastreamento de pilha.
Leia sobre os rastreamentos de pilha em " O que é rastreamento de pilha e como posso usá-lo para depurar meus erros de aplicativo? "
Ainda não consigo resolver o meu problema!
Se você encontrou o seu Exception
e a linha onde ocorreu e ainda não consegue descobrir como corrigi-lo, não hesite em fazer uma pergunta no StackOverflow.
Tente ser o mais conciso possível: poste o rastreamento da pilha e o código relevante (por exemplo, algumas linhas até a linha que gerou o Exception
).
Você pode usar ferramenta ADB do Google para obter Logcat file
para analisar a questão.
adb logcat > logcat.txt
abra o logcat.txt
arquivo e pesquise o nome do seu aplicativo. Deve haver informações sobre o motivo da falha, o número da linha, o nome da classe, etc.
Primeiro, você verifica em qual ponto seu aplicativo travou ( Unfortunately, MyApp has stopped.
). Para isso, você pode usar Log.e("TAG", "Message");
, nesta linha, você pode ver o log do seu aplicativo no logcat.
Depois disso, você descobre qual ponto seu aplicativo parou é muito fácil de resolver ao seu lado.
Basta verificar o erro no log cat.
Você obtém a opção log cat no eclipse:
janela-> mostrar visualização-> outros-> Android-> Logcat
O gato de registro contém erro.
Caso contrário, você também pode verificar o erro executando um aplicativo no modo de depuração. Em primeiro lugar, defina o ponto de interrupção depois disso, fazendo:
clique com o botão direito em projeto-> depurar como-> aplicativo Android
Observação: esta resposta está usando o Android Studio 2.2.2
Nota 2: Estou considerando que seu dispositivo foi conectado com sucesso.
A primeira coisa que você faz quando seu aplicativo trava é olhar para o LogCat, na parte inferior do Android Studio há uma barra de ferramentas com uma lista de menus:
Clique em "Monitor Android" (o que sublinhei na imagem acima. ^)
Agora, você obterá algo assim:
Altere " Verbose
" para " Error
" Agora só mostrará os erros registrados. Não se preocupe com todos esses erros (se você os tiver) agora.
Está bem. Agora, faça o que você fez para travar seu aplicativo. Depois que seu aplicativo travar, vá para o logcat. Você deve encontrar um novo log de travamento que contém muitos at:x.x.x
: e Caused by: TrumpIsPresidentException
por exemplo. Vá para essa Caused by:
declaração em seu logcat.
Ao lado disso Caused By:
, deve haver a Exceção que aconteceu. No meu caso, é um RuntimeException
e abaixo dele deve haver uma linha que contém um link azul , como:
SeCaused by:
NÃO houver uma linha com um texto azul em algum lugar abaixo dela, procure outra Caused by:
que tenha.
Clique no link azul . Deve levá-lo ao local onde o problema ocorreu. No meu caso, foi devido a esta linha:
throw new RuntimeException();
Então, agora eu sei por que ele está travando. É porque eu mesmo estou lançando a exceção. Este foi um erro óbvio .
No entanto, digamos que recebi outro erro:
java.lang.NullPointerException
Verifiquei meu logcat, cliquei no link azul que ele me forneceu e me trouxe até aqui:
mTextView.setText(myString);
Então, agora eu quero depurar. De acordo com esta pergunta StackOverflow , um NullPointerException diz que algo é null
.
Então, vamos descobrir o que é nulo . Existem duas possibilidades. Ou mTextView
é nulo ou myString
é nulo. Para descobrir, antes da mTextView.setText(mString)
linha, adiciono estas duas linhas:
Log.d("AppDebug","mTextView is null: " + String.valueOf(mTextView == null);
Log.d("AppDebug","myString is null: " + String.valueOf(myString== null);
Agora, como fizemos anteriormente (alteramos Verose para Erro), queremos alterar "Erro" para "Depurar". Já que estamos registrando por depuração. Aqui estão todos os métodos de registro:
Log.
d means Debug
e means error
w means warning
v means verbose
i means information
wtf means "What a terrible failure". This is similar to Log.e
Então, como usamos Log.d
, estamos verificando Debug. É por isso que mudamos para depurar.
Notice Log.d
tem um primeiro parâmetro, em nosso caso "AppDebug". Clique no menu suspenso "Sem filtros" no canto superior direito do logcat. Selecione "Editar Configuração do Filtro", dê um nome ao seu filtro e em "Log Tag" coloque "App Debug". Clique OK". Agora, você deve ver duas linhas no logcat:
yourPackageNameAndApp: mTextView is null: true
yourPackageNameAndApp: myString is null: false
Portanto, agora sabemos que mTextView é nulo.
Observo meu código, agora percebo algo.
Tenho private TextView mTextView
declarado no topo da minha classe. Mas, eu não estou definindo isso.
Basicamente, esqueci de fazer isso no meu onCreate ():
mTextView = (TextView) findViewById(R.id.textview_id_in_xml);
É por ISSO que mTextView
é nulo, porque esqueci de dizer ao meu aplicativo o que é. Então, adiciono essa linha, executo meu aplicativo e agora o aplicativo não trava.
Este pop-up é exibido apenas quando você obtém uma exceção fatal em seu código que interrompe a execução do aplicativo. Pode ser qualquer exceção NullPointerException
, OutOfMemoryException
etc.
A melhor maneira de verificar é por meio do Logcat se você ainda estiver desenvolvendo o aplicativo no Android Studio, que é uma maneira rápida de ler o rastreamento da pilha e verificar a causa do aplicativo.
Se seu aplicativo já estiver ativo, você não pode usar o logcat . Portanto, para isso você pode implementar Crashlytics
para fornecer relatórios de bug de qualquer exceção que ocorra.
Verifique sua Logcat
mensagem e veja seu Manifest
arquivo. Deve haver algo faltando, como definir a Activity,
permissão do usuário, etc.
Você pode usar qualquer uma destas ferramentas:
adb logcat
adb logcat> logs.txt (você pode usar editores para abrir e pesquisar erros).
eclipse logcat (se não estiver visível no eclipse, vá para Windows-> Mostrar Visualização-> Outros-> Android-> LogCat)
Android Debug Monitor ou Android Device Monitor (digite command monitor ou abra através da IU)
- Android Studio
Eu sugiro usar o Android Debug Monitor , é bom. Porque eclipse trava quando muitos logs estão lá, e através do filtro adb logcat e tudo é difícil.
Você tem que verificar o Stack trace
Como fazer isso?
em seu IDE Verifique as janelas do formulário LOGCAT
Se você não consegue ver as janelas do logcat, vá para este caminho e abra-o
window->show view->others->Android->Logcat
se você estiver usando Google-Api vá para este caminho
adb logcat> logcat.txt
No método showToast () a seguir, você deve passar outro parâmetro para o contexto ou contexto do aplicativo, para que possa experimentá-lo.
public void showToast(String error, Context applicationContext){
LayoutInflater inflater = getLayoutInflater();
View view = inflater.inflate(R.layout.custom_toast, (ViewGroup)
findViewById(R.id.toast_root));
TextView text = (TextView) findViewById(R.id.toast_error);
text.setText(error);
Toast toast = new Toast(applicationContext);
toast.setGravity(Gravity.TOP | Gravity.FILL_HORIZONTAL, 0, 0);
toast.setDuration(Toast.LENGTH_SHORT);
toast.setView(view);
toast.show();
}
Deixe-me compartilhar uma análise básica do Logcat para quando você encontrar um Forçar fechamento (quando o aplicativo parar de funcionar).
DOCS
A ferramenta básica do Android para coletar / analisar logs é o logcat.
AQUI está a página do Android sobre o logcat
Se você usa o Android Studio, também pode verificar este LINK .
Capturando
Basicamente, você pode capturar MANUALMENTE o logcat com o seguinte comando (ou apenas verificar a janela AndroidMonitor no AndroidStudio):
adb logcat
Existem muitos parâmetros que você pode adicionar ao comando que ajudam a filtrar e exibir a mensagem que você deseja ... Isso é pessoal ... Eu sempre uso o comando abaixo para obter o carimbo de data / hora da mensagem:
adb logcat -v time
Você pode redirecionar a saída para um arquivo e analisá-la em um Editor de Texto.
Analisando
Se seu aplicativo estiver travando, você obterá algo como:
07-09 08:29:13.474 21144-21144/com.example.khan.abc D/AndroidRuntime: Shutting down VM
07-09 08:29:13.475 21144-21144/com.example.khan.abc E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.khan.abc, PID: 21144
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.app.FragmentActivity.onBackPressed()' on a null object reference
at com.example.khan.abc.AudioFragment$1.onClick(AudioFragment.java:125)
at android.view.View.performClick(View.java:4848)
at android.view.View$PerformClick.run(View.java:20262)
at android.os.Handler.handleCallback(Handler.java:815)
at android.os.Handler.dispatchMessage(Handler.java:104)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5631)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754)
07-09 08:29:15.195 21144-21144/com.example.khan.abc I/Process: Sending signal. PID: 21144 SIG: 9
Esta parte do registro mostra muitas informações:
- Quando o problema aconteceu:
07-09 08:29:13.475
É importante verificar quando o problema aconteceu ... Você pode encontrar vários erros em um log ... você deve ter certeza de que está verificando as mensagens corretas :)
- Qual aplicativo travou:
com.example.khan.abc
Dessa forma, você sabe qual aplicativo travou (para ter certeza de que está verificando os registros sobre sua mensagem)
- Qual ERRO:
java.lang.NullPointerException
Um erro de exceção de ponteiro NULL
- Informações detalhadas sobre o erro:
Attempt to invoke virtual method 'void android.support.v4.app.FragmentActivity.onBackPressed()' on a null object reference
Você tentou chamar o método onBackPressed()
de um FragmentActivity
objeto. No entanto, esse objeto era null
quando você o fez.
Stack Trace: Stack Trace mostra a ordem de invocação do método ... Às vezes, o erro acontece no método de chamada (e não no método chamado).
em com.example.khan.abc.AudioFragment $ 1.onClick (AudioFragment.java:125)
O erro aconteceu no arquivo com.example.khan.abc.AudioFragment.java
, dentro do onClick()
método na linha: 125
(stacktrace mostra a linha em que o erro aconteceu)
Foi chamado por:
at android.view.View.performClick(View.java:4848)
Que foi chamado por:
at android.view.View$PerformClick.run(View.java:20262)
que foi chamado por:
at android.os.Handler.handleCallback(Handler.java:815)
etc ....
visão global
Esta foi apenas uma visão geral ... Nem todos os logs são simples, mas o erro fornece o problema específico e o verboso mostra todos os problemas ... É apenas para compartilhar a ideia e fornecer informações básicas para você ...
Espero poder te ajudar de alguma forma ... Atenciosamente
Use o LogCat e tente descobrir o que está causando o travamento do aplicativo.
Para ver o Logcat se você usar o Android Studio , pressione ALT + 6 ou
se você usar Eclipse, em seguida, Janela -> Abrir Perspectiva -> Outro - LogCat
Vá para o LogCat, no menu suspenso selecione erro. Isso conterá todas as informações necessárias para ajudá-lo a depurar. Se isso não ajudar, poste o LogCat como uma edição para sua pergunta e alguém o ajudará.
Se seu aplicativo por algum motivo travar sem um bom rastreamento de pilha. Tente depurar da primeira linha e siga linha por linha até travar. Então você terá a resposta, qual linha está causando problemas. Provavelmente, você poderia envolvê-lo no bloco try catch e na saída de erro de impressão.
Você também pode obter essa mensagem de erro por conta própria, sem qualquer rastreamento de pilha ou qualquer outra mensagem de erro.
Nesse caso, você precisa se certificar de que seu manifesto Android está configurado corretamente (incluindo qualquer mesclagem de manifesto ocorrendo de uma biblioteca e qualquer atividade que viria de uma biblioteca) e prestar atenção especial à primeira atividade exibida em seu aplicativo em seus arquivos de manifesto .
Falha durante o desenvolvimento
Experimente minha ferramenta favorita logview para obter os logs e analisá-los durante o desenvolvimento.
Certifique-se de marcar ./logview
e ./lib/logview.jar
como executável ao executar no Linux.
Se você não gostar, há muitos visualizadores alternativos de log da área de trabalho para Android .
Bater na selva
Integre uma ferramenta de relatório de falhas em tempo real, como Firebase Crashlytics , para obter rastreamentos de pilha de exceções não tratadas que ocorreram nos dispositivos dos usuários.
Leia Como lançar um aplicativo com erros (e viver para contar a história) para saber mais sobre como lidar com bugs em campo.
As pessoas cometem erros e, portanto, codificam também.
Sempre que algo error
acontecer, sempre verifique com o logcat com o texto em cor vermelha, porém você pode descobrir o problema real no texto de cor azul com sublinhado no texto de cor vermelha.
Certifique-se de que se vc criar um novo activity
, sempre declare o activity
no AndroidManifest
arquivo.
Se adicionar Permissão, declare-a também no AndroidMainifest
arquivo.
Logcat - Para verificar os registros na fase de desenvolvimento do Android Studio
Limpe inicialmente o Logcat e deixe o aplicativo travar novamente para que você possa obter apenas os detalhes do log travado. Você tem que verificar o rastreamento de pilha
Embora, infelizmente, MyApp tenha parado. Existem muitas razões para isso. Você pode verificar o mesmo nos logs. Para isso, pode-se usar o Log.e ("TAG", "Mensagem");
Erro comum durante a falha do aplicativo como:
- Erro de codificação (uso incorreto de palavras-chave).
- Nome da propriedade incompatível.
- Plug-in não suportado (talvez).
- Versão incompatível (talvez).
- Atividade ausente no arquivo AndroidManifest.
- Permissão ausente no arquivo AndroidManifest.
- NullPointerException mais comum.
- Declarado, mas não definido.
Para resolver o erro de travamento do aplicativo:
- Tenha em mente os pontos acima e analise-os.
- Com o erro, você obterá o nome do arquivo também na cor azul (clique sobre eles e pule para o código em que o erro está ocorrendo).
Primeiro, você precisa verificar onde e por que seu aplicativo travou. (Unfortunately, MyApp has stopped.).
Com a ajuda de LOG
, você pode descobrir o que deu errado.
Depois disso, você descobre em que ponto seu aplicativo parou de corrigir isso do seu ponto.
Se você não tem nenhum tipo de log interessante em seu terminal (ou eles não estão diretamente relacionados ao seu aplicativo), talvez seu problema seja devido a uma biblioteca nativa. Nesse caso, você deve verificar os arquivos "tombstone" dentro do seu terminal.
O local padrão para os arquivos de marca para exclusão depende de cada dispositivo, mas se for esse o caso, você terá um registro informando: Tombstone written to: /data/tombstones/tombstone_06
Para obter mais informações, verifique em https://source.android.com/devices/tech/debug .
Também executar este comando no terminal pode ajudar a encontrar o problema:
gradlew build > log.txt 2>details.txt
então você deve ir para a localização do arquivo gradlew em ler dois arquivos de log acima.