From dfa34cd517dfb794e31598211ed0fc8a419ddc28 Mon Sep 17 00:00:00 2001 From: louis_chang Date: Thu, 31 Jul 2014 10:47:45 +0800 Subject: [PATCH] Avoid system server crash due to package removed Cherry-picked from aosp. Fixes bug 18593178. 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 49ab7c12cdca5..6c2511eef357c 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