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

Commit e5795127 authored by Sanjana Sunil's avatar Sanjana Sunil Committed by Android (Google) Code Review
Browse files

Merge "Log dependency installer fields in installation atom" into main

parents 5cb76d53 6a81fa16
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