Bagaimana cara saya mendapatkan data kerusakan dari aplikasi Android saya?

737

Bagaimana saya bisa mendapatkan data macet (setidaknya setumpuk jejak) dari aplikasi Android saya? Setidaknya ketika bekerja pada perangkat saya sendiri sedang diambil dengan kabel, tetapi idealnya dari setiap contoh aplikasi saya berjalan di alam sehingga saya dapat memperbaikinya dan membuatnya lebih solid.

J. Pablo Fernández
sumber
Saya melihat bahwa ini mengirimkan laporan ke server jauh. Bisakah itu juga mencatat pengecualian ke file lokal?
1
Laporan Kecelakaan Aplikasi untuk Android code.google.com/p/acra
gdonald
Yang ini terlihat lebih kuat, bagaimana jika pelaporan gagal mengunggah setelah semua percobaan lagi, dapatkah kemudian mencatatnya atau sqlite db?
JPM

Jawaban:

354

Anda dapat mencoba perpustakaan ACRA (Application Crash Report untuk Android) :

ACRA adalah perpustakaan yang memungkinkan Aplikasi Android untuk secara otomatis mengirim laporan kerusakan mereka ke formulir GoogleDoc. Itu ditargetkan untuk pengembang aplikasi android untuk membantu mereka mendapatkan data dari aplikasi mereka ketika mereka crash atau berperilaku salah.

Mudah dipasang di aplikasi Anda, sangat dapat dikonfigurasi, dan tidak mengharuskan Anda meng-host skrip server di mana saja ... laporan dikirim ke spreadsheet Google Doc!

Kevin Gaudin
sumber
8
Ini mudah diatur dan digunakan. Disarankan untuk penggunaan tempat pra-pasar, dan bahkan mungkin setelahnya.
mxcl
1
Mulai menggunakannya dan itu jauh lebih baik daripada pelaporan kesalahan di Flurry yang saya miliki sebelumnya atau buatan sendiri yang saya mulai. Sejauh ini, saya tertarik pada "acra".
Adrian Spinei
8
Keuntungan besar dari acra adalah kemungkinan untuk menggunakan Google API untuk dengan mudah menganalisis dan memvisualisasikan data, lihat jberkel.github.com/sms-backup-plus/acra-analysis untuk contoh tentang cara melakukan ini.
Jan Berkel
3
Tampaknya sangat tidak stabil untuk saya. ACRA sendiri macet dan mengirim laporan kerusakan tentang dirinya sendiri bukan kecelakaan aplikasi terkait. -1
Sandor
19
Google Documents sebagai backend tidak lagi didukung
eliocs
305

Untuk contoh aplikasi dan keperluan debugging, saya menggunakan solusi sederhana yang memungkinkan saya untuk menulis stacktrace ke kartu sd perangkat dan / atau mengunggahnya ke server. Solusi ini telah terinspirasi oleh Project android-remote-stacktrace (khususnya, bagian save-to-device dan upload-to-server) dan saya pikir ini memecahkan masalah yang disebutkan oleh Soonil. Ini tidak optimal, tetapi berfungsi dan Anda dapat memperbaikinya jika Anda ingin menggunakannya dalam aplikasi produksi. Jika Anda memutuskan untuk mengunggah stacktraces ke server, Anda dapat menggunakan skrip php ( index.php) untuk melihatnya. Jika Anda tertarik, Anda dapat menemukan semua sumber di bawah ini - satu kelas java untuk aplikasi Anda dan dua skrip php opsional untuk server yang menampung stacktraces yang diunggah.

