问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

app_w073报错

发布网友 发布时间:2023-04-23 17:33

我来回答

4个回答

热心网友 时间:2023-10-09 22:16

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
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
为该进程设置异常处理:
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);
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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);
}
1
2
3
4
5
6
7
1
2
3
4
5
6
7
private ProcessRecord findAppProcess(IBinder app, String reason) {
if (app == null) {
return null;
}

synchronized (this) {
final int NP = mProcessNames.getMap().size();
for (int ip=0; ip<NP; ip++) {
SparseArray<ProcessRecord> apps = mProcessNames.getMap().valueAt(ip);
final int NA = apps.size();
for (int ia=0; ia<NA; ia++) {
ProcessRecord p = apps.valueAt(ia);
if (p.thread != null && p.thread.asBinder() == app) {
return p;
}
}
}

return null;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void handleApplicationCrashInner(String eventType, ProcessRecord r, String processName,ApplicationErrorReport.CrashInfo crashInfo) {
EventLog.writeEvent(EventLogTags.AM_CRASH, Binder.getCallingPid(),
UserHandle.getUserId(Binder.getCallingUid()), processName,
r == null ? -1 : r.info.flags,
crashInfo.exceptionClassName,
crashInfo.exceptionMessage,
crashInfo.throwFileName,
crashInfo.throwLineNumber);

addErrorToDropBox(eventType, r, processName, null, null, null, null, null, crashInfo);

mAppErrors.crashApplication(r, crashInfo);
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
1
2
3
4
5
6
7
8
9
10
11
12
13
14
AppErrors中处理流程:

void crashApplication(ProcessRecord r, ApplicationErrorReport.CrashInfo crashInfo) {
final long origId = Binder.clearCallingIdentity();
try {
crashApplicationInner(r, crashInfo);
} finally {
Binder.restoreCallingIdentity(origId);
}
}
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
void crashApplicationInner(ProcessRecord r, ApplicationErrorReport.CrashInfo crashInfo) {
........
AppErrorResult result = new AppErrorResult();
TaskRecord task;
synchronized (mService) {
//如果该进程设置了IActivityController则直接返回,不弹出报错提示窗口
if (handleAppCrashInActivityController(r, crashInfo, shortMsg, longMsg, stackTrace,
timeMillis)) {
return;
}

//有正在运行的instrumentation,也立即退出,不弹出报错提示窗口
if (r != null && r.instrumentationClass != null) {
return;
}
......
AppErrorDialog.Data data = new AppErrorDialog.Data();
data.result = result;
data.proc = r;

// 进程记录为空或者在一分钟内已经crash了两次了,就直接退出,不提示报错弹窗
// quit right away without showing a crash dialog.
if (r == null || !makeAppCrashingLocked(r, shortMsg, longMsg, stackTrace, data)) {
return;
}
//像AMS发送SHOW_ERROR_UI_MSG消息弹出报错提示框,提示框弹出条件为:已经弹出了的不再弹,是后台进程并且当前系统设置不显示后台进程报错弹框的不弹。
final Message msg = Message.obtain();
msg.what = ActivityManagerService.SHOW_ERROR_UI_MSG;

task = data.task;
msg.obj = data;
mService.mUiHandler.sendMessage(msg);
}
//根据弹窗后的点击或者未弹窗但是设置的状态获取结果,结果有如下几种:FORCE_QUIT、
//FORCE_QUIT_AND_REPORT、RESTART、MUTE、TIMEOUT、CANCEL 7种
int res = result.get();

Intent appErrorIntent = null;
MetricsLogger.action(mContext, MetricsProto.MetricsEvent.ACTION_APP_CRASH, res);
if (res == AppErrorDialog.TIMEOUT || res == AppErrorDialog.CANCEL) {
res = AppErrorDialog.FORCE_QUIT;
}
synchronized (mService) {
//返回结果为MUTE,则停止报告本次crash
if (res == AppErrorDialog.MUTE) {
stopReportingCrashesLocked(r);
}
//返回为RESTART,则清除现有进程信息processRecord并且重新拉起该进程
if (res == AppErrorDialog.RESTART) {
mService.removeProcessLocked(r, false, true, "crash");
if (task != null) {
try {
mService.startActivityFromRecents(task.taskId,
ActivityOptions.makeBasic().toBundle());
} catch (IllegalArgumentException e) {
// Hmm, that didn't work, app might have crashed before creating a
// recents entry. Let's see if we have a safe-to-restart intent.
final Set<String> cats = task.intent.getCategories();
if (cats != null && cats.contains(Intent.CATEGORY_LAUNCHER)) {
mService.startActivityInPackage(task.mCallingUid,
task.mCallingPackage, task.intent,
null, null, null, 0, 0,
ActivityOptions.makeBasic().toBundle(),
task.userId, null, null);
}
}
}
}
//FORCE_QUIT,则从任务栈中移除,并且移除进程信息,移除焦点信息
if (res == AppErrorDialog.FORCE_QUIT) {
long orig = Binder.clearCallingIdentity();
try {
// Kill it with fire!
mService.mStackSupervisor.handleAppCrashLocked(r);
if (!r.persistent) {
mService.removeProcessLocked(r, false, false, "crash");
mService.mStackSupervisor.resumeFocusedStackTopActivityLocked();
}
} finally {
Binder.restoreCallingIdentity(orig);
}
}
//FORCE_QUIT_AND_REPORT则生成一action为ACTION_APP_ERROR的intent,并且拉起该activity,这也就是一些bugreport应用的主要数据来源,注册ACTION_APP_ERROR的action后,系统在每次crash并且用户选择退出并且回传错误报告的时候,就会主动拉起该应用的页面。
if (res == AppErrorDialog.FORCE_QUIT_AND_REPORT) {
appErrorIntent = createAppErrorIntentLocked(r, timeMillis, crashInfo);
}
if (r != null && !r.isolated && res != AppErrorDialog.RESTART) {
// XXX Can't keep track of crash time for isolated processes,
// since they don't have a persistent identity.
mProcessCrashTimes.put(r.info.processName, r.uid,
SystemClock.uptimeMillis());
}
}

if (appErrorIntent != null) {
try {
mContext.startActivityAsUser(appErrorIntent, new UserHandle(r.userId));
} catch (ActivityNotFoundException e) {
Slog.w(TAG, "bug report receiver dissappeared", e);
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
makeAppCrashingLocked:
返回true则继续往下走进入弹窗显示,返回false则不再显示弹窗

private boolean makeAppCrashingLocked(ProcessRecord app,
String shortMsg, String longMsg, String stackTrace, AppErrorDialog.Data data) {
app.crashing = true;
//生成错误报告
app.crashingReport = generateProcessError(app,
ActivityManager.ProcessErrorStateInfo.CRASHED, null, shortMsg, longMsg, stackTrace);
//移除该应用所有广播
startAppProblemLocked(app);
//停止屏幕冻结
app.stopFreezingAllLocked();
//一分钟内报错两次如果允许显示后台进程报错则返回false,否则都是返回true,
如果不是persistent则移除杀掉该进程移除进程信息,处理app die,移除任务栈中的信息
如果是persistent,则仅仅移除当前聚焦的栈顶信息。
return handleAppCrashLocked(app, "force-crash" /*reason*/, shortMsg, longMsg, stackTrace,
data);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
handleShowAppErrorUi
弹出报错提示窗
已经显示着报错窗口的不再弹,不显示后台进程报错的的时候后台进程报错不弹出

void handleShowAppErrorUi(Message msg) {
AppErrorDialog.Data data = (AppErrorDialog.Data) msg.obj;
boolean showBackground = Settings.Secure.getInt(mContext.getContentResolver(),
Settings.Secure.ANR_SHOW_BACKGROUND, 0) != 0;
synchronized (mService) {
ProcessRecord proc = data.proc;
AppErrorResult res = data.result;
if (proc != null && proc.crashDialog != null) {
Slog.e(TAG, "App already has crash dialog: " + proc);
if (res != null) {
res.set(AppErrorDialog.ALREADY_SHOWING);
}
return;
}
boolean isBackground = (UserHandle.getAppId(proc.uid)
>= Process.FIRST_APPLICATION_UID
&& proc.pid != MY_PID);
for (int userId : mService.mUserController.getCurrentProfileIdsLocked()) {
isBackground &= (proc.userId != userId);
}
if (isBackground && !showBackground) {
Slog.w(TAG, "Skipping crash dialog of " + proc + ": background");
if (res != null) {
res.set(AppErrorDialog.BACKGROUND_USER);
}
return;
}
final boolean crashSilenced = mAppsNotReportingCrashes != null &&
mAppsNotReportingCrashes.contains(proc.info.packageName);
if ((mService.canShowErrorDialogs() || showBackground) && !crashSilenced) {
//这里将参数中的data用到了新建的apperrdialog中,并且赋给了processrecord中的crashDialog变量,
这里也就跟上面获取弹窗点击结果进行了关联
proc.crashDialog = new AppErrorDialog(mContext, mService, data);
} else {
// The device is asleep, so just pretend that the user
// saw a crash dialog and hit "force quit".
if (res != null) {
res.set(AppErrorDialog.CANT_SHOW);
}
}
}
// If we've created a crash dialog, show it without the lock held
if(data.proc.crashDialog != null) {
data.proc.crashDialog.show();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
removeProcessLocked
该方法在整个弹窗前和弹窗后的处理流程中多次调用到,主要执行移除进程记(removeProcessNameLocked),再次杀进程(kill)确保证进程被杀后处理app死亡后的处理(handleAppDiedLocked)

boolean removeProcessLocked(ProcessRecord app,
boolean callerWillRestart, boolean allowRestart, String reason) {
final String name = app.processName;
final int uid = app.uid;
if (DEBUG_PROCESSES) Slog.d(TAG_PROCESSES,
"Force removing proc " + app.toShortString() + " (" + name + "/" + uid + ")");

ProcessRecord old = mProcessNames.get(name, uid);
if (old != app) {
// This process is no longer active, so nothing to do.
Slog.w(TAG, "Ignoring remove of inactive process: " + app);
return false;
}
removeProcessNameLocked(name, uid);
if (mHeavyWeightProcess == app) {
mHandler.sendMessage(mHandler.obtainMessage(CANCEL_HEAVY_NOTIFICATION_MSG,
mHeavyWeightProcess.userId, 0));
mHeavyWeightProcess = null;
}
boolean needRestart = false;
if (app.pid > 0 && app.pid != MY_PID) {
int pid = app.pid;
synchronized (mPidsSelfLocked) {
mPidsSelfLocked.remove(pid);
mHandler.removeMessages(PROC_START_TIMEOUT_MSG, app);
}
mBatteryStatsService.noteProcessFinish(app.processName, app.info.uid);
if (app.isolated) {
mBatteryStatsService.removeIsolatedUid(app.uid, app.info.uid);
}
boolean willRestart = false;
if (app.persistent && !app.isolated) {
if (!callerWillRestart) {
willRestart = true;
} else {
needRestart = true;
}
}
app.kill(reason, true);
handleAppDiedLocked(app, willRestart, allowRestart);
if (willRestart) {
removeLruProcessLocked(app);
addAppLocked(app.info, false, null /* ABI override */);
}
} else {
mRemovedProcesses.add(app);
}

return needRestart;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

热心网友 时间:2023-10-09 22:16

app_w073 是一个应用程序,报错的原因可能是程序出现了 bug,或者系统出现了故障。要解决这个报错,首先需要检查程序的代码,查看是否有错误的代码引起的报错;如果程序代码没有问题,则可以尝试更新系统,检查系统是否有损坏的文件或者缺失的文件,并修复这些文件;如果以上两种方法都没有解决问题,则可以尝试重新安装应用程序,或者联系应用程序的开发者,获取更多帮助。

热心网友 时间:2023-10-09 22:17

这个错误消息是由Google Play Store发出的,表明您尝试安装的应用程序无法正常工作。可能的原因有:

1. 应用程序不兼容您的设备。
2. 应用程序版本过旧或者不兼容当前Android版本。
3. 您的设备上存在一些问题,导致应用程序无法正常工作。

要解决这个问题,建议您尝试以下步骤:

1. 检查您的设备是否具备安装该应用程序所需的最低要求。
2. 更新Android版本到最新版本。
3. 重新启动手机并重新尝试安装该应用程序。

热心网友 时间:2023-10-09 22:17

app_w073没有详细的报错信息,因此无法确定错误的原因。如果遇到这种情况,建议检查应用程序的日志文件,以便查找出错原因。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
我的世界手游 我的世界手机上的基岩版登录后为什么不能联机? 我的世界为什么联机进不去 联机我的世界方法 聚四氟乙烯生料带价格是多少 如何选购聚四氟乙烯带 聚四氟乙烯多少钱 路由器的用户名和密码天翼宽带zxhnf420 我想用无线上网,电信送的猫是zxhn f420,我买了个路由器是WNR500的型号... 我买的保险十年的交完了退保能退多少钱 平安你险买一年三千五买了一年想退出退回多少钱? 我买的是人寿保险交了一年想退保能退多少钱? 魔兽冰封王座的暗夜怎样灭一个简单的? 下雨时你的温柔精彩片段在第几集 日系英文名请各位帮帮忙, (急) 深圳市金辉金属材料有限公司怎么样? 金辉刀剪股份有限公司好不好 佛山市金辉铭不锈钢有限公司怎么样? 单反相机怎么用几个步骤让您轻松玩转单反相机 fkd-a1001不锈钢电解抛光液是否环保 造舌的读音造舌的读音是什么 梦见马在争斗的预兆 毛孔粗大怎么改善?缩小毛孔的产品求推荐! 螨婷香皂跟螨婷洗面奶哪个去脸部螨虫效果更好?是要不伤皮肤的 福特福克斯1.0T三缸表现如何?我们拿它与四缸速腾做了个测试 拼多多网店怎么做一件代发 郭姓网名时尚 小寒的诗句 优美 关于小雪唯美简短的句子和古诗词有哪些 小寒节气的优美诗词 美甲师上半年工作总结范文参考 深国检和国检的区别 机构的拼音狐机构的拼音是什么 四川省2023年专升本政策 请问四川专升本都考什么? 四川2024专升本报名条件 网恋感动的哭的情话,句句暖人心 网恋中暖到哭的话 网恋情话最暖心短句 网恋情话最暖心短句 梦见别人被追债的预兆 梦见朋友欠钱被追债的预兆 梦见别人追债的预兆 笙舞的诗句笙舞的诗句是什么 行走苗寨·笙舞现代诗 笙舞的词语笙舞的词语是什么 潍坊市的读音潍坊市的读音是什么 坊子的造句坊子的造句是什么 RNA与DNA的区别 加拿大学生签证需要哪些材料 斋麋的拼音狐 斋麋的拼音是什么 苹果官网订购ipadair官网发货前通知或发货后会通知你发货了吗 在别人的支付宝上买苹果手机订单发货时会不会通知付款账户 iphone14pro发货会提前吗