Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6a6c0cf5 authored by Songchun Fan's avatar Songchun Fan
Browse files

[metrics/incremental] add package loading info in ANR and crash metrics

On ANR or crash, ProcessRecord will obtain the package loading info from
Package Manager and log it as part of the Westworld metrics "ANROccurred".

BUG: 162600251
Test: atest CtsStatsdAtomHostTestCases:android.cts.statsdatom.statsd.UidAtomTests#testANROccurred
Change-Id: I4b527d731c59c6590771f898c26bfeacb16e6ad5
parent 26d72016
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -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;
}

/**
+12 −5
Original line number Diff line number Diff line
@@ -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,15 @@ 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();
        }
        EventLogTags.writeAmCrash(Binder.getCallingPid(),
                UserHandle.getUserId(Binder.getCallingUid()), processName,
@@ -7599,7 +7609,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 +7626,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(
+17 −3
Original line number Diff line number Diff line
@@ -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);
@@ -1736,7 +1751,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 +1786,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