GoogleFeedback handles errors in core apps.

Adds support for system properties:
  ro.error.receiver.system.apps - default error report receiver for system apps
  ro.error.receiver.default - fallback error report receiver
This commit is contained in:
Jacek Surazski
2009-06-17 14:33:18 +02:00
parent bd9ae1c254
commit 82a73dfb27

View File

@@ -315,6 +315,12 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
// Memory pages are 4K.
static final int PAGE_SIZE = 4*1024;
// System property defining error report receiver for system apps
static final String SYSTEM_APPS_ERROR_RECEIVER_PROPERTY = "ro.error.receiver.system.apps";
// System property defining default error report receiver
static final String DEFAULT_ERROR_RECEIVER_PROPERTY = "ro.error.receiver.default";
// Corresponding memory levels for above adjustments.
final int EMPTY_APP_MEM;
final int HIDDEN_APP_MEM;
@@ -7950,27 +7956,62 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
private ComponentName getErrorReportReceiver(ProcessRecord app) {
IPackageManager pm = ActivityThread.getPackageManager();
try {
// was an installer package name specified when this app was
// installed?
String installerPackageName = pm.getInstallerPackageName(app.info.packageName);
if (installerPackageName == null) {
return null;
// look for receiver in the installer package
String candidate = pm.getInstallerPackageName(app.info.packageName);
ComponentName result = getErrorReportReceiver(pm, app.info.packageName, candidate);
if (result != null) {
return result;
}
// is there an Activity in this package that handles ACTION_APP_ERROR?
Intent intent = new Intent(Intent.ACTION_APP_ERROR);
intent.setPackage(installerPackageName);
ResolveInfo info = pm.resolveIntent(intent, null, 0);
if (info == null || info.activityInfo == null) {
return null;
// if the error app is on the system image, look for system apps
// error receiver
if ((app.info.flags&ApplicationInfo.FLAG_SYSTEM) != 0) {
candidate = SystemProperties.get(SYSTEM_APPS_ERROR_RECEIVER_PROPERTY);
result = getErrorReportReceiver(pm, app.info.packageName, candidate);
if (result != null) {
return result;
}
}
return new ComponentName(installerPackageName, info.activityInfo.name);
// if there is a default receiver, try that
candidate = SystemProperties.get(DEFAULT_ERROR_RECEIVER_PROPERTY);
return getErrorReportReceiver(pm, app.info.packageName, candidate);
} catch (RemoteException e) {
// will return null and no error report will be delivered
// should not happen
Log.e(TAG, "error talking to PackageManager", e);
return null;
}
return null;
}
/**
* Return activity in receiverPackage that handles ACTION_APP_ERROR.
*
* @param pm PackageManager isntance
* @param errorPackage package which caused the error
* @param receiverPackage candidate package to receive the error
* @return activity component within receiverPackage which handles
* ACTION_APP_ERROR, or null if not found
*/
private ComponentName getErrorReportReceiver(IPackageManager pm, String errorPackage,
String receiverPackage) throws RemoteException {
if (receiverPackage == null || receiverPackage.length() == 0) {
return null;
}
// break the loop if it's the error report receiver package that crashed
if (receiverPackage.equals(errorPackage)) {
return null;
}
Intent intent = new Intent(Intent.ACTION_APP_ERROR);
intent.setPackage(receiverPackage);
ResolveInfo info = pm.resolveIntent(intent, null, 0);
if (info == null || info.activityInfo == null) {
return null;
}
return new ComponentName(receiverPackage, info.activityInfo.name);
}
void makeAppNotRespondingLocked(ProcessRecord app,