Dalam Konteks (misalnya Kegiatan utama), panggil

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");
?>
Mihai Chintoanu
sumber
9
Saya pikir ini akan menyebabkan masalah hukum di beberapa negara / negara
setzamora
5
CATATAN: HttpPost httpPost = new HttpPost(url);harus dalam tugas async (atau penangan ... utas terpisah) sekarang jika Anda menargetkan Honeycomb atau lebih baru
Bryan Denny
4
@ Joet, masalah hukum macam apa, dan mengapa?
varevarao
2
@varevarao Masalah hukum (mungkin) karena Anda mengirim informasi perangkat sensitif tanpa persetujuan pengguna dengan menggunakan fitur Kirim-ke-Server dari kode ini.
gak
2
DefaultExceptionHandler tampaknya bertahan di rekreasi Aktivitas. Saya memperbarui jawaban untuk hanya menetapkan default jika handler kustom belum diatur. Tanpa itu, setiap pawang memegang dan memanggil yang sebelumnya, semua jalan ke yang asli. Ini menyebabkan masalah dengan pendataan duplikat serta masalah kebocoran memori.
Dave McClelland
57

Anda juga dapat mencoba [BugSense] Alasan: Spam Redirect ke url lain . BugSense mengumpulkan dan menganalisis semua laporan kerusakan dan memberi Anda laporan yang bermakna dan visual. Ini gratis dan hanya 1 baris kode untuk diintegrasikan.

Penafian: Saya adalah salah satu pendiri

PanosJee
sumber
4
Saya sudah mencoba BugSense dan luar biasa. UI sederhana dan segar, juga sangat cepat. Tidak ada fitur konyol mengasapi. Mudah untuk melihat crash paling sering dan juga untuk menggali stacktrace.
vidstige
Kami akhir-akhir ini melakukan lebih dari sekedar pelaporan Kecelakaan tetapi ini bukan tempat yang tepat untuk membicarakan fitur-fitur baru, dll.
PanosJee
Sudah mencobanya. Kesalahan berfungsi meskipun stacktrace tidak terlalu lengkap, data kerusakan waktu-nyata tidak datang. Mode debug tidak bekerja. Saya pergi rute inisialisasi-sekali dari kelas Aplikasi (yang masuk akal untuk kebanyakan kasus). BugSense memiliki dasbor yang menakjubkan, sangat memalukan bahwa karena suatu alasan laporan kerusakan tidak berfungsi dan simbolisasi tidak ada di tingkat gratis. Butuh waktu 5 menit untuk menginstal GetSentry dan itu hanya bekerja di luar kotak untuk Android dengan klien tujuan umum ini: github.com/joshdholtz/Sentry-Android
albertpeiro
3
BugSense sederhana dan mudah diintegrasikan. TAPI ITU TERLALU MAHAL. Kami dapat mencapai fungsionalitas indra bug yang sama menggunakan Flurry analytics dan Parse. Keduanya gratis dan mudah diintegrasikan.
venkat
44

Di Android 2.2 sekarang dimungkinkan untuk secara otomatis mendapatkan Laporan Crash dari Aplikasi Android Market:

Fitur pelaporan bug baru untuk aplikasi Android Market memungkinkan pengembang menerima crash dan membekukan laporan dari pengguna mereka. Laporan akan tersedia ketika mereka masuk ke akun penerbit mereka.

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

RoflcoptrException
sumber
Saya pikir ini bukan hanya 2.2 tetapi hanya fitur pasar baru yang ditawarkan Google. Saya mendapat laporan kerusakan beberapa hari yang lalu dan seharusnya tidak ada perangkat froyo di luar sana menggunakan aplikasi saya.
Janusz
1
@ Janusz Apakah Anda yakin? sudah ada rilis Froyo untuk Nexus One, tanpa menghitung Googler yang telah menjalankan Froyo untuk sementara waktu.
pupeno
Setidaknya harus ada pembaruan dalam versi di telepon, bahkan itu hanya revisi lain, tetapi bagaimana ini harus bekerja dengan cara lain?
RoflcoptrException
Saya tidak tahu apakah laporan dapat dikirim ke google sebelumnya. Laporan ini agak aneh karena google menunjukkan UI untuk mengirimkan video mereka dan itu harus menjadi perubahan dalam OS dan tidak hanya pasar. Tetapi dikatakan: Platform 1 melaporkan laporan / minggu dan droid tidak boleh di froyo.
Janusz
1
Kode tombol "Laporkan" sudah ada di AOSP untuk sementara, dan Romain Guy (samar-samar) menjawab pertanyaan tentang hal itu di sini beberapa bulan yang lalu.
Christopher Orr
30

