RK3399 Android7.1系统APP有问题时弹出 没有响应 关系应用 等待

简介: RK3399 Android7.1系统APP有问题时弹出 没有响应 关系应用 等待


一、问题描述

android系统运行不正常的时候会弹出以下框框,需要手动选择。如果想取消弹框,直接关机运行不正常的应用,后台我们自己做守护程序。方法如下

本质是ANR对话框 是类class AppNotRespondingDialog在处理

[点击并拖拽以移动]

二、问题定位

点位弹框类在以下路径

base/services/core/java/com/android/server/am/AppNotRespondingDialog.java +110

关闭应用方法接口如下:

mService.killAppAtUsersRequest(proc, null);

怎么找到的如下红色字体:

130 @Override

131 public void onClick(View v) {

132 switch (v.getId()) {

133 case com.android.internal.R.id.aerr_report:

134 mHandler.obtainMessage(WAIT_AND_REPORT).sendToTarget();

135 break;

136 case com.android.internal.R.id.aerr_close:

137 mHandler.obtainMessage(FORCE_CLOSE).sendToTarget();

138 break;

139 case com.android.internal.R.id.aerr_wait:

140 mHandler.obtainMessage(WAIT).sendToTarget();

141 break;

142 default:

143 break;

144 }

145 }

private final Handler mHandler = new Handler() {

148 public void handleMessage(Message msg) {

149 Intent appErrorIntent = null;

150

151 MetricsLogger.action(getContext(), MetricsProto.MetricsEvent.ACTION_APP_ANR,

152 msg.what);

153

154 switch (msg.what) {

155 case FORCE_CLOSE:

156 // Kill the application.

157 mService.killAppAtUsersRequest(mProc, AppNotRespondingDialog.this);

158 break;

159 case WAIT_AND_REPORT:

160 case WAIT:

161 // Continue waiting for the application.

162 synchronized (mService) {

163 ProcessRecord app = mProc;

164

165 if (msg.what == WAIT_AND_REPORT) {

166 appErrorIntent = mService.mAppErrors.createAppErrorIntentLocked(app,

167 System.currentTimeMillis(), null);

168 }

169

170 app.notResponding = false;

171 app.notRespondingReport = null;

172 if (app.anrDialog == AppNotRespondingDialog.this) {

173 app.anrDialog = null;

174 }

175 mService.mServices.scheduleServiceTimeoutLocked(app);

176 }

177 break;

178 }

三、问题解决

搜索AppNotRespondingDialog ,发现在以下路径调用

base/services/core/java/com/android/server/am/AppErrors.java +955

分析代码:

1.不让框框弹出,直接kill应用。屏蔽红色代码,添加蓝色代码即可

950 void handleShowAnrUi(Message msg) {

951 Dialog d = null;

952 synchronized (mService) {

953 HashMap<String, Object> data = (HashMap<String, Object>) msg.obj;

954 ProcessRecord proc = (ProcessRecord)data.get("app");

955 if (proc != null && proc.anrDialog != null) {

956 Slog.e(TAG, "App already has anr dialog: " + proc);

957 MetricsLogger.action(mContext, MetricsProto.MetricsEvent.ACTION_APP_ANR,

958 AppNotRespondingDialog.ALREADY_SHOWING);

959 return;

960 }

961

962 Intent intent = new Intent("android.intent.action.ANR");

963 if (!mService.mProcessesReady) {

964 intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY

965 | Intent.FLAG_RECEIVER_FOREGROUND);

966 }

967 mService.broadcastIntentLocked(null, null, intent,

968 null, null, 0, null, null, null, AppOpsManager.OP_NONE,

969 null, false, false, MY_PID, Process.SYSTEM_UID, 0 / TODO: Verify /);

970

971 boolean showBackground = Settings.Secure.getInt(mContext.getContentResolver(),

972 Settings.Secure.ANR_SHOW_BACKGROUND, 0) != 0;

973 if (mService.canShowErrorDialogs() || showBackground) {

//我们修改的内容就在这里

974 mService.killAppAtUsersRequest(proc, null);

975 // d = new AppNotRespondingDialog(mService,

976 // mContext, proc, (ActivityRecord)data.get("activity"),

977 // msg.arg1 != 0);

978 //proc.anrDialog = d;

979 } else {

980 MetricsLogger.action(mContext, MetricsProto.MetricsEvent.ACTION_APP_ANR,

981 AppNotRespondingDialog.CANT_SHOW);

982 // Just kill the app if there is no dialog to be shown.

983 mService.killAppAtUsersRequest(proc, null);

984 }

985 }

986 // If we've created a crash dialog, show it without the lock held

987 if (d != null) { //

988 //d.closeAnrApp();

989 d.show();

990 }

991 }

相关文章
|
小程序
uniapp,小程序或APP的底部弹出的滚动选择组件picker,三级联动,选择地址。
uniapp,小程序或APP的底部弹出的滚动选择组件picker,三级联动,选择地址。
974 0
uniapp,小程序或APP的底部弹出的滚动选择组件picker,三级联动,选择地址。
|
Android开发
Android Magnet:桌面删除APP自动弹出垃圾桶接受图标删除动作
 Android Magnet:桌面删除APP自动弹出垃圾桶接受图标删除动作 在Android系统上,当用户长按桌面的图标后,会自动从底部或者顶部弹出一个垃圾或者叉子的删除图标,用户拖曳欲删除的图标至垃圾箱后,则在桌面删除该APP。
1046 0
|
2月前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
2月前
|
缓存 前端开发 Android开发
安卓开发中的自定义视图:从零到英雄
【10月更文挑战第42天】 在安卓的世界里,自定义视图是一块画布,让开发者能够绘制出独一无二的界面体验。本文将带你走进自定义视图的大门,通过深入浅出的方式,让你从零基础到能够独立设计并实现复杂的自定义组件。我们将探索自定义视图的核心概念、实现步骤,以及如何优化你的视图以提高性能和兼容性。准备好了吗?让我们开始这段创造性的旅程吧!
36 1
|
1月前
|
搜索推荐 前端开发 API
探索安卓开发中的自定义视图:打造个性化用户界面
在安卓应用开发的广阔天地中,自定义视图是一块神奇的画布,让开发者能够突破标准控件的限制,绘制出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战技巧,逐步揭示如何在安卓平台上创建和运用自定义视图来提升用户体验。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开新的视野,让你的应用在众多同质化产品中脱颖而出。
57 19
|
2月前
|
IDE Java 开发工具
移动应用与系统:探索Android开发之旅
在这篇文章中,我们将深入探讨Android开发的各个方面,从基础知识到高级技术。我们将通过代码示例和案例分析,帮助读者更好地理解和掌握Android开发。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和技巧。让我们一起开启Android开发的旅程吧!
|
1月前
|
JSON Java API
探索安卓开发:打造你的首个天气应用
在这篇技术指南中,我们将一起潜入安卓开发的海洋,学习如何从零开始构建一个简单的天气应用。通过这个实践项目,你将掌握安卓开发的核心概念、界面设计、网络编程以及数据解析等技能。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供一个清晰的路线图和实用的代码示例,帮助你在安卓开发的道路上迈出坚实的一步。让我们一起开始这段旅程,打造属于你自己的第一个安卓应用吧!
64 14
|
1月前
|
Java Linux 数据库
探索安卓开发:打造你的第一款应用
在数字时代的浪潮中,每个人都有机会成为创意的实现者。本文将带你走进安卓开发的奇妙世界,通过浅显易懂的语言和实际代码示例,引导你从零开始构建自己的第一款安卓应用。无论你是编程新手还是希望拓展技术的开发者,这篇文章都将为你打开一扇门,让你的创意和技术一起飞扬。