MISE À JOUR: veuillez consulter la solution «acceptée» ci-dessous
Lorsque mon application crée une exception non gérée, plutôt que de simplement se terminer, je voudrais d'abord donner à l'utilisateur la possibilité d'envoyer un fichier journal. Je me rends compte qu'il est risqué de faire plus de travail après avoir obtenu une exception aléatoire, mais le pire est que l'application se bloque et que le fichier journal n'est pas envoyé. Cela s'avère plus compliqué que prévu :)
Ce qui fonctionne: (1) intercepter l'exception non interceptée, (2) extraire les informations du journal et écrire dans un fichier.
Ce qui ne fonctionne pas encore: (3) démarrer une activité pour envoyer des e-mails. En fin de compte, j'aurai encore une autre activité pour demander la permission de l'utilisateur. Si je fais fonctionner l'activité de messagerie, je ne m'attends pas à beaucoup de problèmes pour l'autre.
Le nœud du problème est que l'exception non gérée est interceptée dans ma classe Application. Étant donné qu'il ne s'agit pas d'une activité, il n'est pas évident de savoir comment démarrer une activité avec Intent.ACTION_SEND. Autrement dit, normalement pour démarrer une activité, on appelle startActivity et reprend avec onActivityResult. Ces méthodes sont prises en charge par Activity mais pas par Application.
Des suggestions sur la façon de procéder?
Voici quelques extraits de code comme guide de démarrage:
public class MyApplication extends Application
{
defaultUncaughtHandler = Thread.getDefaultUncaughtExceptionHandler();
public void onCreate ()
{
Thread.setDefaultUncaughtExceptionHandler (new Thread.UncaughtExceptionHandler()
{
@Override
public void uncaughtException (Thread thread, Throwable e)
{
handleUncaughtException (thread, e);
}
});
}
private void handleUncaughtException (Thread thread, Throwable e)
{
String fullFileName = extractLogToFile(); // code not shown
// The following shows what I'd like, though it won't work like this.
Intent intent = new Intent (Intent.ACTION_SEND);
intent.setType ("plain/text");
intent.putExtra (Intent.EXTRA_EMAIL, new String[] {"[email protected]"});
intent.putExtra (Intent.EXTRA_SUBJECT, "log file");
intent.putExtra (Intent.EXTRA_STREAM, Uri.parse ("file://" + fullFileName));
startActivityForResult (intent, ACTIVITY_REQUEST_SEND_LOG);
}
public void onActivityResult (int requestCode, int resultCode, Intent data)
{
if (requestCode == ACTIVITY_REQUEST_SEND_LOG)
System.exit(1);
}
}
la source
Réponses:
Voici la solution complète (presque: j'ai omis la disposition de l'interface utilisateur et la gestion des boutons) - dérivée de beaucoup d'expérimentation et de divers messages d'autres personnes liées à des problèmes survenus en cours de route.
Vous devez faire un certain nombre de choses:
Maintenant, voici les détails:
(1 & 2) Gérez uncaughtException, lancez l'activité du journal d'envoi:
(3) Extraire le journal (je mets ceci dans mon activité SendLog):
(4) Démarrez une application de messagerie (également dans mon activité SendLog):
(3 & 4) Voici à quoi ressemble SendLog (vous devrez cependant ajouter l'interface utilisateur):
(5) Manifeste:
(6) Programme d'installation:
Dans project.properties, modifiez la ligne de configuration. Vous devez spécifier «optimiser» ou Proguard ne supprimera pas les appels Log.v () et Log.d ().
Dans proguard-project.txt, ajoutez ce qui suit. Cela indique à Proguard de supposer que Log.v et Log.d n'ont aucun effet secondaire (même s'ils le font puisqu'ils écrivent dans les journaux) et peuvent donc être supprimés pendant l'optimisation:
C'est tout! Si vous avez des suggestions pour améliorer ceci, faites-le moi savoir et je pourrais mettre à jour ceci.
la source
Aujourd'hui, il existe de nombreux outils de reprise après incident qui le font facilement.
crashlytics - Un outil de rapport de plantage, gratuit mais qui vous donne des rapports de base Avantages: gratuit
Gryphonet - Un outil de reporting plus avancé, nécessite une sorte de frais. Avantages: Recréation facile des accidents, des ANR, de la lenteur ...
Si vous êtes un développeur privé, je suggérerais Crashlytics, mais si c'est une grande organisation, je choisirais Gryphonet.
Bonne chance!
la source
Essayez plutôt d'utiliser ACRA - il gère l'envoi de la trace de la pile ainsi que de tonnes d'autres informations de débogage utiles à votre backend ou au document Google Docs que vous avez configuré.
https://github.com/ACRA/acra
la source
La réponse de @ PeriHartman fonctionne bien lorsque le thread d'interface utilisateur lance une exception non interceptée. J'ai apporté quelques améliorations lorsque l'exception non interceptée est levée par un thread non UI.
la source
Bien expliqué. Mais une observation ici, au lieu d'écrire dans un fichier en utilisant File Writer et Streaming, j'ai utilisé directement l'option logcat -f. Voici le code
Cela m'a aidé à vider les dernières informations de tampon. L'utilisation de la diffusion en continu de fichiers m'a donné un problème: il ne vidait pas les derniers journaux de la mémoire tampon. Mais de toute façon, c'était un guide vraiment utile. Je vous remercie.
la source
Gérer les exceptions non interceptées : comme @gilm l'a expliqué, faites simplement ceci, (kotlin):
J'espère que cela aide, cela a fonctionné pour moi .. (: y). Dans mon cas, j'ai utilisé la bibliothèque 'com.microsoft.appcenter.crashes.Crashes' pour le suivi des erreurs.
la source
Vous pouvez gérer les exceptions non interceptées en utilisant FireCrasher bibliothèque et effectuer une récupération à partir de celle-ci.
vous pouvez en savoir plus sur la bibliothèque dans cet article moyen
la source