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

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 start
    try {
        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 end

    mAppErrors.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;
    }

相关推荐

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

    2024-05-01 10:18:03       37 阅读
  2. Python在生物信息学中应用:捕获所有异常

    2024-05-01 10:18:03       46 阅读
  3. 前端监听页面中某些异常情况

    2024-05-01 10:18:03       54 阅读
  4. Android中Fragment生命周期异常情况分析

    2024-05-01 10:18:03       37 阅读
  5. jvm运行情况预估

    2024-05-01 10:18:03       38 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-01 10:18:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-01 10:18:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-05-01 10:18:03       82 阅读
  4. Python语言-面向对象

    2024-05-01 10:18:03       91 阅读

热门阅读

  1. 在 H5 页面和 uniapp 小程序之间进行数据通信

    2024-05-01 10:18:03       33 阅读
  2. 9、开发基于FemWorkbench的CFD模块

    2024-05-01 10:18:03       28 阅读
  3. Qt:下载和安装

    2024-05-01 10:18:03       29 阅读
  4. 等保课后作业

    2024-05-01 10:18:03       29 阅读
  5. 【蓝桥杯】第十五届蓝桥杯C/C++B组省赛补题

    2024-05-01 10:18:03       33 阅读
  6. Apache Spark 的基本概念和在大数据分析中的应用

    2024-05-01 10:18:03       31 阅读