Dimungkinkan untuk menangani pengecualian ini dengan Thread.setDefaultUncaughtExceptionHandler(), namun ini tampaknya mengacaukan metode penanganan pengecualian Android. Saya berusaha menggunakan penangan seperti ini:

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");
    }
}

Namun, bahkan dengan memikirkan kembali pengecualian, saya tidak dapat mendapatkan perilaku yang diinginkan, yaitu mencatat pengecualian sementara masih memungkinkan Android untuk mematikan komponen yang telah terjadi itu, jadi saya menyerah setelah beberapa saat.

sooniln
sumber
Mengapa Anda hanya melempar kembali pengecualian yang tidak dicentang? Menurut saya, Anda harus melemparkan kembali semua pengecualian.
MatrixFrog
Sepertinya seseorang berhasil dengan pendekatan Anda: jyro.blogspot.com/2009/09/crash-report-for-android-app.html
MatrixFrog
1
Caranya adalah dengan mendapatkan UncaughtExceptionHandler default sebelumnya dan menangani pengecualian untuk objek itu setelah Anda selesai melaporkan pengecualian.
Tom
Apakah Constants.TAGbagian dari kerangka kerja Android? Pertama kali melihatnya. Tampaknya tidak dapat menemukannya.
Haroun Hajem
1
@HarounHajem Kita perlu mendefinisikan kita sendiri.
KYHSGeekCode
22

Saya melihat bahwa pertanyaannya terlalu lama, dan harap jawaban saya bermanfaat bagi orang lain yang memiliki masalah yang sama ...

Berikan Crashlytics mencoba. Ini akan memberikan wawasan mendalam ke semua crash pada semua perangkat yang memiliki aplikasi Anda dan mengirim pemberitahuan kepada Anda melalui email .. Dan bagian terbaiknya adalah sepenuhnya gratis untuk digunakan ..

lingareddyk
sumber
21

Ok, well saya melihat sampel yang disediakan dari rrainn dan Soonil, dan saya menemukan solusi yang tidak mengacaukan penanganan kesalahan.

Saya memodifikasi CustomExceptionHandler sehingga ia menyimpan UncaughtExceptionHandler asli dari Thread yang kami asosiasikan dengan yang baru. Pada akhir "uncaughtException" yang baru - Metode saya hanya memanggil fungsi lama menggunakan UncaughtExceptionHandler yang tersimpan.

Di kelas DefaultExceptionHandler Anda perlu sth. seperti ini:

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();
  }
}

Dengan modifikasi pada kode di http://code.google.com/p/android-remote-stacktrace Anda memiliki basis kerja yang baik untuk masuk dalam bidang ke server web Anda atau ke kartu-sd.

luvieere
sumber
19

Google Play Developers Console benar-benar memberi Anda jejak Stack dari aplikasi yang mogok dan telah mengirim laporan, juga memiliki bagan yang sangat baik untuk membantu Anda melihat informasi, lihat contoh di bawah:

masukkan deskripsi gambar di sini

Eefret
sumber
2
Bagaimana Anda membuat pengguna mengirim laporan atau bagaimana cara kerjanya persis jika aplikasi Anda tidak ada di play store, dapatkah Anda melakukannya untuk tujuan pengujian?
Lion789
Apakah Anda tahu bahwa ada proyek Android open source yang mempublikasikan laporan kerusakan mereka?
Justin Civi
1
Harap dicatat, ini hanya akan menampilkan crash, PPA yang pengguna pilih untuk melaporkan
sojin
Ya, bagaimanapun, ketika Anda memiliki basis pengguna yang besar, Anda memiliki banyak kemungkinan dari semua crash yang dilaporkan, dan juga crash dan ANR yang dilaporkan di sini akan menjadi yang paling penting, karena orang akan melaporkannya lebih banyak kali, sehingga Anda dapat melaporkannya lebih lanjut. memfilter dan memperbaikinya dalam prioritas itu (lebih banyak laporan = bug lebih penting) sementara (tidak ada laporan = tidak bug kritis itu).
Eefret
18

