Saya memiliki aplikasi yang tidak ada di pasar (ditandatangani dengan sertifikat debug), tetapi ingin mendapatkan data log kerusakan, setiap kali aplikasi saya mogok. Di mana saya dapat menemukan log mengapa aplikasi saya mogok?
Saya memiliki aplikasi yang tidak ada di pasar (ditandatangani dengan sertifikat debug), tetapi ingin mendapatkan data log kerusakan, setiap kali aplikasi saya mogok. Di mana saya dapat menemukan log mengapa aplikasi saya mogok?
Jawaban:
Jika aplikasi Anda sedang diunduh oleh orang lain dan mogok 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 terjadi kecelakaan, menghubungkan perangkat dan mengeluarkan adb logcat
perintah 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 lebih banyak?
adb logcat
dari direktori adb apa pun berada. Atau Anda dapat menggunakan alat SDK yang termasuk dalam plugin Eclipse
$SDK_DIR/platform-tools/
. Untuk menampilkan kesalahan:.\adb.exe logcat -v time *:E
Cara untuk melakukannya adalah dengan mengimplementasikan Thread.UncaughtExceptionHandler
antarmuka dan meneruskannya ke Thread.setDefaultUncaughtExceptionHandler()
awal Aktivitas Anda onCreate()
. Inilah kelas implementasi TopExceptionHandler
.
public class TopExceptionHandler implements Thread.UncaughtExceptionHandler {
private Thread.UncaughtExceptionHandler defaultUEH;
private Activity app = null;
public TopExceptionHandler(Activity app) {
this.defaultUEH = Thread.getDefaultUncaughtExceptionHandler();
this.app = app;
}
public void uncaughtException(Thread t, Throwable e) {
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";
// If the exception was thrown in a background thread inside
// AsyncTask, then the actual exception can be found with getCause
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";
try {
FileOutputStream trace = app.openFileOutput("stack.trace",
Context.MODE_PRIVATE);
trace.write(report.getBytes());
trace.close();
} catch(IOException ioe) {
// ...
}
defaultUEH.uncaughtException(t, e);
}
}
Catatan Kami membiarkan kerangka kerja AndroidUEUE untuk menanganinya.
Di bagian atas Aktivitas Anda daftarkan instance dari kelas di atas seperti ini:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Thread.setDefaultUncaughtExceptionHandler(new TopExceptionHandler(this));
...
Pawang ini menyimpan jejak dalam sebuah file. KapanReaderScope
memulai kembali lain kali, ia mendeteksi file dan meminta pengguna jika ia ingin mengirimkannya melalui email kepada pengembang.
Untuk mengirim email ke Stack Trace, jalankan kode berikut untuk mengemasnya dalam email.
try {
BufferedReader reader = new BufferedReader(
new InputStreamReader(ReaderScopeActivity.this.openFileInput("stack.trace")));
while((line = reader.readLine()) != null) {
trace += line+"\n";
}
} catch(FileNotFoundException fnfe) {
// ...
} catch(IOException ioe) {
// ...
}
Intent sendIntent = new Intent(Intent.ACTION_SEND);
String subject = "Error report";
String body = "Mail this to appdeveloper@gmail.com: " + "\n" + trace + "\n";
sendIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"readerscope@altcanvas.com"});
sendIntent.putExtra(Intent.EXTRA_TEXT, body);
sendIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
sendIntent.setType("message/rfc822");
ReaderScopeActivity.this.startActivity(Intent.createChooser(sendIntent, "Title:"));
ReaderScopeActivity.this.deleteFile("stack.trace");
Atau Anda juga dapat menggunakan ACRA Error Reporting System. Cukup sertakan ACRA.jar di libs proyek Anda dan gunakan snipet kode di bawah ini sebelum deklarasi kelas aktivitas peluncur Anda
@ReportsCrashes(formKey = "", mailTo = "abc@gmail.com;def@yahoo.com", mode = ReportingInteractionMode.SILENT)
atau Anda dapat mencoba ini dari konsol: -
adb logcat -b crash
Ini dari http://www.herongyang.com/Android/Debug-adb-logcat-Command-Debugging.html
Anda dapat menggunakan adb:
adb logcat AndroidRuntime:E *:S
Anda dapat mencoba ini dari konsol:
adb logcat --buffer=crash
Info lebih lanjut tentang opsi ini:
adb logcat --help
...
-b <buffer>, --buffer=<buffer> Request alternate ring buffer, 'main',
'system', 'radio', 'events', 'crash', 'default' or 'all'.
Multiple -b parameters or comma separated list of buffers are
allowed. Buffers interleaved. Default -b main,system,crash.
Jika Anda menggunakan Eclipse, pastikan Anda menggunakan debug dan tidak dijalankan. Pastikan Anda berada dalam perspektif debug (kanan atas) Anda mungkin harus menekan 'Lanjutkan' (F8) beberapa kali agar log dapat dicetak. Log kerusakan akan berada di jendela Logcat di bagian bawah - klik dua kali untuk layar penuh dan pastikan Anda menggulir ke bawah. Anda akan melihat teks merah untuk kesalahan, jejak kerusakan akan menjadi sesuatu seperti
09-04 21:35:15.228: ERROR/AndroidRuntime(778): Uncaught handler: thread main exiting due to uncaught exception
09-04 21:35:15.397: ERROR/AndroidRuntime(778): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.dazlious.android.helloworld/com.dazlious.android.helloworld.main}: java.lang.ArrayIndexOutOfBoundsException
09-04 21:35:15.397: ERROR/AndroidRuntime(778): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2268)
09-04 21:35:15.397: ERROR/AndroidRuntime(778): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2284)
09-04 21:35:15.397: ERROR/AndroidRuntime(778): at android.app.ActivityThread.access$1800(ActivityThread.java:112)
09-04 21:35:15.397: ERROR/AndroidRuntime(778): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1692)
09-04 21:35:15.397: ERROR/AndroidRuntime(778): at android.os.Handler.dispatchMessage(Handler.java:99)
09-04 21:35:15.397: ERROR/AndroidRuntime(778): at android.os.Looper.loop(Looper.java:123)
09-04 21:35:15.397: ERROR/AndroidRuntime(778): at android.app.ActivityThread.main(ActivityThread.java:3948)
09-04 21:35:15.397: ERROR/AndroidRuntime(778): at java.lang.reflect.Method.invokeNative(Native Method)
09-04 21:35:15.397: ERROR/AndroidRuntime(778): at java.lang.reflect.Method.invoke(Method.java:521)
09-04 21:35:15.397: ERROR/AndroidRuntime(778): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782)
09-04 21:35:15.397: ERROR/AndroidRuntime(778): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540)
09-04 21:35:15.397: ERROR/AndroidRuntime(778): at dalvik.system.NativeStart.main(Native Method)
09-04 21:35:15.397: ERROR/AndroidRuntime(778): Caused by: java.lang.ArrayIndexOutOfBoundsException
09-04 21:35:15.397: ERROR/AndroidRuntime(778): at com.example.android.helloworld.main.onCreate(main.java:13)
09-04 21:35:15.397: ERROR/AndroidRuntime(778): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
09-04 21:35:15.397: ERROR/AndroidRuntime(778): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2231)
09-04 21:35:15.397: ERROR/AndroidRuntime(778): ... 11 more
Bagian penting untuk ini adalah
09-04 21:35:15.397: ERROR/AndroidRuntime(778): Caused by: java.lang.ArrayIndexOutOfBoundsException
09-04 21:35:15.397: ERROR/AndroidRuntime(778): at com.example.android.helloworld.main.onCreate(main.java:13)
yang memberi tahu kami itu adalah array di luar batas kecuali pada baris 13 main.java dalam metode onCrate.
Anda dapat menggunakan Apphance. Ini adalah layanan lintas-platform (sekarang terutama Android, iOS dengan platform lain dalam perjalanannya) yang memungkinkan untuk melakukan debug jarak jauh dengan semua perangkat seluler (Android, iOS sekarang - yang lain sedang dalam pengembangan). Ini jauh lebih dari sekedar crashlog, sebenarnya jauh lebih: logging, pelaporan masalah oleh penguji, crashlogs. Diperlukan sekitar 5 menit untuk berintegrasi. Saat ini Anda dapat meminta akses ke beta tertutup.
Penafian: Saya CTO dari Polidea, sebuah perusahaan di belakang Apphance dan salah satu pembuatnya.
Pembaruan: Apphance bukan lagi beta tertutup! Pembaruan 2: Penampilan tersedia sebagai bagian dari penawaran http://applause.com
libs
direktori seperti yang dijelaskan oleh SO ini . Komit github ini menunjukkan perubahan yang perlu saya lakukan pada aplikasi WorldMap saya untuk menggunakan apphance.
Berikut ini solusi lain untuk Crash Log.
Pasar Android memiliki alat bernama "Crash Collector"
periksa tautan berikut untuk informasi lebih lanjut
http://kpbird.blogspot.com/2011/08/android-application-crash-logs.html
Anda dapat menggunakan ACRA dari ini . Dengan menyertakan pustaka ini ke proyek Anda dan mengonfigurasinya, Anda dapat menerima (ke email atau gdocs) laporan kerusakan mereka. Maaf untuk bahasa Inggris saya yang buruk.
Jika Anda mencari alat pelaporan kerusakan dasar, coba crashlytics .
Jika Anda menginginkan alat pelaporan yang lebih canggih, Checkout Gryphonet . Ini mencatat semua crash yang terjadi bersama dengan baris kode yang menyebabkan crash bersama dengan spidol otomatis yang menunjukkan kepada Anda langkah-langkah yang diambil pengguna sebelum crash dan banyak lagi.
Semoga berhasil!
Saya telah membuat perpustakaan ini untuk menyelesaikan semua masalah Anda. Crash Reporter adalah alat praktis untuk menangkap semua kerusakan Anda dan mencatatnya di perangkat secara lokal
Cukup tambahkan ketergantungan ini dan Anda siap melakukannya.
compile 'com.balsikandar.android:crashreporter:1.0.1'
Temukan semua kerusakan Anda di perangkat secara lokal dan perbaiki sesuka Anda. Kecelakaan disimpan menggunakan format tanggal dan waktu yang mudah dilacak. Plus itu juga menyediakan API untuk menangkap Pengecualian Tercatat menggunakan metode di bawah ini.
CrashRepoter.logException(Exception e)
Anda juga dapat menggunakan crashcatcher perpustakaan
Jika Anda hanya mencari log kerusakan saat ponsel Anda terhubung ke komputer, gunakan tampilan DDMS di Eclipse dan laporan ada di sana di LogCat dalam DDMS ketika aplikasi Anda mogok saat debugging.
1) Hubungkan Telepon melalui USB (dengan opsi Pengembang Debug diaktifkan)
2) Buka Terminal dan Arahkan ke Android SDK Anda (untuk Mac):
cd ~/Library/Android/sdk/platform-tools
3) Logcat dari direktori itu (di terminal Anda) untuk menghasilkan aliran log yang konstan (untuk Mac):
./adb logcat
4) Buka aplikasi Anda yang macet untuk menghasilkan log macet
5) Ctrl + C untuk menghentikan terminal dan mencari log yang terkait dengan aplikasi yang macet. Itu bisa mengatakan sesuatu seperti berikut:
AndroidRuntime: FATAL EXCEPTION: main
Berdasarkan POST ini , gunakan kelas ini sebagai pengganti "TopExceptionHandler"
class TopExceptionHandler implements Thread.UncaughtExceptionHandler {
private Thread.UncaughtExceptionHandler defaultUEH;
private Activity app = null;
private String line;
public TopExceptionHandler(Activity app) {
this.defaultUEH = Thread.getDefaultUncaughtExceptionHandler();
this.app = app;
}
public void uncaughtException(Thread t, Throwable e) {
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";
// If the exception was thrown in a background thread inside
// AsyncTask, then the actual exception can be found with getCause
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";
try {
FileOutputStream trace = app.openFileOutput("stack.trace",
Context.MODE_PRIVATE);
trace.write(report.getBytes());
trace.close();
Intent i = new Intent(Intent.ACTION_SEND);
i.setType("message/rfc822");
i.putExtra(Intent.EXTRA_EMAIL , new String[]{"kevineyni@gmail.com"});
i.putExtra(Intent.EXTRA_SUBJECT, "crash report azar");
String body = "Mail this to kevineyni@gmail.com: " + "\n" + trace + "\n";
i.putExtra(Intent.EXTRA_TEXT , body);
try {
startActivity(Intent.createChooser(i, "Send mail..."));
} catch (android.content.ActivityNotFoundException ex) {
// Toast.makeText(MyActivity.this, "There are no email clients installed.", Toast.LENGTH_SHORT).show();
}
// ReaderScopeActivity.this.startActivity(Intent.createChooser(sendIntent, "Title:"));
//ReaderScopeActivity.this.deleteFile("stack.trace");
} catch(IOException ioe) {
// ...
}
defaultUEH.uncaughtException(t, e);
}
private void startActivity(Intent chooser) {
}
}
.....
dalam file kelas java yang sama (Aktivitas) .....
Public class MainActivity.....
.....
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Thread.setDefaultUncaughtExceptionHandler(new TopExceptionHandler(this));
.....
Coba aplikasi log Carsh dari android.
gunakan tautan untuk mengunduh aplikasi.