Jak získám crash data z mé aplikace pro Android?

hlasů
676

Jak mohu získat crash data (stack stopy minimálně) z mé aplikace pro Android? Alespoň při práci na svém vlastním zařízení jsou vyvolány pomocí kabelu, ale v ideálním případě z libovolné instance moje aplikace běžící na volné přírodě, takže to můžu zlepšit a dělat to pevnější.

Položena 02/03/2009 v 08:17
zdroj uživatelem
V jiných jazycích...                            


30 odpovědí

hlasů
24

Je možné zpracovávat tyto výjimky se Thread.setDefaultUncaughtExceptionHandler()však toto vypadá, že si s Android metodou výjimek manipulaci. Pokusil jsem se použít handler této povahy:

private class ExceptionHandler implements Thread.UncaughtExceptionHandler {
    @Override
    public void uncaughtException(Thread thread, Throwable ex){
        Log.e(Constants.TAG, "uncaught_exception_handler: uncaught exception in thread " + thread.getName(), ex);

        //hack to rethrow unchecked exceptions
        if(ex instanceof RuntimeException)
            throw (RuntimeException)ex;
        if(ex instanceof Error)
            throw (Error)ex;

        //this should really never happen
        Log.e(Constants.TAG, "uncaught_exception handler: unable to rethrow checked exception");
    }
}

Nicméně, dokonce s Opětné vyvolání výjimky, jsem nebyl schopen získat požadované chování, tj přihlášením výjimku zároveň umožňuje Android vypnout komponentu Stalo se to, tak jsem to vzdal na něj po chvíli.

Odpovězeno 18/03/2009 v 18:24
zdroj uživatelem

hlasů
280

Pro ukázkové aplikace a účely ladění, já používám jednoduché řešení, které mi umožňuje psát StackTrace na SD kartu zařízení a / nebo nahrát na server. Toto řešení bylo inspirováno projektu android-dálkového StackTrace (konkrétně save-to-zařízení a nahrát-server dílů) a myslím, že řeší problém zmínil Soonil. Není to optimální, ale funguje to a můžete jej vylepšit, pokud jej chcete použít v aplikaci výroby. Pokud se rozhodnete nahrát stacktraces na server, můžete použít php skript ( index.php) k jejich zobrazení. Máte-li zájem, můžete najít všechny níže uvedené zdroje - jednu třídu java pro danou aplikaci a dva volitelné php zatímní listy pro server hosting na nahrané stacktraces.

V kontextu (např hlavní činnosti), call

if(!(Thread.getDefaultUncaughtExceptionHandler() instanceof CustomExceptionHandler)) {
    Thread.setDefaultUncaughtExceptionHandler(new CustomExceptionHandler(
            "/sdcard/<desired_local_path>", "http://<desired_url>/upload.php"));
}

CustomExceptionHandler

public class CustomExceptionHandler implements UncaughtExceptionHandler {

    private UncaughtExceptionHandler defaultUEH;

    private String localPath;

    private String url;

    /* 
     * if any of the parameters is null, the respective functionality 
     * will not be used 
     */
    public CustomExceptionHandler(String localPath, String url) {
        this.localPath = localPath;
        this.url = url;
        this.defaultUEH = Thread.getDefaultUncaughtExceptionHandler();
    }

    public void uncaughtException(Thread t, Throwable e) {
        String timestamp = TimestampFormatter.getInstance().getTimestamp();
        final Writer result = new StringWriter();
        final PrintWriter printWriter = new PrintWriter(result);
        e.printStackTrace(printWriter);
        String stacktrace = result.toString();
        printWriter.close();
        String filename = timestamp + ".stacktrace";

        if (localPath != null) {
            writeToFile(stacktrace, filename);
        }
        if (url != null) {
            sendToServer(stacktrace, filename);
        }

        defaultUEH.uncaughtException(t, e);
    }