Saya telah menggunakan Crittercism untuk aplikasi Android dan iOS saya - dengar tentang mereka di techcrunch. Cukup senang dengan mereka sejauh ini!

Julie
sumber
FYI: laporan kerusakan dari sisi NDK bukan bagian dari rencana dasar, dan berada di bawah "Pelaporan Kecelakaan yang Diperpanjang". Lihat: crittercism.com/pricing
ahash
1
Saya baru saja menguji pelaporan NDK di Fabric.io Crashlytics Twitter ... cukup bagus (pada hari 1 penggunaan), diperlukan langkah ekstra ketika saya merilis untuk menempatkan pemetaan ke dalam sistem mereka sehingga jejak tumpukan terlihat bagus, tetapi dipaku kesalahan NDK yang saya gunakan untuk menguji (membuat "batalkan ();" panggilan secara strategis di seluruh c ++ dan memberikan jejak stack untuk pengujian.
Hunter-Orionnoir
14

Saya membuat versi saya sendiri di sini: http://androidblogger.blogspot.com/2009/12/how-to-improve-your-application-crash.html

Ini pada dasarnya hal yang sama, tetapi saya menggunakan surat daripada koneksi http untuk mengirim laporan, dan, yang lebih penting, saya menambahkan beberapa informasi seperti versi aplikasi, versi OS, model telepon, atau memori yang tersedia untuk laporan saya .. .

alocaly
sumber
11

gunakan ini untuk menangkap detail pengecualian:

String stackTrace = Log.getStackTraceString(exception); 

simpan ini dalam database dan pertahankan lognya.

Vicky Kapadia
sumber
Bagaimana cara mengakses basis data itu, akankah Anda memberi saya contoh. tolong kalau bisa. terima kasih di advacne
Rajendra Verma
8

Anda juga dapat menggunakan layanan keseluruhan (sederhana) untuk itu daripada hanya perpustakaan. Perusahaan kami baru saja merilis layanan untuk itu: http://apphance.com .

Ini memiliki perpustakaan .jar sederhana (untuk Android) yang Anda tambahkan dan integrasikan dalam 5 menit dan kemudian perpustakaan mengumpulkan tidak hanya informasi macet tetapi juga log dari aplikasi yang berjalan, serta memungkinkan penguji Anda melaporkan masalah langsung dari perangkat - termasuk seluruh konteks (rotasi perangkat, apakah itu terhubung ke wifi atau tidak dan banyak lagi). Anda dapat melihat log menggunakan panel web yang sangat bagus dan berguna, di mana Anda dapat melacak sesi dengan aplikasi Anda, crash, log, statistik dan banyak lagi. Layanan ini dalam tahap uji beta tertutup sekarang, tetapi Anda dapat meminta akses dan kami memberikannya kepada Anda dengan sangat cepat.

Penafian: Saya CTO dari Polidea, dan rekan pembuat layanan ini.

Jarek Potiuk
sumber
7

Terima kasih sumber daya hadir dalam Stackoverflowmembantu saya menemukan jawaban ini.

Anda dapat menemukan laporan kerusakan Android Anda dari jarak jauh langsung ke email Anda . ingat Anda harus memasukkan email Anda di dalam kelas CustomExceptionHandler .

public static String sendErrorLogsTo = "[email protected]" ;

Langkah-langkah yang diperlukan:

1) di onCreate dari aktivitas Anda, gunakan bagian kode ini.

    if(!(Thread.getDefaultUncaughtExceptionHandler() instanceof CustomExceptionHandler)) {
        Thread.setDefaultUncaughtExceptionHandler(new CustomExceptionHandler(this));
    }   

