前言
Android系统在应用发生Crash/ANR的时候,总会弹出一个提示对话框,但是现在部分客户不想要这样的对话框,要求移除
一、Application Crash
表现: 程序崩溃或闪退,界面上通常会出现“应用已停止运行”的提示。
常见原因(Java异常):
错误类型 | 详细描述 |
---|---|
NullPointerException | 尝试在需要对象的地方使用了null。 |
SQLException | 数据库操作错误,如SQL语句错误、数据库连接问题等。 |
ClassCastException | 尝试将对象强制转换为不是其实例的子类。 |
NumberFormatException | 将字符串转换为数字时格式不正确。 |
ClassNotFoundException | 尝试加载的类在类路径中找不到。 |
ArithmeticException | 数学运算错误,如除以零。 |
ArrayIndexOutOfBoundsException | 数组索引越界。 |
IllegalArgumentException | 向方法传递了非法或不适当的参数。 |
IllegalAccessException | 尝试访问或修改类的字段,但当前方法没有足够的访问权限。 |
ArrayStoreException | 试图将错误类型的对象存储到数组中。 |
Native Crash(C++层):
Native Crash发生在C++代码层,Java层难以直接捕获错误信息,通常表现为应用闪退。可通过Monkey测试等自动化测试工具进行监控。
具体原因:
- 设备碎片化:不同设备间的兼容性问题。
- 网络问题:带宽不足、网络切换等。
- 内存管理:内存泄漏、非授权内存访问等。
- 用户负载:高并发用户导致的资源竞争。
- 代码错误:空指针访问、非法指令执行等。
- 第三方服务:如广告插件或第三方库的不稳定。
测试中如何关注:
- 界面操作验证:确保所有按钮、控件操作有效,响应正确。
- 负载测试:通过自动化工具进行长时间或高负载测试,暴露潜在问题。
- 重复操作测试:多次重复相同操作,检查是否出现崩溃。
- 异常输入测试:对输入框进行非标准输入,检查应用的容错能力。
解决方法:
- 查看日志文件中的am_crash相关条目,定位崩溃点。
- 根据日志中的堆栈跟踪,分析并修复代码问题。
二、ANR(Application Not Responding)
表现: 应用无响应,用户界面卡住,系统弹出等待或强制关闭的对话框。
对应用的影响:
- 用户体验差,可能导致用户流失。
- 操作中断,可能造成数据丢失。
产生原因:
- 主线程阻塞:UI线程在5秒内未响应输入事件。
- BroadcastReceiver超时:未在10秒内完成处理并返回。
根本原因:
- 主线程执行了耗时的IO操作(如数据库读写、网络请求)。
- CPU资源被其他应用或线程占用,导致主线程得不到足够的时间片。
测试中如何关注:
- 耗时操作监控:关注上传大文件、保存复杂数据等操作的响应时间。
- 网络压力测试:在网络状况不佳或变化时测试应用稳定性。
- Monkey测试:通过随机事件生成器模拟用户操作,检测ANR问题。
- 内存和CPU监控:在多任务、多线程场景下监测资源使用情况。
解决方法:
- 在log文件夹中搜索am_anr或activitymanager: ANR,查找ANR日志。
- 分析data_app_anr@xxx.txt文件中的异常堆栈,特别是主线程(main prio=5 tid=1)的阻塞情况。
- 根据日志信息,优化代码,避免在主线程中执行耗时操作,或使用异步编程模型处理耗时任务。
代码示例
在常规开发中,经常遇到手机性能较低,以上优化方法提升不大的情况下,建议直接屏蔽弹窗
diff --git a/frameworks/base/services/core/java/com/android/server/am/ErrorDialogController.java b/frameworks/base/services/core/java/com/android/server/am/ErrorDialogController.java
old mode 100644
new mode 100755
index 82f35adbb13..a0942face68
--- a/frameworks/base/services/core/java/com/android/server/am/ErrorDialogController.java
+++ b/frameworks/base/services/core/java/com/android/server/am/ErrorDialogController.java
@@ -35,6 +35,9 @@ final class ErrorDialogController {
private final ActivityManagerService mService;
private final ActivityManagerGlobalLock mProcLock;
+ // Create by yeruilai 2024-8-29 15:57:56 Block ANR and Crash error dialogs
+ private static final boolean mShowDialog = !Build.IS_USER;
+
/**
* Dialogs being displayed due to crash.
*/
@@ -179,7 +182,13 @@ final class ErrorDialogController {
dialogs = mCrashDialogs;
}
if (dialogs != null) {
- forAllDialogs(dialogs, Dialog::show);
+ // Create by yeruilai 2024-9-2 10:24:07 Block ANR and Crash error dialogs
+ // forAllDialogs(dialogs, Dialog::show);
+ if(mShowDialog) {
+ forAllDialogs(dialogs, Dialog::show);
+ } else {
+ forAllDialogs(dialogs, Dialog::dismiss);
+ }
}
});
}
@@ -193,7 +202,13 @@ final class ErrorDialogController {
final Context c = contexts.get(i);
mAnrDialogs.add(new AppNotRespondingDialog(mService, c, data));
}
- scheduleForAllDialogs(mAnrDialogs, Dialog::show);
+ // Create by yeruilai 2024-9-2 10:24:07 Block ANR and Crash error dialogs
+ // scheduleForAllDialogs(mAnrDialogs, Dialog::show);
+ if(mShowDialog) {
+ scheduleForAllDialogs(mAnrDialogs, Dialog::show);
+ } else {
+ scheduleForAllDialogs(mAnrDialogs, Dialog::dismiss);
+ }
}
@GuardedBy("mProcLock")
标签:dialogs,ANR,java,Dialog,ErrorDialogController,Crash,弹窗
From: https://blog.csdn.net/u010345983/article/details/141857469