首页 > 其他分享 >Android14 屏蔽ANR和Crash弹窗

Android14 屏蔽ANR和Crash弹窗

时间:2024-09-23 10:20:05浏览次数:3  
标签:dialogs ANR java Dialog ErrorDialogController Crash 弹窗

前言

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日志。
  • 分析[email protected]文件中的异常堆栈,特别是主线程(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

相关文章