Sayangnya MyApp telah berhenti. Bagaimana saya bisa memecahkan masalah ini?
Saya mengembangkan aplikasi, dan setiap saya menjalankannya, saya mendapatkan pesan:
Sayangnya, MyApp telah berhenti.
Apa yang dapat saya lakukan untuk mengatasi ini?
Tentang pertanyaan ini - jelas terinspirasi oleh Apa itu pelacakan tumpukan, dan bagaimana saya dapat menggunakannya untuk men-debug kesalahan aplikasi saya? , banyak sekali pertanyaan yang menyatakan bahwa aplikasinya mengalami crash, tanpa penjelasan lebih lanjut. Pertanyaan ini bertujuan untuk menginstruksikan programmer Android pemula tentang cara mencoba dan memperbaiki masalah mereka sendiri, atau mengajukan pertanyaan yang tepat.
Jawaban
Jawaban ini menjelaskan proses mengambil pelacakan tumpukan. Sudah memiliki pelacakan tumpukan? Baca tentang pelacakan tumpukan di " Apa itu pelacakan tumpukan, dan bagaimana cara menggunakannya untuk men-debug kesalahan aplikasi saya? "
Masalah
Aplikasi Anda berhenti karena pelemparan yang tidak tertangkap RuntimeException
.
Yang paling umum adalah NullPointerException
.
Bagaimana cara mengatasinya?
Setiap kali aplikasi Android mogok (atau aplikasi Java apa pun), a Stack trace
akan ditulis ke konsol (dalam hal ini, logcat). Pelacakan tumpukan ini berisi informasi penting untuk memecahkan masalah Anda.
Android Studio
Di bilah bawah jendela, klik Logcat
tombol. Atau, Anda dapat menekan alt+ 6. Pastikan emulator atau perangkat Anda dipilih di Devices
panel. Selanjutnya, coba temukan jejak tumpukan, yang ditunjukkan dengan warna merah. Mungkin ada banyak hal yang masuk ke logcat, jadi Anda mungkin perlu menggulir sedikit. Cara mudah untuk menemukan pelacakan tumpukan adalah dengan membersihkan logcat (menggunakan keranjang sampah di sebelah kanan), dan membiarkan aplikasi mogok lagi.
Saya telah menemukan jejak tumpukan, sekarang apa?
Yay! Anda setengah jalan untuk menyelesaikan masalah Anda.
Anda hanya perlu mencari tahu apa yang sebenarnya membuat aplikasi Anda mogok, dengan menganalisis pelacakan tumpukan.
Baca tentang pelacakan tumpukan di " Apa itu pelacakan tumpukan, dan bagaimana cara menggunakannya untuk men-debug kesalahan aplikasi saya? "
Saya masih tidak bisa menyelesaikan masalah saya!
Jika Anda telah menemukan Anda Exception
dan baris tempat terjadinya, dan masih tidak tahu cara memperbaikinya, jangan ragu untuk mengajukan pertanyaan di StackOverflow.
Cobalah sesingkat mungkin: posting jejak tumpukan, dan kode yang relevan (misalnya beberapa baris ke baris yang menampilkan Exception
).
Anda dapat menggunakan alat ADB Google untuk mendapatkan Logcat file
untuk menganalisis masalah.
adb logcat > logcat.txt
buka logcat.txt
file dan cari nama aplikasi Anda. Harus ada informasi mengapa gagal, nomor baris, nama kelas, dll.
Pertama, Anda memeriksa titik mana aplikasi Anda macet ( Unfortunately, MyApp has stopped.
). Untuk ini, Anda dapat menggunakan Log.e("TAG", "Message");
, menggunakan baris ini Anda dapat melihat log aplikasi Anda di logcat.
Setelah itu, Anda menemukan titik mana yang dihentikan aplikasi Anda, sangat mudah dipecahkan di pihak Anda.
Periksa saja kesalahan di log cat.
Anda mendapatkan opsi kucing log dari dalam gerhana:
jendela-> tampilkan tampilan-> lainnya-> Android-> Logcat
Cat log mengandung kesalahan.
Selain itu, Anda juga dapat memeriksa kesalahan dengan menjalankan aplikasi dalam mode debug. Pertama-tama setel breakpoint setelah itu dengan melakukan:
klik kanan pada proyek-> debug sebagai-> aplikasi Android
Catatan: Jawaban ini menggunakan Android Studio 2.2.2
Catatan 2: Saya mempertimbangkan bahwa perangkat Anda berhasil terhubung.
Hal pertama yang Anda lakukan saat aplikasi Anda mogok adalah melihat ke LogCat, di bagian bawah Android Studio ada toolbar dengan daftar menu:
Klik pada "Android Monitor" (Yang saya garis bawahi pada gambar di atas. ^)
Sekarang, Anda akan mendapatkan sesuatu seperti ini:
Ubah " Verbose
" menjadi " Error
" Sekarang hanya akan menampilkan kesalahan yang dicatat. Jangan khawatir tentang semua kesalahan ini (jika Anda mendapatkannya) sekarang.
Baik. Sekarang, lakukan apa yang Anda lakukan untuk membuat aplikasi Anda mogok. Setelah aplikasi Anda mogok, buka logcat Anda. Anda harus menemukan log kerusakan baru yang memiliki banyak at:x.x.x
: dan Caused by: TrumpIsPresidentException
misalnya. Buka Caused by:
pernyataan itu di logcat Anda.
Di samping itu Caused By:
, harus ada Pengecualian yang terjadi. Dalam kasus saya, itu a RuntimeException
dan di bawahnya harus ada baris yang berisi tautan biru seperti:
Jika ituCaused by:
TIDAK memiliki baris dengan teks biru di bawahnya, maka cari baris lain yang memiliki teks biru Caused by:
.
Klik pada tautan biru itu . Ini akan membawa Anda ke tempat masalah terjadi. Dalam kasus saya, itu karena baris ini:
throw new RuntimeException();
Jadi, sekarang saya tahu mengapa ini crash. Itu karena saya sendiri yang membuat pengecualian. Ini adalah kesalahan yang jelas .
Namun, katakanlah saya mendapat kesalahan lain:
java.lang.NullPointerException
Saya memeriksa logcat saya, saya mengklik tautan biru yang diberikannya kepada saya, dan itu membawa saya ke sini:
mTextView.setText(myString);
Jadi, sekarang saya ingin men-debug. Menurut pertanyaan StackOverflow ini , NullPointerException mengatakan bahwa ada sesuatu null
.
Jadi, mari kita cari tahu apa itu null . Ada dua kemungkinan. Bisa mTextView
nihil, atau myString
nihil. Untuk mengetahuinya, sebelum mTextView.setText(mString)
baris, saya menambahkan dua baris ini:
Log.d("AppDebug","mTextView is null: " + String.valueOf(mTextView == null);
Log.d("AppDebug","myString is null: " + String.valueOf(myString== null);
Sekarang, seperti yang kami lakukan sebelumnya (Kami mengubah Verose menjadi Error), kami ingin mengubah "Error" menjadi "Debug". Karena kami masuk dengan debugging. Berikut semua metode Log:
Log.
d means Debug
e means error
w means warning
v means verbose
i means information
wtf means "What a terrible failure". This is similar to Log.e
Jadi, karena kami menggunakan Log.d
, kami memeriksa Debug. Itulah mengapa kami mengubahnya menjadi debug.
Pemberitahuan Log.d
memiliki parameter pertama, dalam kasus kami "AppDebug". Klik menu drop-down "No Filters" di kanan atas logcat. Pilih "Edit Konfigurasi Filter", beri nama untuk filter Anda, dan di "Tag Log", masukkan "Debug Aplikasi". Klik "OK". Sekarang, Anda akan melihat dua baris di logcat:
yourPackageNameAndApp: mTextView is null: true
yourPackageNameAndApp: myString is null: false
Jadi sekarang kita tahu bahwa mTextView adalah null.
Saya mengamati kode saya, sekarang saya melihat sesuatu.
Saya telah private TextView mTextView
menyatakan di puncak kelas saya. Tapi, saya tidak mendefinisikannya.
Pada dasarnya saya lupa melakukan ini di onCreate () saya:
mTextView = (TextView) findViewById(R.id.textview_id_in_xml);
Jadi ITULAH mengapa mTextView
null, karena saya lupa memberi tahu aplikasi saya apa itu. Jadi saya menambahkan baris itu, menjalankan aplikasi saya, dan sekarang aplikasi tidak macet.
Munculan ini hanya muncul ketika Anda mendapatkan pengecualian fatal dalam kode Anda yang menghentikan eksekusi aplikasi. Bisa jadi pengecualian apa pun NullPointerException
, OutOfMemoryException
dll.
Cara terbaik untuk memeriksanya adalah melalui Logcat jika Anda masih mengembangkan aplikasi di studio Android yang merupakan cara cepat untuk membaca pelacakan tumpukan dan memeriksa penyebab aplikasi.
Jika aplikasi Anda sudah aktif, maka Anda tidak dapat menggunakan logcat . Jadi, untuk itu Anda dapat menerapkan Crashlytics
untuk memberi Anda laporan bug dari setiap pengecualian yang terjadi.
Periksa Logcat
pesan Anda dan lihat Manifest
file Anda . Harus ada sesuatu yang hilang seperti menentukan Activity,
izin Pengguna`, dll.
Anda dapat menggunakan salah satu alat berikut:
adb logcat
adb logcat> logs.txt (Anda dapat menggunakan editor untuk membuka dan menelusuri kesalahan.)
eclipse logcat (Jika tidak terlihat di eclipse, Buka Windows-> Tampilkan Tampilan-> Lainnya-> Android-> LogCat)
Android Debug Monitor atau Android Device Monitor (ketik command monitor atau buka melalui UI)
- Android Studio
Saya sarankan untuk menggunakan Android Debug Monitor , itu bagus. Karena gerhana hang ketika terlalu banyak log yang ada, dan melalui filter logcat adb dan semuanya sulit.
Anda harus memeriksa Stack trace
Bagaimana cara melakukannya?
di IDE Anda Periksa jendela dari LOGCAT
Jika Anda tidak dapat melihat jendela logcat, buka jalur ini dan buka
window->show view->others->Android->Logcat
jika Anda menggunakan Google-Api pergi ke jalur ini
adb logcat> logcat.txt
Di bawah metode showToast () Anda harus meneruskan parameter lain untuk konteks atau konteks aplikasi dengan melakukannya Anda dapat mencobanya.
public void showToast(String error, Context applicationContext){
LayoutInflater inflater = getLayoutInflater();
View view = inflater.inflate(R.layout.custom_toast, (ViewGroup)
findViewById(R.id.toast_root));
TextView text = (TextView) findViewById(R.id.toast_error);
text.setText(error);
Toast toast = new Toast(applicationContext);
toast.setGravity(Gravity.TOP | Gravity.FILL_HORIZONTAL, 0, 0);
toast.setDuration(Toast.LENGTH_SHORT);
toast.setView(view);
toast.show();
}
Izinkan saya membagikan analisis Logcat dasar saat Anda bertemu dengan Force Close (saat aplikasi berhenti bekerja).
DOCS
Alat dasar dari Android untuk mengumpulkan / menganalisis log adalah logcat.
DI SINI adalah halaman Android tentang logcat
Jika Anda menggunakan Android Studio, Anda juga dapat memeriksa LINK ini .
Menangkap
Pada dasarnya, Anda secara MANUAL dapat menangkap logcat dengan perintah berikut (atau cukup periksa jendela AndroidMonitor di AndroidStudio):
adb logcat
Ada banyak parameter yang dapat Anda tambahkan ke perintah yang membantu Anda memfilter dan menampilkan pesan yang Anda inginkan ... Ini pribadi ... Saya selalu menggunakan perintah di bawah ini untuk mendapatkan stempel waktu pesan:
adb logcat -v time
Anda dapat mengarahkan output ke file dan menganalisisnya di Editor Teks.
Menganalisa
Jika aplikasi Anda mogok, Anda akan mendapatkan sesuatu seperti:
07-09 08:29:13.474 21144-21144/com.example.khan.abc D/AndroidRuntime: Shutting down VM
07-09 08:29:13.475 21144-21144/com.example.khan.abc E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.khan.abc, PID: 21144
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.app.FragmentActivity.onBackPressed()' on a null object reference
at com.example.khan.abc.AudioFragment$1.onClick(AudioFragment.java:125)
at android.view.View.performClick(View.java:4848)
at android.view.View$PerformClick.run(View.java:20262)
at android.os.Handler.handleCallback(Handler.java:815)
at android.os.Handler.dispatchMessage(Handler.java:104)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5631)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754)
07-09 08:29:15.195 21144-21144/com.example.khan.abc I/Process: Sending signal. PID: 21144 SIG: 9
Bagian log ini menunjukkan banyak informasi:
- Saat masalah terjadi:
07-09 08:29:13.475
Penting untuk memeriksa kapan masalah terjadi ... Anda mungkin menemukan beberapa kesalahan dalam log ... Anda harus yakin bahwa Anda memeriksa pesan yang benar :)
- Aplikasi mana yang mogok:
com.example.khan.abc
Dengan cara ini, Anda tahu aplikasi mana yang mogok (untuk memastikan bahwa Anda memeriksa log tentang pesan Anda)
- KESALAHAN mana:
java.lang.NullPointerException
Kesalahan Pengecualian Penunjuk NULL
- Info mendetail tentang kesalahan:
Attempt to invoke virtual method 'void android.support.v4.app.FragmentActivity.onBackPressed()' on a null object reference
Anda mencoba memanggil metode onBackPressed()
dari suatu FragmentActivity
objek. Namun, objek itu adalah null
saat Anda melakukannya.
Stack Trace: Stack Trace menunjukkan kepada Anda urutan pemanggilan metode ... Terkadang, kesalahan terjadi dalam metode pemanggilan (dan bukan dalam metode yang dipanggil).
di com.example.khan.abc.AudioFragment $ 1.onClick (AudioFragment.java:125)
Kesalahan terjadi dalam file com.example.khan.abc.AudioFragment.java
, di dalam onClick()
metode pada baris: 125
(stacktrace menunjukkan baris bahwa kesalahan terjadi)
Itu disebut oleh:
at android.view.View.performClick(View.java:4848)
Yang disebut oleh:
at android.view.View$PerformClick.run(View.java:20262)
yang disebut dengan:
at android.os.Handler.handleCallback(Handler.java:815)
dll ....
Gambaran
Ini hanya gambaran umum ... Tidak semua log itu sederhana tetapi kesalahan memberikan masalah tertentu dan verbose menunjukkan semua masalah ... Ini hanya untuk membagikan ide dan memberikan informasi tingkat awal kepada Anda ...
Saya harap saya bisa membantu Anda bagaimanapun juga ... Salam
Gunakan LogCat dan coba temukan apa yang menyebabkan aplikasi macet.
Untuk melihat Logcat jika Anda menggunakan Android Studio, tekan ALT + 6 atau
jika Anda menggunakan Eclipse lalu Window -> Open Perspective -> Other - LogCat
Buka LogCat, dari menu drop-down pilih error. Ini akan berisi semua informasi yang diperlukan untuk membantu Anda melakukan debug. Jika itu tidak membantu, posting LogCat sebagai edit untuk pertanyaan Anda dan seseorang akan membantu Anda.
Jika aplikasi Anda karena alasan tertentu mengalami error tanpa stacktrace yang baik. Coba debug dari baris pertama, dan lanjutkan baris demi baris hingga macet. Kemudian Anda akan mendapat jawaban, baris mana yang menyebabkan masalah bagi Anda. Mungkin Anda kemudian dapat membungkusnya menjadi blok coba tangkap dan output kesalahan cetak.
Anda juga bisa mendapatkan pesan kesalahan ini sendiri, tanpa jejak tumpukan atau pesan kesalahan lebih lanjut.
Dalam hal ini, Anda perlu memastikan manifes Android Anda dikonfigurasi dengan benar (termasuk penggabungan manifes apa pun yang terjadi dari pustaka dan aktivitas apa pun yang akan datang dari pustaka), dan memberi perhatian khusus pada aktivitas pertama yang ditampilkan dalam aplikasi Anda di file manifes Anda .
Crash selama pengembangan
Coba tool logview favorit saya untuk mendapatkan log dan menganalisisnya selama pengembangan.
Pastikan untuk menandai ./logview
dan ./lib/logview.jar
sebagai dapat dijalankan saat dijalankan di Linux.
Jika Anda tidak menyukainya, ada banyak penampil log desktop alternatif untuk Android .
Crash in the wild
Integrasikan alat pelaporan kerusakan waktu nyata seperti Firebase Crashlytics untuk mendapatkan pelacakan tumpukan pengecualian yang tidak tertangani yang terjadi di perangkat pengguna.
Baca Cara Merilis Aplikasi Buggy (Dan Live to Tell the Tale) untuk mengetahui lebih banyak tentang menangani bug di lapangan.
Orang membuat kesalahan, begitu juga dengan pengkodean.
Jika ada yang error
terjadi, selalu periksa logcat dengan teks berwarna merah. Namun Anda dapat mengetahui masalah sebenarnya pada teks berwarna biru dengan garis bawah pada teks berwarna merah tersebut.
Pastikan jika Anda membuat yang baru activity
, selalu deklarasikan activity
di dalam AndroidManifest
file.
Jika menambahkan Izin, nyatakan juga di AndroidMainifest
file.
Logcat - Untuk memeriksa log dalam fase pengembangan Android Studio
Pertama-tama, bersihkan Logcat dan biarkan aplikasi macet lagi sehingga Anda hanya bisa mendapatkan detail log yang mogok. Anda harus memeriksa jejak Stack
Sementara, Sayangnya, MyApp telah berhenti. Ada banyak alasan untuk itu. Anda dapat memeriksa log yang sama. Untuk ini, Anda dapat menggunakan Log.e ("TAG", "Message");
Kesalahan umum selama aplikasi crash seperti:
- Kesalahan pengkodean (Penggunaan kata kunci yang salah).
- Nama properti tidak cocok.
- Plugin tidak didukung (mungkin).
- Versi tidak cocok (mungkin).
- Aktivitas hilang di file AndroidManifest.
- Izin tidak ada di file AndroidManifest.
- NullPointerException paling umum.
- Dinyatakan tetapi tidak ditentukan.
Untuk mengatasi kesalahan aplikasi mogok:
- Ingatlah poin-poin di atas dan bahaslah.
- Dengan kesalahan, Anda akan mendapatkan nama file juga dalam warna biru (klik di atasnya dan lompat ke kode dari kesalahan yang terjadi).
Pertama, Anda perlu memeriksa di mana dan mengapa aplikasi Anda mengalami crash (Unfortunately, MyApp has stopped.).
Dengan bantuan LOG
, Anda dapat mencari tahu apa yang salah.
Setelah itu, Anda menemukan titik mana aplikasi Anda berhenti memperbaikinya dari titik Anda.
Jika Anda tidak memiliki jenis log yang menarik di terminal Anda (atau tidak terkait langsung dengan aplikasi Anda), mungkin masalah Anda disebabkan oleh perpustakaan asli. Jika demikian, Anda harus memeriksa file "batu nisan" di dalam terminal Anda.
Lokasi default untuk file batu nisan bergantung pada setiap perangkat, tetapi jika demikian, Anda akan memiliki catatan log: Tombstone written to: /data/tombstones/tombstone_06
Untuk informasi lebih lanjut, periksa https://source.android.com/devices/tech/debug .
Juga menjalankan perintah ini di terminal dapat membantu menemukan masalah:
gradlew build > log.txt 2>details.txt
maka Anda harus pergi ke lokasi file gradlew dalam membaca dua file log di atas.