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