2) gunakan versi override ini dari kelas CustomExceptionHandler (rrainn), menurut phpscript saya.

package com.vxmobilecomm.activity;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;
import java.lang.Thread.UncaughtExceptionHandler;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.BufferedHttpEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;

import android.app.Activity;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.AsyncTask;
import android.util.Log;

public class CustomExceptionHandler implements UncaughtExceptionHandler {

    private UncaughtExceptionHandler defaultUEH;
    public static String sendErrorLogsTo = "[email protected]" ;

    Activity activity;

    public CustomExceptionHandler(Activity activity) {
        this.defaultUEH = Thread.getDefaultUncaughtExceptionHandler();
        this.activity = activity;
    }

    public void uncaughtException(Thread t, Throwable e) {

        final Writer result = new StringWriter();
        final PrintWriter printWriter = new PrintWriter(result);
        e.printStackTrace(printWriter);
        String stacktrace = result.toString();
        printWriter.close();
        String filename = "error" + System.nanoTime() + ".stacktrace";

        Log.e("Hi", "url != null");
        sendToServer(stacktrace, filename);

        StackTraceElement[] arr = e.getStackTrace();
        String report = e.toString() + "\n\n";
        report += "--------- Stack trace ---------\n\n";
        for (int i = 0; i < arr.length; i++) {
            report += "    " + arr[i].toString() + "\n";
        }
        report += "-------------------------------\n\n";

        report += "--------- Cause ---------\n\n";
        Throwable cause = e.getCause();
        if (cause != null) {
            report += cause.toString() + "\n\n";
            arr = cause.getStackTrace();
            for (int i = 0; i < arr.length; i++) {
                report += "    " + arr[i].toString() + "\n";
            }
        }
        report += "-------------------------------\n\n";

        defaultUEH.uncaughtException(t, e);
    }

    private void sendToServer(String stacktrace, String filename) {
        AsyncTaskClass async = new AsyncTaskClass(stacktrace, filename,
                getAppLable(activity));
        async.execute("");
    }

    public String getAppLable(Context pContext) {
        PackageManager lPackageManager = pContext.getPackageManager();
        ApplicationInfo lApplicationInfo = null;
        try {
            lApplicationInfo = lPackageManager.getApplicationInfo(
                    pContext.getApplicationInfo().packageName, 0);
        } catch (final NameNotFoundException e) {
        }
        return (String) (lApplicationInfo != null ? lPackageManager
                .getApplicationLabel(lApplicationInfo) : "Unknown");
    }

    public class AsyncTaskClass extends AsyncTask<String, String, InputStream> {
        InputStream is = null;
        String stacktrace;
        final String filename;
        String applicationName;

        AsyncTaskClass(final String stacktrace, final String filename,
                String applicationName) {
            this.applicationName = applicationName;
            this.stacktrace = stacktrace;
            this.filename = filename;
        }

        @Override
        protected InputStream doInBackground(String... params) 
        { 
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost(
                    "http://suo-yang.com/books/sendErrorLog/sendErrorLogs.php?");

            Log.i("Error", stacktrace);

            try {
                List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(
                        6);

                nameValuePairs.add(new BasicNameValuePair("data", stacktrace));
                nameValuePairs.add(new BasicNameValuePair("to",sendErrorLogsTo));
                nameValuePairs.add(new BasicNameValuePair("subject",applicationName));

                httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

                HttpResponse response = httpclient.execute(httppost);

                HttpEntity entity1 = response.getEntity();

                BufferedHttpEntity bufHttpEntity = new BufferedHttpEntity(
                        entity1);

                is = bufHttpEntity.getContent();

            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

            return is;
        }

        @Override
        protected void onPostExecute(InputStream result) {
            super.onPostExecute(result);

            Log.e("Stream Data", getStringFromInputStream(is));
        }
    }