    private void writeToFile(String stacktrace, String filename) {
        try {
            BufferedWriter bos = new BufferedWriter(new FileWriter(
                    localPath + "/" + filename));
            bos.write(stacktrace);
            bos.flush();
            bos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void sendToServer(String stacktrace, String filename) {
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url);
        List<NameValuePair> nvps = new ArrayList<NameValuePair>();
        nvps.add(new BasicNameValuePair("filename", filename));
        nvps.add(new BasicNameValuePair("stacktrace", stacktrace));
        try {
            httpPost.setEntity(
                    new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
            httpClient.execute(httpPost);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

upload.php

<?php
    $filename = isset($_POST['filename']) ? $_POST['filename'] : "";
    $message = isset($_POST['stacktrace']) ? $_POST['stacktrace'] : "";
    if (!ereg('^[-a-zA-Z0-9_. ]+$', $filename) || $message == ""){
        die("This script is used to log debug data. Please send the "
                . "logging message and a filename as POST variables.");
    }
    file_put_contents($filename, $message . "\n", FILE_APPEND);
?>

index.php

<?php
    $myDirectory = opendir(".");
    while($entryName = readdir($myDirectory)) {
        $dirArray[] = $entryName;
    }
    closedir($myDirectory);
    $indexCount = count($dirArray);
    sort($dirArray);
    print("<TABLE border=1 cellpadding=5 cellspacing=0 \n");
    print("<TR><TH>Filename</TH><TH>Filetype</th><th>Filesize</TH></TR>\n");
    for($index=0; $index < $indexCount; $index++) {
        if ((substr("$dirArray[$index]", 0, 1) != ".") 
                && (strrpos("$dirArray[$index]", ".stacktrace") != false)){ 
            print("<TR><TD>");
            print("<a href=\"$dirArray[$index]\">$dirArray[$index]</a>");
            print("</TD><TD>");
            print(filetype($dirArray[$index]));
            print("</TD><TD>");
            print(filesize($dirArray[$index]));
            print("</TD></TR>\n");
        }
    }
    print("</TABLE>\n");
?>
Odpovězeno 16/04/2009 v 09:00
zdroj uživatelem

hlasů
18

Ok, dobře jsem se podíval na poskytnuté vzorky z rrainn a Soonil, a našel jsem řešení, které nemá zkazit zpracování chyb.

jsem upravil CustomExceptionHandler tak uloží původní UncaughtExceptionHandler z Thread můžeme přiřadit novou. Na konci nového „uncaughtException“ - Metoda I stačí zavolat na staré funkce pomocí uložené UncaughtExceptionHandler.

Ve třídě DefaultExceptionHandler budete potřebovat tá. takhle:

public class DefaultExceptionHandler implements UncaughtExceptionHandler{
  private UncaughtExceptionHandler mDefaultExceptionHandler;

  //constructor
  public DefaultExceptionHandler(UncaughtExceptionHandler pDefaultExceptionHandler)
  {
       mDefaultExceptionHandler= pDefaultExceptionHandler;
  }
  public void uncaughtException(Thread t, Throwable e) {       
        //do some action like writing to file or upload somewhere         

        //call original handler  
        mStandardEH.uncaughtException(t, e);        

        // cleanup, don't know if really required
        t.getThreadGroup().destroy();
  }
}

S touto úpravou o kodexu při http://code.google.com/p/android-remote-stacktrace máte dobrý pracovní základ pro přihlášení do pole na server nebo na SD kartě.

Odpovězeno 13/05/2009 v 22:51
zdroj uživatelem

hlasů
13

I udělal můj vlastní verzi zde: http://androidblogger.blogspot.com/2009/12/how-to-improve-your-application-crash.html

Je to v podstatě totéž, ale já jsem s použitím email spíše než http Connexion poslat zprávu, a co je ještě důležitější, přidal jsem nějaké informace jako verzi aplikace, verzi operačního systému, modelu telefonu nebo k dostání paměti do své zprávy .. ,

Odpovězeno 15/12/2009 v 01:25
zdroj uživatelem

hlasů
341

Můžete zkusit na Acra (Application Crash Report pro Android) knihovna:

ACRA je knihovna umožňující Aplikace pro Android, aby se automaticky po jejich zprávy o selhání do GoogleDoc formě. Je to cílené na android vývojáři aplikací, které jim pomohou získat data z jejich aplikací, když se zhroutí nebo se chovat chybně.

Je snadné nainstalovat aplikaci, vysoce konfigurovatelný a nevyžadují hostit skript serveru kdekoli ... zprávy se posílají do Google Doc tabulky!

Odpovězeno 18/05/2010 v 09:52
zdroj uživatelem

hlasů
42

V systému Android 2.2 je nyní možné automaticky získat Crash Reports z Android Market aplikací:

Novinkou pro hlášení chyb aplikací pro Android Market umožňuje vývojářům přijímat havárie a zmrazení zprávy od svých uživatelů. Tyto zprávy budou k dispozici, když se přihlásíte do svého účtu vydavatele.

http://developer.android.com/sdk/android-2.2-highlights.html

Odpovězeno 28/05/2010 v 11:34
zdroj uživatelem

hlasů
0

Flurry Analytics vám havárie informací, hardware modelu, Android verze a živé statistiky využití aplikací. V nové SDK se zdá, že poskytují podrobnější informace havárie http://www.flurry.com/flurry-crash-analytics.html .

Odpovězeno 15/02/2011 v 20:03
zdroj uživatelem

hlasů
5

To je velmi brutální, ale je možné spustit logcat kdekoliv, takže rychlý a špinavý hack je přidat do jakéhokoli bloku catch getRuntime().exec("logcat >> /sdcard/logcat.log");

Odpovězeno 14/04/2011 v 03:36
zdroj uživatelem

hlasů
8

Můžete také použít celou (jednoduché) službu pro něj spíše než jen knihovny. Naše společnost právě vydala službu právě za to: http://apphance.com .

To má jednoduchý JAR knihovny (pro Android), které můžete přidat a začlenit do 5 minut a pak se knihovna shromažďuje nejen crash informace, ale také zaznamená spuštění aplikace, stejně jako to umožňuje testeři nahlásit problém přímo z přístroje - včetně celý kontext (rotace zařízení, ať už je připojen k wifi či nikoliv, a další). Můžete se podívat na protokolech s využitím velmi pěkné a užitečné webové panel, kde můžete sledovat relace s aplikací, pády, záznamu, statistik a další. Tato služba je v uzavřené beta testovací fázi teď, ale můžete požádat o přístup a my to velmi rychle dám.

Prohlášení: Jsem CTO Polidea a spolutvůrcem služby.

Odpovězeno 29/05/2011 v 19:03
zdroj uživatelem

hlasů
54

Můžete také zkusit BugSense . BugSense shromažďuje a analyzuje všechny dostupné zprávy o selhání a poskytuje smysluplné a vizuálních zpráv. Je to zdarma a je to jen jeden řádek kódu, aby se integrovat.

Prohlášení: Jsem spoluzakladatel

Odpovězeno 08/07/2011 v 11:15
zdroj uživatelem

hlasů
18

Byl jsem pomocí Crittercism pro mé Android a iOS - slyšel o nich TechCrunch. Doce