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

Commit 6a81fa16 authored by Sanjana Sunil's avatar Sanjana Sunil
Browse files

Log dependency installer fields in installation atom

Add support for the following metric values:
* Whether depencdency installer is enabled for the current session.
* How many missing dependencies there were before the dependency
  installer service was called.

Additionally, log metrics whenever the dependency installer fails to
fetch metrics for whatever reason.

Bug: 372861843
Test: Manual steps - run statsd as below and then run
PackageManagerShellCommandInstallTest and observe output
Test: m statsd_testdrive && statsd_testdrive -e 524
Flag: android.content.pm.sdk_dependency_installer

Change-Id: I6dc0f75b8b957c3552578ab90f1f41f221a6954c
parent e6497d00
Loading
Loading
Loading
Loading
+13 −10
Original line number Diff line number Diff line
@@ -78,24 +78,22 @@ public class InstallDependencyHelper {
        mPackageInstallerService = packageInstallerService;
    }

    void resolveLibraryDependenciesIfNeeded(PackageLite pkg, Computer snapshot, int userId,
            Handler handler, OutcomeReceiver<Void, PackageManagerException> origCallback) {
    void resolveLibraryDependenciesIfNeeded(List<SharedLibraryInfo> missingLibraries,
            PackageLite pkg, Computer snapshot, int userId, Handler handler,
            OutcomeReceiver<Void, PackageManagerException> origCallback) {
        CallOnceProxy callback = new CallOnceProxy(handler, origCallback);
        try {
            resolveLibraryDependenciesIfNeededInternal(pkg, snapshot, userId, handler, callback);
        } catch (PackageManagerException e) {
            callback.onError(e);
            resolveLibraryDependenciesIfNeededInternal(
                    missingLibraries, pkg, snapshot, userId, handler, callback);
        } catch (Exception e) {
            onError(callback, e.getMessage());
        }
    }


    private void resolveLibraryDependenciesIfNeededInternal(PackageLite pkg, Computer snapshot,
            int userId, Handler handler, CallOnceProxy callback) throws PackageManagerException {
        final List<SharedLibraryInfo> missing =
                mSharedLibraries.collectMissingSharedLibraryInfos(pkg);

    private void resolveLibraryDependenciesIfNeededInternal(List<SharedLibraryInfo> missing,
            PackageLite pkg, Computer snapshot, int userId, Handler handler,
            CallOnceProxy callback) {
        if (missing.isEmpty()) {
            if (DEBUG) {
                Slog.d(TAG, "No missing dependency for " + pkg.getPackageName());
@@ -129,6 +127,11 @@ public class InstallDependencyHelper {
        }
    }

    List<SharedLibraryInfo> getMissingSharedLibraries(PackageLite pkg)
            throws PackageManagerException {
        return mSharedLibraries.collectMissingSharedLibraryInfos(pkg);
    }

    void notifySessionComplete(int sessionId) {
        if (DEBUG) {
            Slog.d(TAG, "Session complete for " + sessionId);
+16 −0
Original line number Diff line number Diff line
@@ -170,6 +170,8 @@ final class InstallRequest {
    private final boolean mHasAppMetadataFileFromInstaller;

    private boolean mKeepArtProfile = false;
    private final boolean mDependencyInstallerEnabled;
    private final int mMissingSharedLibraryCount;

    // New install
    InstallRequest(InstallingSession params) {
@@ -190,6 +192,8 @@ final class InstallRequest {
        mRequireUserAction = params.mRequireUserAction;
        mPreVerifiedDomains = params.mPreVerifiedDomains;
        mHasAppMetadataFileFromInstaller = params.mHasAppMetadataFile;
        mDependencyInstallerEnabled = params.mDependencyInstallerEnabled;
        mMissingSharedLibraryCount = params.mMissingSharedLibraryCount;
    }

    // Install existing package as user
@@ -209,6 +213,8 @@ final class InstallRequest {
        mInstallerUidForInstallExisting = installerUid;
        mSystem = isSystem;
        mHasAppMetadataFileFromInstaller = false;
        mDependencyInstallerEnabled = false;
        mMissingSharedLibraryCount = 0;
    }

    // addForInit
@@ -231,6 +237,8 @@ final class InstallRequest {
        mRequireUserAction = USER_ACTION_UNSPECIFIED;
        mDisabledPs = disabledPs;
        mHasAppMetadataFileFromInstaller = false;
        mDependencyInstallerEnabled = false;
        mMissingSharedLibraryCount = 0;
    }

    @Nullable
@@ -1069,4 +1077,12 @@ final class InstallRequest {
    boolean isKeepArtProfile() {
        return mKeepArtProfile;
    }

    int getMissingSharedLibraryCount() {
        return mMissingSharedLibraryCount;
    }

    boolean isDependencyInstallerEnabled() {
        return mDependencyInstallerEnabled;
    }
}
+8 −1
Original line number Diff line number Diff line
@@ -103,6 +103,8 @@ class InstallingSession {
    final DomainSet mPreVerifiedDomains;
    final boolean mHasAppMetadataFile;
    @Nullable final String mDexoptCompilerFilter;
    final boolean mDependencyInstallerEnabled;
    final int mMissingSharedLibraryCount;

    // For move install
    InstallingSession(OriginInfo originInfo, MoveInfo moveInfo, IPackageInstallObserver2 observer,
@@ -138,13 +140,16 @@ class InstallingSession {
        mPreVerifiedDomains = null;
        mHasAppMetadataFile = false;
        mDexoptCompilerFilter = null;
        mDependencyInstallerEnabled = false;
        mMissingSharedLibraryCount = 0;
    }

    InstallingSession(int sessionId, File stagedDir, IPackageInstallObserver2 observer,
            PackageInstaller.SessionParams sessionParams, InstallSource installSource,
            UserHandle user, SigningDetails signingDetails, int installerUid,
            PackageLite packageLite, DomainSet preVerifiedDomains, PackageManagerService pm,
            boolean hasAppMetadatafile) {
            boolean hasAppMetadatafile, boolean dependencyInstallerEnabled,
            int missingSharedLibraryCount) {
        mPm = pm;
        mUser = user;
        mOriginInfo = OriginInfo.fromStagedFile(stagedDir);
@@ -175,6 +180,8 @@ class InstallingSession {
        mPreVerifiedDomains = preVerifiedDomains;
        mHasAppMetadataFile = hasAppMetadatafile;
        mDexoptCompilerFilter = sessionParams.dexoptCompilerFilter;
        mDependencyInstallerEnabled = dependencyInstallerEnabled;
        mMissingSharedLibraryCount = missingSharedLibraryCount;
    }

    @Override
+32 −6
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ import static android.content.pm.PackageManager.INSTALL_FAILED_INSUFFICIENT_STOR
import static android.content.pm.PackageManager.INSTALL_FAILED_INTERNAL_ERROR;
import static android.content.pm.PackageManager.INSTALL_FAILED_INVALID_APK;
import static android.content.pm.PackageManager.INSTALL_FAILED_MEDIA_UNAVAILABLE;
import static android.content.pm.PackageManager.INSTALL_FAILED_MISSING_SHARED_LIBRARY;
import static android.content.pm.PackageManager.INSTALL_FAILED_MISSING_SPLIT;
import static android.content.pm.PackageManager.INSTALL_FAILED_PRE_APPROVAL_NOT_AVAILABLE;
import static android.content.pm.PackageManager.INSTALL_FAILED_SESSION_INVALID;
@@ -109,6 +110,7 @@ import android.content.pm.PackageInstaller.UserActionReason;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.PackageInfoFlags;
import android.content.pm.PackageManagerInternal;
import android.content.pm.SharedLibraryInfo;
import android.content.pm.SigningDetails;
import android.content.pm.dex.DexMetadataHelper;
import android.content.pm.parsing.ApkLite;
@@ -540,6 +542,9 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
    @GuardedBy("mLock")
    private DomainSet mPreVerifiedDomains;

    private AtomicBoolean mDependencyInstallerEnabled = new AtomicBoolean();
    private AtomicInteger mMissingSharedLibraryCount = new AtomicInteger();

    static class FileEntry {
        private final int mIndex;
        private final InstallationFile mFile;
@@ -3232,6 +3237,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
        if (Flags.sdkDependencyInstaller()
                && params.isAutoInstallDependenciesEnabled
                && !isMultiPackage()) {
            mDependencyInstallerEnabled.set(true);
            resolveLibraryDependenciesIfNeeded();
        } else {
            install();
@@ -3241,8 +3247,20 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {

    private void resolveLibraryDependenciesIfNeeded() {
        synchronized (mLock) {
            mInstallDependencyHelper.resolveLibraryDependenciesIfNeeded(mPackageLite,
                    mPm.snapshotComputer(), userId, mHandler,
            List<SharedLibraryInfo> missingLibraries = new ArrayList<>();
            try {
                missingLibraries = mInstallDependencyHelper.getMissingSharedLibraries(mPackageLite);
            } catch (PackageManagerException e) {
                handleDependencyResolutionFailure(e);
            } catch (Exception e) {
                handleDependencyResolutionFailure(
                        new PackageManagerException(
                                INSTALL_FAILED_MISSING_SHARED_LIBRARY, e.getMessage()));
            }

            mMissingSharedLibraryCount.set(missingLibraries.size());
            mInstallDependencyHelper.resolveLibraryDependenciesIfNeeded(missingLibraries,
                    mPackageLite, mPm.snapshotComputer(), userId, mHandler,
                    new OutcomeReceiver<>() {

                        @Override
@@ -3252,14 +3270,21 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {

                        @Override
                        public void onError(@NonNull PackageManagerException e) {
                            final String completeMsg = ExceptionUtils.getCompleteMessage(e);
                            setSessionFailed(e.error, completeMsg);
                            onSessionDependencyResolveFailure(e.error, completeMsg);
                            handleDependencyResolutionFailure(e);
                        }
                    });
        }
    }

    private void handleDependencyResolutionFailure(@NonNull PackageManagerException e) {
        final String completeMsg = ExceptionUtils.getCompleteMessage(e);
        setSessionFailed(e.error, completeMsg);
        onSessionDependencyResolveFailure(e.error, completeMsg);
        PackageMetrics.onDependencyInstallationFailure(
                sessionId, getPackageName(), e.error, mInstallerUid, params,
                mMissingSharedLibraryCount.get());
    }

    /**
     * Stages this session for install and returns a
     * {@link InstallingSession} representing this new staged state.
@@ -3327,7 +3352,8 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
        synchronized (mLock) {
            return new InstallingSession(sessionId, stageDir, localObserver, params, mInstallSource,
                    user, mSigningDetails, mInstallerUid, mPackageLite, mPreVerifiedDomains, mPm,
                    mHasAppMetadataFile);
                    mHasAppMetadataFile, mDependencyInstallerEnabled.get(),
                    mMissingSharedLibraryCount.get());
        }
    }

+53 −2
Original line number Diff line number Diff line
@@ -32,7 +32,9 @@ import android.app.admin.SecurityLog;
import android.content.ComponentName;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.DataLoaderType;
import android.content.pm.Flags;
import android.content.pm.PackageInstaller;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.parsing.ApkLiteParseUtils;
@@ -173,7 +175,10 @@ final class PackageMetrics {
                mInstallRequest.isInstallInherit() /* is_inherit */,
                mInstallRequest.isInstallForUsers() /* is_installing_existing_as_user */,
                mInstallRequest.isInstallMove() /* is_move_install */,
                false /* is_staged */
                false /* is_staged */,
                mInstallRequest
                        .isDependencyInstallerEnabled() /* is_install_dependencies_enabled */,
                mInstallRequest.getMissingSharedLibraryCount() /* missing_dependencies_count */
        );
    }

@@ -323,7 +328,53 @@ final class PackageMetrics {
                verifyingSession.isInherit() /* is_inherit */,
                false /* is_installing_existing_as_user */,
                false /* is_move_install */,
                verifyingSession.isStaged() /* is_staged */
                verifyingSession.isStaged() /* is_staged */,
                false /* is_install_dependencies_enabled */,
                0 /* missing_dependencies_count */
        );
    }

    static void onDependencyInstallationFailure(
            int sessionId, String packageName, int errorCode, int installerPackageUid,
            PackageInstaller.SessionParams params, int missingDependenciesCount) {
        if (params == null) {
            return;
        }
        int dataLoaderType = DataLoaderType.NONE;
        if (params.dataLoaderParams != null) {
            dataLoaderType = params.dataLoaderParams.getType();
        }

        FrameworkStatsLog.write(FrameworkStatsLog.PACKAGE_INSTALLATION_SESSION_REPORTED,
                sessionId /* session_id */,
                packageName /* package_name */,
                INVALID_UID /* uid */,
                null /* user_ids */,
                null /* user_types */,
                null /* original_user_ids */,
                null /* original_user_types */,
                errorCode /* public_return_code */,
                0 /* internal_error_code */,
                0 /* apks_size_bytes */,
                0 /* version_code */,
                null /* install_steps */,
                null /* step_duration_millis */,
                0 /* total_duration_millis */,
                0 /* install_flags */,
                installerPackageUid /* installer_package_uid */,
                INVALID_UID /* original_installer_package_uid */,
                dataLoaderType /* data_loader_type */,
                params.requireUserAction /* user_action_required_type */,
                (params.installFlags & PackageManager.INSTALL_INSTANT_APP) != 0 /* is_instant */,
                false /* is_replace */,
                false /* is_system */,
                params.mode
                        == PackageInstaller.SessionParams.MODE_INHERIT_EXISTING /* is_inherit */,
                false /* is_installing_existing_as_user */,
                false /* is_move_install */,
                params.isStaged /* is_staged */,
                true /* is_install_dependencies_enabled */,
                missingDependenciesCount /* missing_dependencies_count */
        );
    }

Loading