From bd4a9a0cd890e4ff3907e78dd5613f725f78e078 Mon Sep 17 00:00:00 2001 From: louis_chang Date: Thu, 31 Jul 2014 10:47:45 +0800 Subject: [PATCH] [ActivityManager] Avoid system server crash due to package removed Symptom: When application is not responding, an ANR dialog will shown. In certain timing, user uninstall the application when the ANR occurs, but before ANR dialog shown. The system server will crash when looking up the errorReportReceiver because the package is removed. Here shows how the exception occurs. java.lang.IllegalArgumentException: Unknown package: app.package.name at com.android.server.pm.Settings.getInstallerPackageNameLPr at com.android.server.pm.PackageManagerService.getInstallerPackageName at android.app.ApplicationPackageManager.getInstallerPackageName at android.app.ApplicationErrorReport.getErrorReportReceiver at com.android.server.am.ActivityManagerService.startAppProblemLocked at com.android.server.am.ActivityManagerService.makeAppNotRespondingLocked at com.android.server.am.ActivityManagerService.appNotResponding Change-Id: Iced4287bd44dc25b1db2c1e3a583892eb6c041a2 --- .../android/app/ApplicationErrorReport.java | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/core/java/android/app/ApplicationErrorReport.java b/core/java/android/app/ApplicationErrorReport.java index c117486104941..2dbeafabbdbdc 100644 --- a/core/java/android/app/ApplicationErrorReport.java +++ b/core/java/android/app/ApplicationErrorReport.java @@ -168,10 +168,20 @@ public class ApplicationErrorReport implements Parcelable { PackageManager pm = context.getPackageManager(); // look for receiver in the installer package - String candidate = pm.getInstallerPackageName(packageName); - ComponentName result = getErrorReportReceiver(pm, packageName, candidate); - if (result != null) { - return result; + String candidate = null; + ComponentName result = null; + + try { + candidate = pm.getInstallerPackageName(packageName); + } catch (IllegalArgumentException e) { + // the package could already removed + } + + if (candidate != null) { + result = getErrorReportReceiver(pm, packageName, candidate); + if (result != null) { + return result; + } } // if the error app is on the system image, look for system apps