Thật không may, MyApp đã dừng lại. Làm sao tôi có thể giải quyết việc này?
Tôi đang phát triển một ứng dụng và mỗi khi tôi chạy nó, tôi nhận được thông báo:
Thật không may, MyApp đã dừng lại.
Tôi có thể làm gì để giải quyết vấn đề này?
Về câu hỏi này - rõ ràng được lấy cảm hứng từ Dấu vết ngăn xếp là gì và làm cách nào để tôi có thể sử dụng nó để gỡ lỗi ứng dụng của mình? , có rất nhiều câu hỏi nói rằng ứng dụng của họ đã bị lỗi mà không có bất kỳ chi tiết nào khác. Câu hỏi này nhằm mục đích hướng dẫn các lập trình viên Android mới làm quen về cách tự thử và khắc phục sự cố của họ hoặc đặt câu hỏi phù hợp.
Trả lời
Câu trả lời này mô tả quá trình truy xuất dấu vết ngăn xếp. Đã có dấu vết ngăn xếp? Đọc về dấu vết ngăn xếp trong "Dấu vết ngăn xếp là gì và làm cách nào tôi có thể sử dụng nó để gỡ lỗi ứng dụng của mình? "
Vấn đề
Ứng dụng của bạn bị bỏ dở vì có một ứng dụng chưa RuntimeException
được giải quyết.
Phổ biến nhất trong số này là NullPointerException
.
Làm thế nào để giải quyết nó?
Mỗi khi ứng dụng Android gặp sự cố (hoặc bất kỳ ứng dụng Java nào cho vấn đề đó), a Stack trace
sẽ được ghi vào bảng điều khiển (trong trường hợp này là logcat). Dấu vết ngăn xếp này chứa thông tin quan trọng để giải quyết vấn đề của bạn.
Android Studio
Trong thanh dưới cùng của cửa sổ, nhấp vào Logcat
nút. Ngoài ra, bạn có thể nhấn alt+ 6. Đảm bảo rằng trình mô phỏng hoặc thiết bị của bạn được chọn trong Devices
bảng điều khiển. Tiếp theo, cố gắng tìm dấu vết ngăn xếp, được hiển thị bằng màu đỏ. Có thể có rất nhiều thứ được đăng nhập vào logcat, vì vậy bạn có thể cần cuộn một chút. Một cách dễ dàng để tìm dấu vết ngăn xếp là xóa logcat (sử dụng thùng rác ở bên phải) và để ứng dụng gặp sự cố lần nữa.
Tôi đã tìm thấy dấu vết ngăn xếp, bây giờ thì sao?
Yay! Bạn đã đi được nửa chặng đường để giải quyết vấn đề của mình.
Bạn chỉ cần tìm ra nguyên nhân chính xác khiến ứng dụng của bạn gặp sự cố, bằng cách phân tích dấu vết ngăn xếp.
Đọc về dấu vết ngăn xếp trong "Dấu vết ngăn xếp là gì và làm cách nào tôi có thể sử dụng nó để gỡ lỗi ứng dụng của mình? "
Tôi vẫn không thể giải quyết vấn đề của mình!
Nếu bạn đã tìm thấy của mình Exception
và dòng nơi nó xảy ra, nhưng vẫn không thể tìm ra cách khắc phục, đừng ngần ngại đặt câu hỏi trên StackOverflow.
Cố gắng ngắn gọn nhất có thể: đăng dấu vết ngăn xếp và mã liên quan (ví dụ: một vài dòng tới dòng đã ném Exception
).
Bạn có thể sử dụng công cụ ADB của Google để có được Logcat file
để phân tích vấn đề này.
adb logcat > logcat.txt
mở logcat.txt
tệp và tìm kiếm tên ứng dụng của bạn. Phải có thông tin về lý do tại sao nó không thành công, số dòng, tên lớp, v.v.
Đầu tiên, bạn kiểm tra xem ứng dụng của bạn đã bị lỗi ở điểm nào ( Unfortunately, MyApp has stopped.
). Đối với điều này, bạn có thể sử dụng Log.e("TAG", "Message");
, bằng cách sử dụng dòng này, bạn có thể thấy ứng dụng của mình đăng nhập logcat.
Sau đó, bạn nhận thấy điểm nào ứng dụng của mình đã dừng, điều đó rất dễ dàng để giải quyết cho bạn.
Chỉ cần kiểm tra lỗi trong nhật ký mèo.
Bạn nhận được tùy chọn nhật ký mèo từ trong nhật thực:
window-> show view-> others-> Android-> Logcat
Nhật ký mèo có lỗi.
Một cách khôn ngoan khác, bạn cũng có thể kiểm tra lỗi bằng cách thực thi một ứng dụng ở chế độ gỡ lỗi. Đầu tiên đặt breakpoint sau đó bằng cách:
nhấp chuột phải vào dự án-> gỡ lỗi dưới dạng-> ứng dụng Android
Lưu ý: Câu trả lời này đang sử dụng Android Studio 2.2.2
Lưu ý 2: Tôi đang xem xét rằng thiết bị của bạn đã được kết nối thành công.
Điều đầu tiên bạn làm khi ứng dụng của bạn gặp sự cố là nhìn vào LogCat, ở cuối Android Studio có một thanh công cụ với danh sách các menu:
Nhấp vào "Màn hình Android" (Cái tôi đã gạch dưới trong hình trên. ^)
Bây giờ, bạn sẽ nhận được một cái gì đó như thế này:
Thay đổi " Verbose
" thành " Error
" Bây giờ nó sẽ chỉ hiển thị cho bạn các lỗi đã ghi. Đừng lo lắng về tất cả những lỗi này (nếu bạn mắc phải) bây giờ.
Đồng ý. Bây giờ, hãy làm những gì bạn đã làm để ứng dụng của bạn gặp sự cố. Sau khi ứng dụng của bạn gặp sự cố, hãy truy cập logcat của bạn. Bạn sẽ tìm thấy một bản ghi sự cố mới có rất nhiều at:x.x.x
: và Caused by: TrumpIsPresidentException
ví dụ. Đi tới Caused by:
tuyên bố đó trong logcat của bạn.
Bên cạnh đó Caused By:
, nên có Ngoại lệ đã xảy ra. Trong trường hợp của tôi, nó là một RuntimeException
và bên dưới nó phải có một dòng chứa liên kết màu xanh lam như:
Nếu dòng chữ đóCaused by:
KHÔNG CÓ dòng chữ màu xanh lam ở đâu đó, hãy tìm dòng chữ khác có dòng chữ đó Caused by:
.
Nhấp vào liên kết màu xanh lam đó . Nó sẽ đưa bạn đến nơi sự cố xảy ra. Trong trường hợp của tôi, đó là do dòng này:
throw new RuntimeException();
Vì vậy, bây giờ tôi biết tại sao nó bị lỗi. Đó là bởi vì tôi đang tự mình loại bỏ ngoại lệ. Đây là một lỗi rõ ràng .
Tuy nhiên, giả sử tôi gặp một lỗi khác:
java.lang.NullPointerException
Tôi đã kiểm tra logcat của mình, tôi nhấp vào liên kết màu xanh lam mà nó cung cấp cho tôi và nó đưa tôi đến đây:
mTextView.setText(myString);
Vì vậy, bây giờ tôi muốn gỡ lỗi. Theo câu hỏi StackOverflow này , một NullPointerException nói rằng một cái gì đó là null
.
Vì vậy, chúng ta hãy tìm hiểu null là gì . Có hai khả năng. Hoặc mTextView
là null hoặc myString
là null. Để tìm hiểu, trước mTextView.setText(mString)
dòng, tôi thêm hai dòng sau:
Log.d("AppDebug","mTextView is null: " + String.valueOf(mTextView == null);
Log.d("AppDebug","myString is null: " + String.valueOf(myString== null);
Bây giờ, giống như chúng tôi đã làm trước đây (Chúng tôi đã đổi Verose thành Error), chúng tôi muốn thay đổi "Error" thành "Debug". Vì chúng tôi đang ghi nhật ký bằng cách gỡ lỗi. Đây là tất cả các phương pháp Nhật ký:
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
Vì vậy, kể từ khi chúng tôi sử dụng Log.d
, chúng tôi đang kiểm tra Gỡ lỗi. Đó là lý do tại sao chúng tôi đã thay đổi nó thành gỡ lỗi.
Thông báo Log.d
có một tham số đầu tiên, trong trường hợp của chúng tôi là "AppDebug". Nhấp vào menu thả xuống "Không có Bộ lọc" ở phía trên bên phải của logcat. Chọn "Chỉnh sửa cấu hình bộ lọc", đặt tên cho bộ lọc của bạn và trong "Thẻ nhật ký" đặt "Gỡ lỗi ứng dụng". Nhấp vào "OK". Bây giờ, bạn sẽ thấy hai dòng trong logcat:
yourPackageNameAndApp: mTextView is null: true
yourPackageNameAndApp: myString is null: false
Vì vậy, bây giờ chúng ta biết rằng mTextView là null.
Tôi quan sát mã của mình, bây giờ tôi nhận thấy điều gì đó.
Tôi đã private TextView mTextView
tuyên bố đứng đầu lớp của mình. Nhưng, tôi không định nghĩa nó.
Về cơ bản, tôi đã quên làm điều này trong onCreate () của mình:
mTextView = (TextView) findViewById(R.id.textview_id_in_xml);
Vì vậy, ĐÓ mTextView
là lý do tại sao trống, bởi vì tôi đã quên nói cho ứng dụng của mình biết nó là gì. Vì vậy, tôi thêm dòng đó, chạy ứng dụng của mình và bây giờ ứng dụng không bị lỗi.
Cửa sổ bật lên này chỉ hiển thị khi bạn nhận được một ngoại lệ nghiêm trọng trong mã của mình, điều này sẽ dừng việc thực thi ứng dụng. Nó có thể là bất kỳ ngoại lệ nào NullPointerException
, OutOfMemoryException
v.v.
Cách tốt nhất để kiểm tra là thông qua Logcat nếu bạn vẫn đang phát triển ứng dụng trong Android studio, đây là cách nhanh chóng để đọc dấu vết ngăn xếp và kiểm tra nguyên nhân của ứng dụng.
Nếu ứng dụng của bạn đã hoạt động, thì bạn không thể sử dụng logcat . Vì vậy, bạn có thể triển khai Crashlytics
để cung cấp cho bạn các báo cáo lỗi về bất kỳ trường hợp ngoại lệ nào xảy ra.
Kiểm tra Logcat
tin nhắn của bạn và xem Manifest
tệp của bạn . Sẽ thiếu một cái gì đó như xác định Activity,
quyền Người dùng`, v.v.
Bạn có thể sử dụng bất kỳ công cụ nào sau đây:
adb logcat
adb logcat> logs.txt (bạn có thể sử dụng trình chỉnh sửa để mở và tìm kiếm lỗi.)
eclipse logcat (Nếu không hiển thị trong eclipse, hãy đi tới Windows-> Hiển thị Chế độ xem-> Khác-> Android-> LogCat)
Android Debug Monitor hoặc Android Device Monitor (nhập lệnh theo dõi hoặc mở qua giao diện người dùng)
- Android Studio
Tôi đề nghị sử dụng Android Debug Monitor , nó là tốt. Bởi vì nhật thực bị treo khi có quá nhiều nhật ký ở đó, và thông qua bộ lọc adb logcat và tất cả đều khó khăn.
Bạn phải kiểm tra Stack trace
Làm thế nào để làm điều đó?
trên IDE của bạn Kiểm tra biểu mẫu cửa sổ LOGCAT
Nếu bạn không thấy cửa sổ logcat, hãy truy cập đường dẫn này và mở nó
window->show view->others->Android->Logcat
nếu bạn đang sử dụng Google-Api, hãy đi đến đường dẫn này
adb logcat> logcat.txt
Trong phương thức showToast () bên dưới, bạn phải truyền một tham số khác cho ngữ cảnh hoặc ngữ cảnh ứng dụng bằng cách làm như vậy bạn có thể thử.
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();
}
Hãy để tôi chia sẻ phân tích Logcat cơ bản về thời điểm bạn gặp Force Close (khi ứng dụng ngừng hoạt động).
DOCS
Công cụ cơ bản của Android để thu thập / phân tích nhật ký là logcat.
ĐÂY là trang của Android về logcat
Nếu bạn sử dụng android Studio, bạn cũng có thể kiểm tra LINK này .
Chụp
Về cơ bản, bạn có thể chụp logcat một cách thủ công bằng lệnh sau (hoặc chỉ cần kiểm tra cửa sổ AndroidMonitor trong AndroidStudio):
adb logcat
Có rất nhiều tham số bạn có thể thêm vào lệnh giúp bạn lọc và hiển thị thông báo mà bạn muốn ... Đây là thông tin cá nhân ... Tôi luôn sử dụng lệnh dưới đây để lấy dấu thời gian của thông báo:
adb logcat -v time
Bạn có thể chuyển hướng đầu ra thành tệp và phân tích tệp đó trong Trình soạn thảo văn bản.
Phân tích
Nếu ứng dụng của bạn đang gặp sự cố, bạn sẽ nhận được một cái gì đó như:
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
Phần này của nhật ký hiển thị cho bạn rất nhiều thông tin:
- Khi sự cố xảy ra:
07-09 08:29:13.475
Điều quan trọng là phải kiểm tra thời điểm sự cố xảy ra ... Bạn có thể tìm thấy một số lỗi trong nhật ký ... bạn phải chắc chắn rằng bạn đang kiểm tra các thông báo thích hợp :)
- Ứng dụng nào bị lỗi:
com.example.khan.abc
Bằng cách này, bạn biết ứng dụng nào bị lỗi (để đảm bảo rằng bạn đang kiểm tra nhật ký về tin nhắn của mình)
- LỖI nào:
java.lang.NullPointerException
Lỗi ngoại lệ con trỏ NULL
- Thông tin chi tiết về lỗi:
Attempt to invoke virtual method 'void android.support.v4.app.FragmentActivity.onBackPressed()' on a null object reference
Bạn đã cố gắng gọi phương thức onBackPressed()
từ một FragmentActivity
đối tượng. Tuy nhiên, đối tượng đó là null
khi bạn làm điều đó.
Stack Trace: Stack Trace hiển thị cho bạn thứ tự gọi phương thức ... Đôi khi, lỗi xảy ra trong phương thức gọi (và không phải trong phương thức được gọi).
tại com.example.khan.abc.AudioFragment $ 1.onClick (AudioFragment.java:125)
Đã xảy ra lỗi trong tệp com.example.khan.abc.AudioFragment.java
, onClick()
phương thức bên trong tại dòng: 125
(stacktrace hiển thị dòng đã xảy ra lỗi)
Nó được gọi bằng:
at android.view.View.performClick(View.java:4848)
Được gọi bằng:
at android.view.View$PerformClick.run(View.java:20262)
được gọi bằng:
at android.os.Handler.handleCallback(Handler.java:815)
Vân vân....
Tổng quat
Đây chỉ là một cái nhìn tổng quan ... Không phải tất cả nhật ký đều đơn giản nhưng lỗi đưa ra vấn đề cụ thể và chi tiết hiển thị tất cả vấn đề ... Nó chỉ là để chia sẻ ý tưởng và cung cấp thông tin cấp đầu vào cho bạn ...
Tôi hy vọng tôi có thể giúp bạn một lúc nào đó ... Trân trọng
Sử dụng LogCat và cố gắng tìm nguyên nhân khiến ứng dụng gặp sự cố.
Để xem Logcat nếu bạn sử dụng Android Studio, hãy nhấn ALT + 6 hoặc
nếu bạn sử dụng Eclipse thì Window -> Open Perspective -> Other - LogCat
Đi tới LogCat, từ trình đơn thả xuống chọn lỗi. Điều này sẽ chứa tất cả thông tin cần thiết để giúp bạn gỡ lỗi. Nếu điều đó không hữu ích, hãy đăng LogCat dưới dạng chỉnh sửa cho câu hỏi của bạn và ai đó sẽ giúp bạn.
Nếu ứng dụng của bạn bị treo vì lý do nào đó mà không có hệ thống ngăn xếp tốt. Hãy thử gỡ lỗi nó từ dòng đầu tiên và đi từng dòng cho đến khi gặp sự cố. Sau đó, bạn sẽ có câu trả lời, dòng nào đang gây rắc rối cho bạn. Có thể bạn có thể quấn nó vào thử khối bắt và đầu ra lỗi in.
Bạn cũng có thể tự nhận được thông báo lỗi này mà không có bất kỳ dấu vết ngăn xếp nào hoặc bất kỳ thông báo lỗi nào khác.
Trong trường hợp này, bạn cần đảm bảo rằng tệp kê khai Android của mình được định cấu hình chính xác (bao gồm mọi hoạt động hợp nhất tệp kê khai xảy ra từ thư viện và bất kỳ hoạt động nào đến từ thư viện) và đặc biệt chú ý đến hoạt động đầu tiên được hiển thị trong ứng dụng của bạn trong tệp kê khai .
Sự cố trong quá trình phát triển
Hãy thử logview công cụ yêu thích của tôi để lấy nhật ký và phân tích chúng trong quá trình phát triển.
Đảm bảo đánh dấu ./logview
và ./lib/logview.jar
là tệp thực thi khi chạy trong Linux.
Nếu bạn không thích nó, có rất nhiều trình xem nhật ký trên máy tính để bàn thay thế cho Android .
Tai nạn trong tự nhiên
Tích hợp công cụ báo cáo sự cố theo thời gian thực, chẳng hạn như Firebase Crashlytics để nhận được dấu vết của các trường hợp ngoại lệ không được khắc phục đã xảy ra trên thiết bị của người dùng.
Đọc Cách phát hành một ứng dụng lỗi (Và Trực tiếp để kể câu chuyện) để biết thêm về cách xử lý lỗi trong lĩnh vực này.
Mọi người mắc lỗi và lập trình cũng vậy.
Khi có bất kỳ sự cố nào error
xảy ra, hãy luôn kiểm tra logcat với dòng chữ màu đỏ, tuy nhiên bạn có thể tìm ra vấn đề thực sự trong văn bản màu xanh lam với gạch chân trong dòng chữ màu đỏ đó.
Đảm bảo nếu bạn tạo mới activity
, hãy luôn khai báo activity
trong AndroidManifest
tệp.
Nếu thêm Quyền, hãy khai báo nó trong AndroidMainifest
tệp.
Logcat - Để kiểm tra nhật ký trong giai đoạn phát triển của Android Studio
Ban đầu hãy xóa Logcat và để ứng dụng gặp sự cố lần nữa để bạn chỉ có thể nhận được chi tiết nhật ký bị lỗi. Bạn phải kiểm tra dấu vết ngăn xếp
Trong khi, thật không may, MyApp đã dừng lại. Có rất nhiều lý do cho nó. Bạn có thể kiểm tra nhật ký tương tự. Đối với điều này, bạn có thể sử dụng Log.e ("TAG", "Tin nhắn");
Lỗi thường gặp trong sự cố ứng dụng như:
- Lỗi mã hóa (Sử dụng sai từ khóa).
- Tên thuộc tính không khớp.
- Plugin không được hỗ trợ (có thể).
- Phiên bản không khớp (có thể).
- Hoạt động bị thiếu trong tệp AndroidManifest.
- Thiếu quyền trong tệp AndroidManifest.
- NullPointerException phổ biến nhất.
- Đã khai báo nhưng không được xác định.
Để giải quyết lỗi crash ứng dụng:
- Hãy ghi nhớ những điểm trên và đi qua nó.
- Với lỗi, bạn sẽ nhận được tên tệp cũng có màu xanh lam (nhấp vào chúng và chuyển đến mã do lỗi đang xảy ra).
Trước tiên, bạn cần kiểm tra vị trí và lý do tại sao ứng dụng của bạn bị lỗi. (Unfortunately, MyApp has stopped.).
Với sự trợ giúp của LOG
, bạn có thể tìm ra lỗi.
Sau đó, bạn tìm thấy điểm nào mà ứng dụng của bạn đã dừng, hãy sửa lỗi đó từ điểm của bạn.
Nếu bạn không có bất kỳ loại nhật ký thú vị nào trong thiết bị đầu cuối của mình (hoặc chúng không liên quan trực tiếp đến ứng dụng của bạn), có thể vấn đề của bạn là do thư viện gốc. Trong trường hợp đó, bạn nên kiểm tra các tệp "bia mộ" trong thiết bị đầu cuối của mình.
Vị trí mặc định cho các tệp bia mộ tùy thuộc vào mọi thiết bị, nhưng nếu đúng như vậy, bạn sẽ có một nhật ký cho biết: Tombstone written to: /data/tombstones/tombstone_06
Để biết thêm thông tin, hãy xem tại https://source.android.com/devices/tech/debug .
Ngoài ra, chạy lệnh này trong terminal có thể giúp tìm ra sự cố:
gradlew build > log.txt 2>details.txt
thì bạn nên đi đến vị trí tệp gradlew trong đọc hai tệp nhật ký ở trên.