PEMBARUAN: Silakan lihat solusi "diterima" di bawah
Saat aplikasi saya membuat pengecualian yang tidak tertangani, bukan hanya menghentikan, saya ingin memberikan kesempatan kepada pengguna untuk mengirim file log. Saya menyadari bahwa melakukan lebih banyak pekerjaan setelah mendapatkan pengecualian acak berisiko, tetapi, hei, yang terburuk adalah aplikasi selesai mogok dan file log tidak terkirim. Ini ternyata lebih rumit dari yang saya harapkan :)
Apa yang berhasil: (1) menjebak pengecualian yang tidak tertangkap, (2) mengekstrak info log dan menulis ke file.
Yang belum berhasil: (3) memulai kegiatan mengirim email. Akhirnya, saya akan memiliki aktivitas lain untuk meminta izin pengguna. Jika saya mengaktifkan aktivitas email, saya tidak berharap banyak masalah untuk yang lain.
Inti masalahnya adalah bahwa pengecualian yang tidak tertangani tertangkap di kelas Aplikasi saya. Karena itu bukan Aktivitas, cara memulai aktivitas dengan Intent.ACTION_SEND tidak jelas. Artinya, biasanya untuk memulai aktivitas, seseorang memanggil startActivity dan melanjutkan dengan onActivityResult. Metode ini didukung oleh Aktivitas tetapi tidak oleh Aplikasi.
Ada saran tentang cara untuk melakukan hal ini?
Berikut beberapa potongan kode sebagai panduan memulai:
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);
}
}
sumber
Jawaban:
Inilah solusi lengkapnya (hampir: Saya menghilangkan tata letak UI dan penanganan tombol) - berasal dari banyak eksperimen dan berbagai posting dari orang lain yang terkait dengan masalah yang muncul di sepanjang jalan.
Ada beberapa hal yang perlu Anda lakukan:
Nah, berikut detailnya:
(1 & 2) Tangani uncaughtException, mulai kirim aktivitas log:
(3) Ekstrak log (saya taruh ini sebagai Aktivitas SendLog saya):
(4) Mulai aplikasi email (juga di Aktivitas SendLog saya):
(3 & 4) Inilah tampilan SendLog (Anda harus menambahkan UI, meskipun):
(5) Manifes:
(6) Pengaturan Proguard:
Di project.properties, ubah baris config. Anda harus menentukan "optimalkan" atau Proguard tidak akan menghapus panggilan Log.v () dan Log.d ().
Di proguard-project.txt, tambahkan berikut ini. Ini memberitahu Proguard untuk menganggap Log.v dan Log.d tidak memiliki efek samping (meskipun mereka melakukannya sejak mereka menulis ke log) dan dengan demikian dapat dihapus selama pengoptimalan:
Itu dia! Jika Anda memiliki saran untuk perbaikan ini, beri tahu saya dan saya dapat memperbarui ini.
sumber
Saat ini ada banyak alat reprting kerusakan yang melakukan ini dengan mudah.
crashlytics - Alat pelaporan kerusakan, gratis, tetapi memberi Anda laporan dasar. Keuntungan: Gratis
Gryphonet - Alat pelaporan yang lebih canggih, memerlukan beberapa jenis biaya. Keuntungan: Kemacetan yang mudah, ANR, kelambatan ...
Jika Anda adalah pengembang pribadi, saya akan menyarankan Crashlytics, tetapi jika itu adalah organisasi besar, saya akan memilih Gryphonet.
Semoga berhasil!
sumber
Coba gunakan ACRA sebagai gantinya - ini menangani pengiriman pelacakan tumpukan serta banyak informasi debug berguna lainnya ke backend Anda, atau ke dokumen Google Docs yang telah Anda siapkan.
https://github.com/ACRA/acra
sumber
Jawaban @ PeriHartman berfungsi dengan baik saat utas UI menampilkan pengecualian yang tidak tertangkap. Saya membuat beberapa perbaikan ketika pengecualian yang tidak tertangkap dilemparkan oleh utas non UI.
sumber
Dijelaskan dengan baik. Tapi satu pengamatan di sini, alih-alih menulis ke file menggunakan File Writer dan Streaming, saya memanfaatkan opsi logcat -f secara langsung. Ini kodenya
Ini membantu saya dalam membersihkan info buffer terbaru. Menggunakan File streaming memberi saya satu masalah yaitu tidak membersihkan log terbaru dari buffer. Tapi bagaimanapun, ini adalah panduan yang sangat membantu. Terima kasih.
sumber
Menangani Pengecualian yang tidak tertangkap: seperti yang dijelaskan @gilm, lakukan saja ini, (kotlin):
Saya harap ini membantu, ini berhasil untuk saya .. (: y). Dalam kasus saya, saya telah menggunakan perpustakaan 'com.microsoft.appcenter.crashes.Crashes' untuk pelacakan kesalahan.
sumber
Anda dapat menangani pengecualian yang tidak tertangkap menggunakan pustaka FireCrasher dan melakukan pemulihan darinya.
Anda dapat mengetahui lebih banyak tentang perpustakaan di Artikel Sedang ini
sumber