Android Framework 获取所有应用的运行异常情况

news/2024/5/8 2:54:40

Mdm需求,获取所有应用运行异常情况

  • 实现

Android_source/frameworks/base/core/java/android/app/IActivityManager.aidl

// add getAppRuntimeExceptionInfo
List getAppRuntimeExceptionInfo();

Android_source/frameworks/base/service/core/java/com/android/server/am/ActivityManagerService.java

List<String[]> listErrors = new ArrayList();public List getAppRuntimeExceptionInfo() throws RemoteException{return listErrors;
}void handleApplicationCrashInner(String eventType, ProcessRecord r, String processName, ApplicationErrorReport.CrashInfo crashInfo){...// add getAppRuntimeExceptionInfo starttry {synchronized (this) {if (listErrors.size() == 0) {String[] firstError = new String[2];firstError[0] = packageName;firstError[1] = String.valueOf(1);listErrors.add(firstError);} else {List<String> allErrors = new ArrayList<>();for (int i = 0; i < listErrors.size(); i++) {String[] arrayErrors = listErrors.get(i);List<String> listStrings = Arrays.asList(arrayErrors);allErrors.addAll(listStrings);}for (int i = 0; i < listErrors.size(); i++) {String[] arrayErrors = listErrors.get(i);boolean isContains = allErrors.contains(packageName);if (isContains) {if (packageName.equals(arrayErrors[0])) {int errorCount = Integer.parseInt(arrayErrors[1]);arrayErrors[1] = String.valueOf(errorCount + 1);}} else {String[] newErrors = new String[2];newErrors[0] = packageName;newErrors[1] = String.valueOf(1);listErrors.add(newErrors);break;}}}} catch (Throwable t) {Log.e(TAG, "appExceptionInfo  listErrors ");}// add getAppRuntimeExceptionInfo endmAppErrors.crashApplication(r, crashInfo);}
  • 调用
    /***所有应用运行异常情况** @param* @return List<String []>*                     String[0]:终端应用包名*                     String[1]:终端应用发生异常次数*/public List<String[]> getAppRuntimeExceptionInfo() {LogUtils.v(TAG, "getAppRuntimeExceptionInfo() ");final long ident = Binder.clearCallingIdentity();List<String[]> listResult = new ArrayList();try {listResult= ActivityManager.getService().getAppRuntimeExceptionInfo();LogUtils.v(TAG, "getAppRuntimeExceptionInfo result: " + listResult.toString());} catch (Exception e) {e.printStackTrace();}Binder.restoreCallingIdentity(ident);return listResult;}

http://www.mrgr.cn/p/85740482

相关文章

OpenHarmony音视频—opus

简介 Opus是一种用于在互联网上进行交互式语音和音频传输的编解码器。它可以从低比特率窄带语音扩展到非常高的高品质立体声音乐。 下载安装 直接在OpenHarmony-SIG仓中搜索opus并下载。 使用说明 以OpenHarmony 3.1 Beta的rk3568版本为例 将下载的opus库代码存在以下路径&a…

猿人学内部练习平台6~10题

第六题:session保持检测 使用session请求即可:session = requests.Session() 第七题:请求规律检测1-post 根据请求接口找规律,在每一页请求前请求一次https://www.python-spider.com/cityjson即可 requests.post(https://www.python-spider.com/cityjson, verify=False) re…

Sound Siphon for Mac:音频处理与录制工具

Sound Siphon for Mac是一款专为Mac用户设计的音频处理与录制工具&#xff0c;以其出色的性能、丰富的功能和简便的操作而备受赞誉。 Sound Siphon for Mac v3.6.8激活版下载 该软件支持多种音频格式&#xff0c;包括MP3、WAV、AAC、FLAC等&#xff0c;用户可以轻松导入各种音频…

qt 使用hid开源库 ,搜索所有的hid设备

效果: cmakeLists.txt :cmake_minimum_required(VERSION 3.5)project(TF_Hid_UseANDTest VERSION 0.1 LANGUAGES CXX)set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON)set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON)file(GLOB include…

在PostgreSQL中如何创建和使用自定义函数,包括内置语言(如PL/pgSQL)和外部语言(如Python、C等)?

文章目录 一、使用内置语言 PL/pgSQL 创建自定义函数示例代码使用方法 二、使用外部语言 Python 创建自定义函数安装 PL/Python 扩展示例代码使用方法 三、使用外部语言 C 创建自定义函数编写 C 代码编译为共享库在 PostgreSQL 中注册函数注意事项 总结 PostgreSQL 是一个强大的…

上班族必备的便签备忘录app 好用的便签备忘录软件

上班族每天都需要处理大量的工作事项&#xff0c;从策划方案到客户沟通&#xff0c;每一个环节都至关重要。然而&#xff0c;仅仅依靠大脑记忆&#xff0c;很容易遗漏某些细节&#xff0c;甚至可能错过重要的截止日期。为了避免这种情况&#xff0c;许多人选择使用一款优秀的便…

探索 DTD 在 XML 中的作用及解析:深入理解文档类型定义

DTD 是文档类型定义(Document Type Definition)的缩写。DTD 定义了 XML 文档的结构以及合法的元素和属性。为什么使用 DTD 通过使用 DTD,独立的团体可以就数据交换的标准 DTD 达成一致。 应用程序可以使用 DTD 来验证 XML 数据的有效性。 内部 DTD 声明 如果 DTD 在 XML 文件…

ubuntu16安装docker及docker-compose

ubuntu16安装docker及docker-compose 一、环境前期准备 检查系统版本 系统版本最好在16及以上&#xff0c;可以确保系统的兼容性 lsb_release -a查看内核版本及系统架构 建议用 x86_64的系统架构&#xff0c;安装是比较顺利的 uname -a32的系统不支持docker&#xff0c;安…

鸿蒙HarmonyOS实战-ArkUI事件(键鼠事件)

🚀前言 键鼠事件是指在计算机操作中,用户通过键盘和鼠标来与计算机进行交互的行为。常见的键鼠事件包括按下键盘上的键、移动鼠标、点击鼠标左键或右键等等。键鼠事件可以触发许多不同的操作,比如在文本编辑器中输入文字、在游戏中移动角色、在网页上点击链接等等。计算机操…

linux下 Mysql8.0 离线安装

环境&#xff1a;centos7.9 MysqlL8.0.36安装包 链接&#xff1a;https://pan.baidu.com/s/1bKwHr05z8Ye82dT9tntdUA 提取码&#xff1a;3a5z 参考Centos安装MYSQL8(离线可用) 文章目录 1、解压安装2、配置启动2.1 修改配置文件2.2 mysql 启动 3、mysql 测试 1、解压安装 #…

uniapp-css:拼图(不规则图片拼插)、碎片

拼图案例样式 高斯模糊的地方可以对应的使用fliter属性和opacity来调节样式。 其余碎片和图片对应: 这段代码实现了一个拼图效果的Vue组件。以下是对代码的详细解析: 模板部分: 在模板中使用v-for指令遍历imgs数组中的每个图片对象,为每个图片创建一个元素。 使用:cla…

基于DEAP数据集的四种机器学习方法的情绪分类

在机器学习领域&#xff0c;KNN&#xff08;K-Nearest Neighbors&#xff09;、SVM&#xff08;Support Vector Machine&#xff09;、决策树&#xff08;Decision Tree&#xff09;和随机森林&#xff08;Random Forest&#xff09;是常见且广泛应用的算法。 介绍 1. KNN&am…

程序员学CFA——数量分析方法(四)

数量分析方法&#xff08;四&#xff09; 常见概率分布基本概念离散型随机变量与连续型随机变量离散型随机变量连续型随机变量 分布函数概率密度函数&#xff08;PDF&#xff09;累积分布函数&#xff08;CDF&#xff09; 离散分布离散均匀分布伯努利分布二项分布定义股价二叉树…

OpenWrt软件包各主题样式预览

Openwrt软件包主题luci-theme-alpha登录界面: 主界面:luci-theme-Argon 登录界面:主界面: luci-theme-Bootstrap 登录界面:主界面: luci-theme-Bootstrap_mmdvm 登录界面:主界面: luci-theme-Design 登录界面: 主界面: luci-theme-Edge 登录界面: 主界面: lu…

BM25检索算法 python

1.简介 BM25&#xff08;Best Matching 25&#xff09;是一种经典的信息检索算法&#xff0c;是基于 TF-IDF算法的改进版本&#xff0c;旨在解决、TF-IDF算法的一些不足之处。其被广泛应用于信息检索领域的排名函数&#xff0c;用于估计文档D与用户查询Q之间的相关性。它是一种…

vue箭头函数、js-for循环、事件修饰符、摁键事件和修饰符、表单控制、完整购物车版本

【箭头函数】1 <!DOCTYPE html>2 <html lang="en">3 <head>4 <meta charset="UTF-8">5 <title>Title</title>6 <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></scrip…

一道关于顺序栈的笔试题:判断一个包含(和)的字符串是否有效

若有一个包括 ( 和 ) 的字符串string ,判断字符串是否有效。要求设计算法实现检查字符串是否有效,有效的字符串需满足以下条件: A.左括号必须用相同类型的右括号闭合。 B.左括号必须以正确的顺序闭合。 C.每个右括号都有一个对应的相同类型的左括号。 思路图:参考代码: b…

Spring Boot 中Mybatis使用Like的使用方式和注意点

说明 模糊查询在项目中还是经常使用的&#xff0c;本文就简单整理Mybatis中使用Like进行模糊查询的几种写法以及一些常见的问题。 使用Springboot简单配置一下Mybatis&#xff0c;然后进行说明。Springboot集成Mybatis这里就不做介绍了&#xff0c;这里我们主要介绍一下在mybat…

HarmonyOS 鸿蒙隔离层设计

在软件开发中,底层库的更换或升级是常见的需求,这可能由性能提升、新功能需求或安全性考虑等因素驱动。为了降低迁移成本,良好的设计模式至关重要。在版本迭代过程中,网络请求库可能会经历从A到B再到C的演进。为了实现业务层的无感切换,需要在各个请求库和业务代码之间封装…

利用两个栈实现队列的入队出队以及判断队列是否为空

利用两个栈实现队列的入队出队以及判断队列是否为空bool enQueue(SeqStack_t *S1, SeqStack_t *S2, int x) {DataType_t temp = x;// 判断S1是否满if (SeqStack_IsFull(S1)){// 判断S2是空if (SeqStack_IsEmpty(S2))![image](uploading...){while (!SeqStack_IsEmpty(S1)){temp…