    // convert InputStream to String
    private static String getStringFromInputStream(InputStream is) {

        BufferedReader br = null;
        StringBuilder sb = new StringBuilder();

        String line;
        try {

            br = new BufferedReader(new InputStreamReader(is));
            while ((line = br.readLine()) != null) {
                sb.append(line);
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        return sb.toString();

    }
}
Tushar Pandey
sumber
6

Sekarang, laporan Firebase Crash sangat populer dan lebih mudah digunakan. Silakan merujuk tautan berikut untuk informasi lebih lanjut: Firebase Crash Reporting

Semoga ini bisa membantu Anda.

Vaibhav Jadhav
sumber
5

Ini sangat kasar, tetapi memungkinkan untuk menjalankan logcat di mana saja, jadi peretasan yang cepat dan kotor akan ditambahkan ke sembarang blok tangkapan getRuntime().exec("logcat >> /sdcard/logcat.log");

Aleadam
sumber
Ini akan memberikan output log dari semua aplikasi. Penyaringan oleh App tagname mungkin baik-baik saja tetapi jangan berpikir ini akan menjadi cara yang baik untuk pergi karena entri mungkin kumulatif. Menghapus keluaran logcat setelah setiap penulisan mungkin bisa menyelesaikan masalah itu.
bschandramohan
5

Ada alat yang disebut fabric, ini adalah alat analitik crash, yang akan memungkinkan Anda untuk mendapatkan laporan kerusakan, ketika aplikasi dikerahkan secara langsung dan selama pengembangan. Menambahkan alat ini ke aplikasi Anda juga sederhana .. Saat aplikasi Anda mogok, laporan kerusakan itu dapat dilihat dari dasbor fabric.io Anda. laporan itu ditangkap secara otomatis. tidak akan meminta izin pengguna. Apakah dia ingin mengirim laporan bug / crash. Dan ini sepenuhnya gratis ... https://get.fabric.io/

Jam pasir
sumber
5

Google Firebase adalah cara terbaru (2016) Google untuk menyediakan data kerusakan / kesalahan pada ponsel Anda. Sertakan dalam file build.gradle Anda:

compile 'com.google.firebase:firebase-crash:9.0.0'

Kecelakaan fatal dicatat secara otomatis tanpa memerlukan input pengguna dan Anda juga dapat mencatat crash tidak fatal atau peristiwa lain seperti:

try
{

}
catch(Exception ex)
{
    FirebaseCrash.report(new Exception(ex.toString()));
}
Freek Nortier
sumber
5

Ada perpustakaan android ini bernama Sherlock . Ini memberi Anda laporan lengkap kerusakan bersama dengan informasi perangkat dan aplikasi. Setiap kali terjadi kerusakan, ini menampilkan pemberitahuan di bilah pemberitahuan dan mengklik mengklik pemberitahuan itu, itu membuka rincian kecelakaan. Anda juga dapat berbagi detail kerusakan dengan orang lain melalui email atau opsi berbagi lainnya.

Instalasi

android {
    dataBinding {
      enabled = true
    }
}

compile('com.github.ajitsing:sherlock:1.0.0@aar') {
    transitive = true
}

Demo

masukkan deskripsi gambar di sini

Ajit Singh
sumber
5

Meskipun banyak jawaban di halaman ini berguna, mudah bagi mereka untuk menjadi ketinggalan zaman. Situs web AppBrain mengumpulkan statistik yang memungkinkan Anda menemukan solusi pelaporan kerusakan paling populer yang ada saat ini:

Pustaka pelaporan kerusakan Android

situs web aplikasi otak

Anda dapat melihat bahwa pada saat memposting gambar ini, Crashlytics digunakan di 5,24% aplikasi dan 12,38% pemasangan.

David Rawson
sumber
4

Kami menggunakan sistem yang kami tanam sendiri di dalam perusahaan dan melayani kami dengan sangat baik. Ini adalah pustaka android yang mengirimkan laporan kerusakan ke server dan server yang menerima laporan dan membuat beberapa analitik. Server mengelompokkan pengecualian dengan nama pengecualian, stacktrace, pesan. Ini membantu mengidentifikasi masalah paling kritis yang perlu diperbaiki. Layanan kami dalam versi beta publik sekarang sehingga semua orang dapat mencobanya. Anda dapat membuat akun di http://watchcat.co atau lihat saja cara kerjanya menggunakan akses demo http://watchcat.co/reports/index.php?demo .

Fedor
sumber
3

Jika Anda ingin jawaban segera, Anda dapat menggunakan logcat

$adb shell logcat -f /sdcard/logoutput.txt *:E

Jika ada terlalu banyak sampah di log Anda sekarang, coba bersihkan dulu.

$adb shell logcat -c

Kemudian coba jalankan aplikasi Anda kemudian logcat lagi.

T. Webster
sumber
Bukankah ini masih mengharuskan Anda menghubungkan perangkat ke PC (mis. Dengan kabel)?
Gerard
3

Saya menemukan satu lagi aplikasi web yang bagus untuk melacak laporan kesalahan.

https://mint.splunk.com/

Sejumlah kecil langkah untuk dikonfigurasikan.

  1. Masuk atau daftar dan konfigurasikan menggunakan tautan di atas. Setelah Anda selesai membuat aplikasi, mereka akan memberikan garis untuk mengkonfigurasi seperti di bawah ini.
Mint.initAndStartSession(YourActivity.this, "api_key");
  1. Tambahkan yang berikut ini di build.gradl aplikasi.
android {
...
    repositories {
        maven { url "https://mint.splunk.com/gradle/"}
    }
...
}

dependencies {
...
    compile "com.splunk.mint:mint:4.4.0"
...
}
  1. Tambahkan kode yang kami salin di atas dan tambahkan ke setiap aktivitas.

    Mint.initAndStartSession (YourActivity.this, "api_key");

Itu dia. Anda masuk dan pergi ke dasbor aplikasi Anda, Anda akan mendapatkan semua laporan kesalahan.

Semoga ini bisa membantu seseorang.

Mahendran Sakkarai
sumber
Berapa biaya ini?
user2966445
2

Untuk layanan pelaporan pelaporan / pelaporan kecelakaan alternatif, periksa Raygun.io - ada banyak logika bagus untuk menangani gangguan Android, termasuk pengalaman pengguna yang baik saat menghubungkannya ke aplikasi Anda (dua baris kode di Aktivitas utama Anda dan beberapa baris XML disisipkan ke dalam AndroidManifest).

Ketika aplikasi Anda mogok, itu akan secara otomatis mengambil jejak tumpukan, data lingkungan untuk perangkat keras / perangkat lunak, info pelacakan pengguna, data kustom apa pun yang Anda tentukan dll. Ini mempostingnya ke API secara tidak sinkron sehingga tidak ada pemblokiran utas UI, dan menyimpannya di cache. ke disk jika tidak ada jaringan yang tersedia.

Penafian: Saya membangun penyedia Android :)

fundead
sumber
1

Baru Mulai menggunakan ACRA https://github.com/ACRA/acra menggunakan Google Forms sebagai backend dan sangat mudah diatur & digunakan, ini adalah default.

TETAPI Mengirim laporan ke Google Forms akan ditinggalkan (kemudian dihapus): https://plus.google.com/118444843928759726538/posts/GTTgsrEQdN6 https://github.com/ACRA/acra/wiki/Notice-on-Google -Form-Spreadsheet-penggunaan

Pokoknya memungkinkan untuk mendefinisikan pengirim Anda sendiri https://github.com/ACRA/acra/wiki/AdvancedUsage#wiki-Implementing_your_own_sender Anda dapat mencoba mengirim email kepada pengirim misalnya.

Dengan upaya minimum, Anda dapat mengirim laporan ke bugense: http://www.bugsense.com/docs/android#acra

NB Akun gratis bugense dibatasi hingga 500 laporan / bulan

Stefano IceCubeR
sumber
1

Terlambat ke pesta, saya mendukung dan percaya ACRA adalah pilihan terbaik di antara semuanya. Mudah diatur dan dikonfigurasikan. Saya telah membuat panduan terperinci dengan masukan dari seluruh penjuru untuk mengambil laporan kerusakan menggunakan ACRA dan mengirimkan hal yang sama ke alamat email saya menggunakan MandrillAp.

Tautan ke pos: https://androidician.wordpress.com/2015/03/29/sending-crash-reports-with-acra-over-email-using-mandrill/

Tautan ke proyek sampel di github: https://github.com/ayushhgoyal/AcraSample

Ayush Goyal
sumber
1

Saya salah satu pendiri Bugsnag yang kami desain untuk tujuan ini. Bugsnag secara otomatis menangkap pengecualian yang tidak ditangani di aplikasi Android dan mengirimkannya ke dasbor kami, tempat Anda dapat memprioritaskan perbaikan dan menyelami informasi diagnostik.

Berikut adalah beberapa hal penting untuk dipertimbangkan saat memilih atau membangun sistem pelaporan kerusakan, bersama dengan beberapa cuplikan kode:

