summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmds/statsd/src/atoms.proto4
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java22
-rw-r--r--services/core/java/com/android/server/am/ProcessRecord.java27
3 files changed, 45 insertions, 8 deletions
diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto
index 707115590598..4a7a2b7cd317 100644
--- a/cmds/statsd/src/atoms.proto
+++ b/cmds/statsd/src/atoms.proto
@@ -3609,6 +3609,8 @@ message AppCrashOccurred {
optional ForegroundState foreground_state = 7;
optional android.server.ErrorSource error_source = 8;
+
+ optional bool is_package_loading = 9;
}
/**
@@ -3670,6 +3672,8 @@ message ANROccurred {
optional android.server.ErrorSource error_source = 7;
optional string package_name = 8;
+
+ optional bool is_package_loading = 9;
}
/**
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 9f2216ddc880..796ea0e5ea20 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -194,6 +194,7 @@ import android.content.pm.ApplicationInfo;
import android.content.pm.ApplicationInfo.HiddenApiEnforcementPolicy;
import android.content.pm.IPackageDataObserver;
import android.content.pm.IPackageManager;
+import android.content.pm.IncrementalStatesInfo;
import android.content.pm.InstrumentationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
@@ -7574,6 +7575,20 @@ public class ActivityManagerService extends IActivityManager.Stub
*/
void handleApplicationCrashInner(String eventType, ProcessRecord r, String processName,
ApplicationErrorReport.CrashInfo crashInfo) {
+ boolean isPackageLoading = false;
+ // Notify package manager service to possibly update package state
+ if (r != null && r.info != null && r.info.packageName != null) {
+ mPackageManagerInt.notifyPackageCrashOrAnr(r.info.packageName);
+ IncrementalStatesInfo incrementalStatesInfo =
+ mPackageManagerInt.getIncrementalStatesInfo(r.info.packageName, r.uid,
+ r.userId);
+ isPackageLoading = incrementalStatesInfo.isLoading();
+ if (isPackageLoading) {
+ // Report in the main log that the package is still loading
+ Slog.e(TAG, "App crashed when package " + r.info.packageName + " is "
+ + ((int) (incrementalStatesInfo.getProgress() * 100)) + "% loaded.");
+ }
+ }
EventLogTags.writeAmCrash(Binder.getCallingPid(),
UserHandle.getUserId(Binder.getCallingUid()), processName,
@@ -7599,7 +7614,8 @@ public class ActivityManagerService extends IActivityManager.Stub
: FrameworkStatsLog.APP_CRASH_OCCURRED__FOREGROUND_STATE__UNKNOWN,
processName.equals("system_server") ? ServerProtoEnums.SYSTEM_SERVER
: (r != null) ? r.getProcessClassEnum()
- : ServerProtoEnums.ERROR_SOURCE_UNKNOWN
+ : ServerProtoEnums.ERROR_SOURCE_UNKNOWN,
+ isPackageLoading
);
final int relaunchReason = r == null ? RELAUNCH_REASON_NONE
@@ -7615,10 +7631,6 @@ public class ActivityManagerService extends IActivityManager.Stub
eventType, r, processName, null, null, null, null, null, null, crashInfo);
mAppErrors.crashApplication(r, crashInfo);
- // Notify package manager service to possibly update package state
- if (r != null && r.info != null && r.info.packageName != null) {
- mPackageManagerInt.notifyPackageCrashOrAnr(r.info.packageName);
- }
}
public void handleApplicationStrictModeViolation(
diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java
index 85c5bdc7b463..1b06dd90df83 100644
--- a/services/core/java/com/android/server/am/ProcessRecord.java
+++ b/services/core/java/com/android/server/am/ProcessRecord.java
@@ -36,6 +36,8 @@ import android.app.IApplicationThread;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.ApplicationInfo;
+import android.content.pm.IncrementalStatesInfo;
+import android.content.pm.PackageManagerInternal;
import android.content.pm.ProcessInfo;
import android.content.pm.ServiceInfo;
import android.content.pm.VersionedPackage;
@@ -1652,6 +1654,19 @@ class ProcessRecord implements WindowProcessListener {
}
}
+ // Check if package is still being loaded
+ boolean isPackageLoading = false;
+ final PackageManagerInternal packageManagerInternal =
+ mService.getPackageManagerInternalLocked();
+ if (aInfo != null && aInfo.packageName != null) {
+ IncrementalStatesInfo incrementalStatesInfo =
+ packageManagerInternal.getIncrementalStatesInfo(
+ aInfo.packageName, uid, userId);
+ if (incrementalStatesInfo != null) {
+ isPackageLoading = incrementalStatesInfo.isLoading();
+ }
+ }
+
// Log the ANR to the main log.
StringBuilder info = new StringBuilder();
info.setLength(0);
@@ -1669,6 +1684,13 @@ class ProcessRecord implements WindowProcessListener {
info.append("Parent: ").append(parentShortComponentName).append("\n");
}
+ if (isPackageLoading) {
+ // Report in the main log that the package is still loading
+ final float loadingProgress = packageManagerInternal.getIncrementalStatesInfo(
+ aInfo.packageName, uid, userId).getProgress();
+ info.append("Package is ").append((int) (loadingProgress * 100)).append("% loaded.\n");
+ }
+
StringBuilder report = new StringBuilder();
report.append(MemoryPressureUtil.currentPsiState());
ProcessCpuTracker processCpuTracker = new ProcessCpuTracker(true);
@@ -1736,7 +1758,7 @@ class ProcessRecord implements WindowProcessListener {
? FrameworkStatsLog.ANROCCURRED__FOREGROUND_STATE__FOREGROUND
: FrameworkStatsLog.ANROCCURRED__FOREGROUND_STATE__BACKGROUND,
getProcessClassEnum(),
- (this.info != null) ? this.info.packageName : "");
+ (this.info != null) ? this.info.packageName : "", isPackageLoading);
final ProcessRecord parentPr = parentProcess != null
? (ProcessRecord) parentProcess.mOwner : null;
mService.addErrorToDropBox("anr", this, processName, activityShortComponentName,
@@ -1771,8 +1793,7 @@ class ProcessRecord implements WindowProcessListener {
// Notify package manager service to possibly update package state
if (aInfo != null && aInfo.packageName != null) {
- mService.getPackageManagerInternalLocked().notifyPackageCrashOrAnr(
- aInfo.packageName);
+ packageManagerInternal.notifyPackageCrashOrAnr(aInfo.packageName);
}
// mUiHandler can be null if the AMS is constructed with injector only. This will only