app报错处理流程

在Android应用进程中,当出现报错时,会通过RuntimeInit设置异常处理,调用AMS的handleApplicationCrash方法,记录日志并进入AppErrors错误处理流程。在AppErrors中,makeAppCrashingLocked决定是否显示报错提示窗,并通过handleShowAppErrorUi弹出。如果已显示报错窗口或后台进程报错,则不再弹出。整个过程中涉及进程的移除和杀掉,确保app死亡处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

app报错处理流程

在android应用进程启动流程中,进程启动之初,在RuntimeInit中:

private static final void commonInit() {
        if (DEBUG) Slog.d(TAG, "Entered RuntimeInit!");

        /* set default handler; this applies to all threads in the VM */
        Thread.setDefaultUncaughtExceptionHandler(new UncaughtHandler());

        .......
    }

为该进程设置异常处理:
1、调用AMS的handleApplicationCrash方法
2、kill该进程

private static class UncaughtHandler implements Thread.UncaughtExceptionHandler {
        public void uncaughtException(Thread t, Throwable e) {
            try {
                // Don't re-enter -- avoid infinite loops if crash-reporting crashes.
                if (mCrashing) return;
                mCrashing = true;

                if (mApplicationObject == null) {
                    Clog_e(TAG, "*** FATAL EXCEPTION IN SYSTEM PROCESS: " + t.getName(), e);
                } else {
                    StringBuilder message = new StringBuilder();
                    message.append("FATAL EXCEPTION: ").append(t.getName()).append("\n");
                    final String processName = ActivityThread.currentProcessName();
                    if (processName != null) {
                        message.append("Process: ").append(processName).append(", ");
                    }
                    message.append("PID: ").append(Process.myPid());
                    Clog_e(TAG, message.toString(), e);
                }
                ........

                // Bring up crash dialog, wait for it to be dismissed
                ActivityManagerNative.getDefault().handleApplicationCrash(
                        mApplicationObject, new ApplicationErrorReport.CrashInfo(e));
            } catch (Throwable t2) {
                if (t2 instanceof DeadObjectException) {
                    // System process is dead; ignore
                } else {
                    try {
                        Clog_e(TAG, "Error reporting crash", t2);
                    } catch (Throwable t3) {
                        // Even Clog_e() fails!  Oh well.
                    }
                }
            } finally {
                // Try everything to make sure this process goes away.
                Process.killProcess(Process.myPid());
                System.exit(10);
            }
        }
    }

AMS.handleApplicationCrash
1、从正在运行的进程集合(mProcessNames)中找到该进程
2、获取进程名称,并且使用其添加一条日志记录到dropbox目录下
3、进入AppErrors错误处理流程crashApplication

public void handleApplicationCrash(IBinder app, ApplicationErrorReport.CrashInfo crashInfo) {
        ProcessRecord r = findAppProcess(app, "Crash");
        final String processName = app == null ? "system_server"
                : (r == null ? "unknown" : r.processName);

        handleApplicationCrashInner("crash", r, processName, crashInfo);
    }
private ProcessRecord findAppProcess(IBinder app, 
### RuoYi项目中`app.`文件缺失导致的报错解决方案 在开发过程中,当遇到RuoYi项目的`app.`文件缺失所引发的错误时,可以借鉴类似的解决方案来处理此类问题。以下是针对该问题的具体分析与解决方法: #### 1. **确认文件缺失的原因** 通常情况下,`app.`文件可能因为构建过程中的配置不当或者手动操作失误而丢失。这种现象类似于引用[1]中提到的情况,“未能将文件xxx复制到xxx”,这表明某些必要的资源未被正确打包或部署。 为了进一步排查原因,可以通过以下方式定位问题: - 检查项目的根目录下是否存在对应的`app.js`或其他相关文件。 - 如果这些文件确实不存在,则可能是构建工具(如Webpack、Vite等)未将其纳入最终产物中。 #### 2. **解决方案** ##### 方法一:恢复缺失的文件 如果能够确定哪些具体文件已经丢失,可以直接从备份版本或者其他环境(例如测试服务器)获取并替换回当前工作区下的相应位置[^1]。 此方法适用于知道确切缺少哪个文件的情形;但如果不确定具体的文件名列表,则需借助其他手段辅助判断。 ##### 方法二:调整`.csproj`配置项 对于.NET Core类项目而言,有时会因.csproj定义的内容范围设置不合理而导致部分静态资产遗漏编译输出阶段。此时可参照引用描述里的第二种办法——即编辑该项目关联的XML文档(.csproj),移除那些不必要的<Content Include>标签条目后再尝试重新执行整个流程。不过需要注意的是,在实际操作前最好先做好本地副本以防万一造成不可逆损害。 另外值得注意的一点在于,虽然这种方法理论上可行有效,但由于涉及改动底层元数据结构,因此建议仅限于熟悉内部机制的专业人士采用。 ##### 方法三:优化前端资源配置策略 考虑到现代Web框架普遍支持按需加载以及懒加载技术,我们还可以考虑通过改进现有架构设计思路的方式来规避类似隐患的发生概率。比如引入动态导入语句代替传统的集中式入口管理形式等等[^2]。这样一来不仅有助于提升性能表现水平,同时也降低了维护成本风险系数。 最后附上一段简单的伪代码用于演示如何实现基于模块划分后的独立渲染逻辑控制功能: ```javascript // 动态加载指定页面组件示例 function loadComponent(pageName){ return import(`./pages/${pageName}.js`); } ``` #### 总结 综上所述,面对RuoYi项目里头出现的有关'app.'系列资料遗失状况,可以从多个角度出发寻找对应处置措施。无论是单纯补充原始素材还是深入改造既有体系均各有优劣之处,应当依据实际情况灵活选用最为合适的选项加以应对。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值