我正在开发一个应用程序,每次运行它时,我都会收到这样的消息:
不幸的是,MyApp已停止。
我可以做什么来解决这个问题?
关于这个问题-显然是受什么是堆栈跟踪以及如何使用它调试应用程序错误的启发?,有很多问题表明他们的应用程序已经崩溃,没有任何进一步的细节。这个问题旨在指导Android新手程序员如何自己解决问题,或者提出正确的问题。
我正在开发一个应用程序,每次运行它时,我都会收到这样的消息:
不幸的是,MyApp已停止。
我可以做什么来解决这个问题?
关于这个问题-显然是受什么是堆栈跟踪以及如何使用它调试应用程序错误的启发?,有很多问题表明他们的应用程序已经崩溃,没有任何进一步的细节。这个问题旨在指导Android新手程序员如何自己解决问题,或者提出正确的问题。
此答案描述了检索堆栈跟踪的过程。已经有堆栈跟踪了吗?阅读“什么是堆栈跟踪,如何使用它调试应用程序错误?”中的堆栈跟踪
问题
应用程序退出,因为引发了未捕获的RuntimeException。其中最常见的是NullPointerException。
如何解决?
每当Android应用程序(或任何Java应用程序)崩溃时,堆栈跟踪都会写入控制台(在本例中为logcat)。此堆栈跟踪包含解决问题的重要信息。
Android工作室
在窗口的底部栏中,单击Logcat按钮。或者,您可以按alt+6。确保在“设备”面板中选择了仿真器或设备。接下来,尝试查找以红色显示的堆栈跟踪。可能有很多内容登录到logcat中,因此您可能需要滚动一点。找到堆栈跟踪的一个简单方法是清除logcat(使用右侧的回收站),然后让应用程序再次崩溃。
我找到了堆栈跟踪,现在呢?
耶!你的问题已经解决了一半。您只需要通过分析堆栈跟踪来找出应用程序崩溃的原因。
阅读“什么是堆栈跟踪,如何使用它调试应用程序错误?”中的堆栈跟踪
我仍然无法解决我的问题!
如果您找到了异常及其发生的行,但仍然无法确定如何修复它,请不要犹豫,在StackOverflow上提问。
尽量简洁:发布堆栈跟踪和相关代码(例如,在引发异常的行之前的几行)。
首先,你检查你的应用程序在哪个点崩溃了(不幸的是,MyApp已经停止。)。为此,你可以使用Log.e(“TAG”,“Message”);,使用这一行,您可以在logcat中查看应用程序日志。
之后,你会发现你的应用程序停止了哪一点,这很容易在你身边解决。
您还可以自行获取此错误消息,而无需任何堆栈跟踪或任何进一步的错误消息。
在这种情况下,您需要确保您的Android清单配置正确(包括库中发生的任何清单合并以及库中的任何活动),并特别注意清单文件中应用程序中显示的第一个活动。
您可以使用Google的ADB工具获取Logcat文件来分析问题。
adb logcat > logcat.txt
打开logcat.txt文件并搜索应用程序名称。应该提供失败原因、行号、类名等信息。
只需检查日志cat中的错误。
您可以从eclipse中获得logcat选项:
窗口->显示视图->其他->Android->Logcat
日志目录包含错误。
另外,您也可以通过在调试模式下执行应用程序来检查错误。首先通过以下操作设置断点:
右键单击项目->调试为->Android应用程序
你必须检查堆栈跟踪
如何做到这一点?
在IDE上检查窗口窗体LOGCAT
如果你看不到原木色的窗户,就去这条路打开它
window->show view->others->Android->Logcat
如果您正在使用Google Api,请转到以下路径
adb logcat>logcat.txt
您可以使用以下任何工具:
adb测井仪adb logcat>logs.txt(您可以使用编辑器打开和搜索错误。)eclipse日志猫(如果在eclipse中不可见,请转到Windows->显示视图->其他->Android->日志猫)Android调试监视器或Android设备监视器(键入命令监视器或通过UI打开)
Android工作室
我建议使用Android调试监视器,它很好。因为当日志太多时,eclipse会挂起,而且通过adb logcat过滤器等都很困难。
使用LogCat并尝试查找导致应用程序崩溃的原因。
如果您使用Android Studio,请按ALT+6查看Logcat或
如果您使用Eclipse,那么窗口->打开透视->其他-LogCat
转到LogCat,从下拉菜单中选择错误。这将包含帮助您调试所需的所有信息。如果这没有帮助,发布LogCat作为对您问题的编辑,有人会帮助您解决问题。
让我分享一下当你遇到强制关闭时(当应用程序停止工作时)的基本Logcat分析。
DOCS
Android收集/分析日志的基本工具是logcat。
这里是Android关于logcat的页面
如果你使用android Studio,你也可以检查这个链接。
捕获
基本上,您可以使用以下命令手动捕获logcat(或者只需检查AndroidStudio中的AndroidMonitor窗口):
adb logcat
有很多参数可以添加到命令中,帮助您筛选和显示所需的消息。。。这是个人的。。。我总是使用下面的命令来获取消息时间戳:
adb logcat -v time
您可以将输出重定向到文件并在文本编辑器中分析它。
正在分析
如果你的应用程序正在崩溃,你会得到类似的结果:
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
日志的这一部分向您展示了许多信息:
问题发生时间:07-09 08:29:13.475
检查问题发生的时间很重要。。。您可能会在日志中发现几个错误。。。您必须确保正在检查正确的消息:)
哪个应用程序崩溃了:com.example.khan.abc
这样,您就知道哪个应用程序崩溃了(以确保您正在检查有关消息的日志)
哪个错误:java.lang.NullPointerException
NULL指针异常错误
有关错误的详细信息:尝试对空对象引用调用虚拟方法“void android.support.v4.app.FrageActivity.onBackPressed()”
您试图从FragmentActivity对象调用方法onBackPressed()。然而,当您这样做时,该对象为空。
堆栈跟踪:堆栈跟踪显示方法调用顺序。。。有时,错误发生在调用方法中(而不是在被调用方法中)。在com.example.khan.abc.AudioFragment$1.onClick(AudioFragment.java:125)
文件com.example.kan.abc.AudioFragment.java中发生错误,位于onClick()方法的第125行(stacktrace显示发生错误的行)
它由以下人员调用:
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)
等
概述
这只是一个概述。。。并非所有的日志都很简单,但错误给出了特定的问题,详细信息显示了所有问题。。。它只是为了分享这个想法并向您提供入门级信息。。。
我希望我能帮助你。。。当做
注意:此答案使用Android Studio 2.2.2
注2:我正在考虑您的设备是否已成功连接。
当应用程序崩溃时,首先要做的是查看LogCat,在Android Studio的底部有一个带有菜单列表的工具栏:
单击“Android监视器”(我在上图中画了下划线的监视器。^)
现在,你会得到这样的结果:
将“Verbose”更改为“Error”现在它只会显示记录的错误。现在不要担心所有这些错误(如果你有)。
好的。现在,做你所做的,让你的应用崩溃。应用程序崩溃后,转到日志。例如,您应该找到一个新的崩溃日志,其中包含大量的:x.x.x:和由:TrumpIsPresidentException引起的异常。转到日志中的“引起原因:”语句。
在“引发者:”旁边,应该有发生的异常。在我的例子中,这是一个RuntimeException,在它下面应该有一行包含蓝色链接,例如:
如果这是由:没有一行下面有蓝色文本,那么寻找另一个由:有。
单击蓝色链接。它会把你带到问题发生的地方。在我的案例中,这是因为这句话:
throw new RuntimeException();
所以,现在我知道它为什么会崩溃了。这是因为我自己在抛出例外。这是一个明显的错误。
然而,假设我又犯了一个错误:
java.lang.NullPointerException
我检查了我的日志,我点击了它给我的蓝色链接,它把我带到了这里:
mTextView.setText(myString);
所以,现在我要调试。根据StackOverflow问题,NullPointerException表示某个内容为空。
那么,让我们来看看什么是空的。有两种可能性。mTextView为空,或myString为空。为了找到答案,在mTextView.setText(mString)行之前,我添加了以下两行:
Log.d("AppDebug","mTextView is null: " + String.valueOf(mTextView == null);
Log.d("AppDebug","myString is null: " + String.valueOf(myString== null);
现在,就像我们之前所做的那样(我们将Verose更改为Error),我们希望将“Error”更改为“Debug”。因为我们是通过调试进行日志记录的。以下是所有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
因此,由于我们使用了Log.d,我们正在检查Debug。这就是我们将其更改为调试的原因。
注意Log.d有第一个参数,在我们的例子中是“AppDebug”。单击logcat右上角的“无过滤器”下拉菜单。选择“编辑过滤器配置”,为过滤器命名,然后在“日志标记”中输入“应用程序调试”。单击“确定”。现在,您应该在日志中看到两行:
yourPackageNameAndApp: mTextView is null: true
yourPackageNameAndApp: myString is null: false
现在我们知道mTextView为空。
我观察我的代码,现在我注意到了一些东西。
我在类的顶部声明了私有TextView mTextView。但是,我没有定义它。
基本上,我忘记在onCreate()中执行此操作:
mTextView = (TextView) findViewById(R.id.textview_id_in_xml);
所以这就是mTextView为空的原因,因为我忘记告诉我的应用程序它是什么。所以我添加了那行,运行我的应用,现在应用程序不会崩溃。
在下面的showToast()方法中,您必须为上下文或应用程序上下文传递另一个参数,这样您就可以尝试。
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();
}
只有当代码中出现致命异常,停止应用程序的执行时,才会显示此弹出窗口。它可以是任何异常NullPointerException、OutOfMemoryException等。
最好的检查方法是通过Logcat,如果您仍在Android studio中开发应用程序,这是快速读取堆栈跟踪并检查应用程序原因的方法。
如果你的应用已经上线,那么你就不能使用logcat。因此,您可以实现Crashlytics,为您提供任何异常的错误报告。
如果你的应用程序由于某种原因在没有良好堆栈的情况下崩溃。试着从第一行开始调试它,然后逐行调试直到崩溃。然后你会得到答案,哪一行给你带来了麻烦。很可能,您可以将其包装到try-catch块中并打印错误输出。
人们会犯错,编码也是如此。
当发生任何错误时,总是用红色文本检查日志,但是你可以在蓝色文本中找到真正的问题,红色文本中有下划线。
确保如果您创建了一个新活动,请始终在AndroidManifest文件中声明该活动。
如果添加Permission,请在AndroidMainifest文件中声明它。
开发期间崩溃
尝试我最喜欢的工具logview来获取日志并在开发过程中分析它们。确保标记/logview和/lib/logwiew.jar作为可执行文件在Linux中运行。
如果你不喜欢它,Android有很多替代的桌面日志查看器。
在野外撞车
集成实时崩溃报告工具(如Firebase Crashlytics),以获取用户设备上发生的未处理异常的堆栈跟踪。
阅读How to Release a Buggy App(和Live to Tell the Tale),了解更多有关处理现场bug的信息。
Logcat-在Android Studio的开发阶段检查日志
最初清除Logcat并让应用程序再次崩溃,这样您只能获得崩溃的日志详细信息。你必须检查堆栈跟踪
不幸的是,MyApp已停止。这有很多原因。你可以在日志中查看。为此,您可以使用Log.e(“标签”、“消息”);
应用程序崩溃期间的常见错误,如:
编码错误(错误使用关键字)。属性名称不匹配。不支持的插件(可能)。版本不匹配(可能)。AndroidManifest文件中缺少活动。AndroidManifest文件中缺少权限。最常见的NullPointerException。已声明但未定义。
要解决应用程序崩溃错误:
记住以上几点并仔细阅读。出现错误后,您将获得蓝色的文件名(单击它们并跳转到发生错误的代码)。
如果您的终端中没有任何有趣的日志(或者它们与您的应用程序没有直接关联),那么您的问题可能是由于本地库。在这种情况下,您应该检查终端中的“墓碑”文件。
逻辑删除文件的默认位置取决于每个设备,但如果是这样的话,则会有一个日志告诉您:逻辑删除已写入:/data/botobs/逻辑删除_06
有关详细信息,请查看https://source.android.com/devices/tech/debug.
在终端中运行此命令也有助于查找问题:
gradlew build > log.txt 2>details.txt
然后您应该转到gradlew文件位置,读取上面的两个日志文件。
如果你的应用程序没有任何错误地崩溃,并且你没有使用资产管理器,而是加载了如下纹理:
Texture texture = new Texture("myImage.png"); //dont to this all the time
那就是问题所在。我也遇到过这种情况。你应该经常使用资产管理器来避免内存过载。
我会提出类似的建议。
检查你的手机是否有足够的空间让应用程序运行----之前/当应用程序崩溃时检查日志。它将显示应用程序崩溃的确切位置。检查是否在主线程上使用了由于ANR而占用大量内存的内容。
检查您的Logcat消息。此外,请参阅Manifest文件以查找缺少的元素,如定义“活动”、用户权限等。
若要查看Logcat,如果您使用Android Studio,请按alt+6或
如果您使用Eclipse,那么窗口->打开透视->其他-LogCat
现在,从下拉菜单中选择error。
或者,您可以使用ADB工具获取Logcat文件来分析问题。
adb logcat > logcat.txt
现在打开logcat.txt文件并搜索应用程序名称。应该提供失败原因、行号、类名等信息。