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.



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!


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

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


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


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.


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 ..


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.


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


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!


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


11

gunakan ini untuk menangkap detail pengecualian:

String stackTrace = Log.getStackTraceString(exception); 

simpan ini dalam database dan pertahankan lognya.


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.


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 = "tushar.pandey@virtualxcellence.com" ;

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 = "tushar.pandey@virtualxcellence.com" ;

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

    }
}


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


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/


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

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


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.


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 .


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.


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.


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 :)


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


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


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!


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?



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


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.