  • Mendeteksi pengecualian yang tidak ditangani secara otomatis ( kode contoh )
  • Mengumpulkan data diagnostik seperti penggunaan memori, info perangkat, dll ( contoh kode )
  • Kelompok secara efektif terhempas bersama-sama karena akar masalah
  • Memungkinkan Anda melacak tindakan yang dilakukan pengguna sebelum setiap kerusakan untuk membantu mereproduksi ( kode contoh )

Jika Anda ingin melihat beberapa praktik terbaik seputar penanganan / pelaporan kerusakan di Android, Anda dapat memeriksa kode sumber lengkap untuk pustaka pelaporan kerusakan Bugsnag yang sepenuhnya open source, jangan ragu untuk merobohkannya dan menggunakannya dalam aplikasi Anda sendiri!

loopj
sumber
0

Jika aplikasi Anda sedang diunduh oleh orang lain dan macet di perangkat jarak jauh, Anda mungkin ingin melihat ke perpustakaan pelaporan kesalahan Android (dirujuk dalam pos SO ini ). Jika hanya di perangkat lokal Anda sendiri, Anda dapat menggunakan LogCat. Bahkan jika perangkat tidak terhubung ke mesin host ketika crash terjadi, menghubungkan perangkat dan mengeluarkan perintah adb logcat akan mengunduh seluruh riwayat logcat (setidaknya sejauh itu buffered yang biasanya merupakan loooot data log , hanya saja tidak terbatas). Apakah salah satu dari opsi itu menjawab pertanyaan Anda? Jika tidak, bisakah Anda mencoba menjelaskan apa yang Anda cari sedikit lebih banyak?

user647826
sumber
0

Google mengubah berapa banyak laporan kerusakan yang Anda dapatkan. Sebelumnya Anda hanya mendapat laporan bug yang dilaporkan secara manual.

Sejak konferensi pengembang terakhir dan pengenalan Android Vitals, Anda juga mendapatkan laporan kerusakan dari pengguna yang telah memungkinkan untuk berbagi data diagnostik.

Anda akan melihat semua kerusakan yang dikumpulkan dari perangkat Android yang pengguna telah memilih untuk secara otomatis berbagi data penggunaan dan diagnostik. Data tersedia untuk dua bulan sebelumnya.

Lihat kesalahan & aplikasi tidak merespons (ANR) kesalahan

woodii
sumber
logcat mengatakan ada file crash dump keluaran di /data/user/0/com.<myappname>/cache/WebView/Crash Report / <GUUID> .dmp, tetapi perangkat ini tidak di-rooting dan saya tidak tahu cara mengakses file ini!
Michael
0

Anda dapat melakukan ini langsung di Android Studio. Cukup sambungkan ponsel Anda, jalankan aplikasi, biarkan crash dan Anda dapat melihat stacktrace langsung di Android Studio.

Niklas R.
sumber