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

Commit 1e9cecac authored by Alex Buynytskyy's avatar Alex Buynytskyy
Browse files

Provide archive state for archived installation.

Bug: 297916136
Test: atest PackageManagerTest
Change-Id: I0629859342c2596aa11e45019b37d014e124777c
parent 12142e2e
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -16,8 +16,6 @@

package android.content.pm;

import android.graphics.Bitmap;

/** @hide */
parcelable ArchivedActivityParcel {
    String title;
+10 −85
Original line number Diff line number Diff line
@@ -23,11 +23,9 @@ import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.SigningDetails;
import android.content.pm.VerifierInfo;
import android.os.Build;

import com.android.internal.util.CollectionUtils;
import com.android.internal.util.DataClass;
import com.android.internal.util.XmlUtils;

import java.util.List;
import java.util.Set;
@@ -142,32 +140,9 @@ public class ApkLite {
    private final boolean mIsSdkLibrary;

    /**
     *  Set to <code>false</code> if the application does not wish to permit any OS-driven
     *  backups of its data; <code>true</code> otherwise.
     * Archival install info.
     */
    private final boolean mBackupAllowed;

    /**
     * When set, the default data storage directory for this app is pointed at
     * the device-protected location.
     */
    private final boolean mDefaultToDeviceProtectedStorage;

    /**
     * If {@code true} this app requests full external storage access.
     */
    private final boolean mRequestLegacyExternalStorage;

    /**
     * Indicates whether this application has declared its user data as fragile, causing the
     * system to prompt the user on whether to keep the user data on uninstall.
     */
    private final boolean mUserDataFragile;

    /**
     * Indicates whether this application's data will be cleared on a failed restore.
     */
    private final boolean mClearUserDataOnFailedRestoreAllowed;
    private final @Nullable ArchivedPackageParcel mArchivedPackage;

    public ApkLite(String path, String packageName, String splitName, boolean isFeatureSplit,
            String configForSplit, String usesSplitName, boolean isSplitRequired, int versionCode,
@@ -179,10 +154,7 @@ public class ApkLite {
            String requiredSystemPropertyName, String requiredSystemPropertyValue,
            int minSdkVersion, int targetSdkVersion, int rollbackDataPolicy,
            Set<String> requiredSplitTypes, Set<String> splitTypes,
            boolean hasDeviceAdminReceiver, boolean isSdkLibrary, boolean clearUserDataAllowed,
            boolean backupAllowed, boolean defaultToDeviceProtectedStorage,
            boolean requestLegacyExternalStorage, boolean userDataFragile,
            boolean clearUserDataOnFailedRestoreAllowed) {
            boolean hasDeviceAdminReceiver, boolean isSdkLibrary) {
        mPath = path;
        mPackageName = packageName;
        mSplitName = splitName;
@@ -216,11 +188,7 @@ public class ApkLite {
        mRollbackDataPolicy = rollbackDataPolicy;
        mHasDeviceAdminReceiver = hasDeviceAdminReceiver;
        mIsSdkLibrary = isSdkLibrary;
        mBackupAllowed = backupAllowed;
        mDefaultToDeviceProtectedStorage = defaultToDeviceProtectedStorage;
        mRequestLegacyExternalStorage = requestLegacyExternalStorage;
        mUserDataFragile = userDataFragile;
        mClearUserDataOnFailedRestoreAllowed = clearUserDataOnFailedRestoreAllowed;
        mArchivedPackage = null;
    }

    public ApkLite(String path, ArchivedPackageParcel archivedPackage) {
@@ -257,15 +225,7 @@ public class ApkLite {
        mRollbackDataPolicy = 0;
        mHasDeviceAdminReceiver = false;
        mIsSdkLibrary = false;
        // @see ParsingPackageUtils#parseBaseAppBasicFlags
        mBackupAllowed = true;
        mDefaultToDeviceProtectedStorage = XmlUtils.convertValueToBoolean(
                archivedPackage.defaultToDeviceProtectedStorage, false);
        mRequestLegacyExternalStorage = XmlUtils.convertValueToBoolean(
                archivedPackage.requestLegacyExternalStorage,
                mTargetSdkVersion < Build.VERSION_CODES.Q);
        mUserDataFragile = XmlUtils.convertValueToBoolean(archivedPackage.userDataFragile, false);
        mClearUserDataOnFailedRestoreAllowed = true;
        mArchivedPackage = archivedPackage;
    }

    /**
@@ -575,53 +535,18 @@ public class ApkLite {
    }

    /**
     *  Set to <code>false</code> if the application does not wish to permit any OS-driven
     *  backups of its data; <code>true</code> otherwise.
     */
    @DataClass.Generated.Member
    public boolean isBackupAllowed() {
        return mBackupAllowed;
    }

    /**
     * When set, the default data storage directory for this app is pointed at
     * the device-protected location.
     */
    @DataClass.Generated.Member
    public boolean isDefaultToDeviceProtectedStorage() {
        return mDefaultToDeviceProtectedStorage;
    }

    /**
     * If {@code true} this app requests full external storage access.
     */
    @DataClass.Generated.Member
    public boolean isRequestLegacyExternalStorage() {
        return mRequestLegacyExternalStorage;
    }

    /**
     * Indicates whether this application has declared its user data as fragile, causing the
     * system to prompt the user on whether to keep the user data on uninstall.
     */
    @DataClass.Generated.Member
    public boolean isUserDataFragile() {
        return mUserDataFragile;
    }

    /**
     * Indicates whether this application's data will be cleared on a failed restore.
     * Archival install info.
     */
    @DataClass.Generated.Member
    public boolean isClearUserDataOnFailedRestoreAllowed() {
        return mClearUserDataOnFailedRestoreAllowed;
    public @Nullable ArchivedPackageParcel getArchivedPackage() {
        return mArchivedPackage;
    }

    @DataClass.Generated(
            time = 1693513509013L,
            time = 1694792109463L,
            codegenVersion = "1.0.23",
            sourceFile = "frameworks/base/core/java/android/content/pm/parsing/ApkLite.java",
            inputSignatures = "private final @android.annotation.NonNull java.lang.String mPackageName\nprivate final @android.annotation.NonNull java.lang.String mPath\nprivate final @android.annotation.Nullable java.lang.String mSplitName\nprivate final @android.annotation.Nullable java.lang.String mUsesSplitName\nprivate final @android.annotation.Nullable java.lang.String mConfigForSplit\nprivate final @android.annotation.Nullable java.util.Set<java.lang.String> mRequiredSplitTypes\nprivate final @android.annotation.Nullable java.util.Set<java.lang.String> mSplitTypes\nprivate final  int mVersionCodeMajor\nprivate final  int mVersionCode\nprivate final  int mRevisionCode\nprivate final  int mInstallLocation\nprivate final  int mMinSdkVersion\nprivate final  int mTargetSdkVersion\nprivate final @android.annotation.NonNull android.content.pm.VerifierInfo[] mVerifiers\nprivate final @android.annotation.NonNull android.content.pm.SigningDetails mSigningDetails\nprivate final  boolean mFeatureSplit\nprivate final  boolean mIsolatedSplits\nprivate final  boolean mSplitRequired\nprivate final  boolean mCoreApp\nprivate final  boolean mDebuggable\nprivate final  boolean mProfileableByShell\nprivate final  boolean mMultiArch\nprivate final  boolean mUse32bitAbi\nprivate final  boolean mExtractNativeLibs\nprivate final  boolean mUseEmbeddedDex\nprivate final @android.annotation.Nullable java.lang.String mTargetPackageName\nprivate final  boolean mOverlayIsStatic\nprivate final  int mOverlayPriority\nprivate final @android.annotation.Nullable java.lang.String mRequiredSystemPropertyName\nprivate final @android.annotation.Nullable java.lang.String mRequiredSystemPropertyValue\nprivate final  int mRollbackDataPolicy\nprivate final  boolean mHasDeviceAdminReceiver\nprivate final  boolean mIsSdkLibrary\nprivate final  boolean mBackupAllowed\nprivate final  boolean mDefaultToDeviceProtectedStorage\nprivate final  boolean mRequestLegacyExternalStorage\nprivate final  boolean mUserDataFragile\nprivate final  boolean mClearUserDataOnFailedRestoreAllowed\npublic  long getLongVersionCode()\nprivate  boolean hasAnyRequiredSplitTypes()\nclass ApkLite extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genConstructor=false, genConstDefs=false)")
            inputSignatures = "private final @android.annotation.NonNull java.lang.String mPackageName\nprivate final @android.annotation.NonNull java.lang.String mPath\nprivate final @android.annotation.Nullable java.lang.String mSplitName\nprivate final @android.annotation.Nullable java.lang.String mUsesSplitName\nprivate final @android.annotation.Nullable java.lang.String mConfigForSplit\nprivate final @android.annotation.Nullable java.util.Set<java.lang.String> mRequiredSplitTypes\nprivate final @android.annotation.Nullable java.util.Set<java.lang.String> mSplitTypes\nprivate final  int mVersionCodeMajor\nprivate final  int mVersionCode\nprivate final  int mRevisionCode\nprivate final  int mInstallLocation\nprivate final  int mMinSdkVersion\nprivate final  int mTargetSdkVersion\nprivate final @android.annotation.NonNull android.content.pm.VerifierInfo[] mVerifiers\nprivate final @android.annotation.NonNull android.content.pm.SigningDetails mSigningDetails\nprivate final  boolean mFeatureSplit\nprivate final  boolean mIsolatedSplits\nprivate final  boolean mSplitRequired\nprivate final  boolean mCoreApp\nprivate final  boolean mDebuggable\nprivate final  boolean mProfileableByShell\nprivate final  boolean mMultiArch\nprivate final  boolean mUse32bitAbi\nprivate final  boolean mExtractNativeLibs\nprivate final  boolean mUseEmbeddedDex\nprivate final @android.annotation.Nullable java.lang.String mTargetPackageName\nprivate final  boolean mOverlayIsStatic\nprivate final  int mOverlayPriority\nprivate final @android.annotation.Nullable java.lang.String mRequiredSystemPropertyName\nprivate final @android.annotation.Nullable java.lang.String mRequiredSystemPropertyValue\nprivate final  int mRollbackDataPolicy\nprivate final  boolean mHasDeviceAdminReceiver\nprivate final  boolean mIsSdkLibrary\nprivate final @android.annotation.Nullable android.content.pm.ArchivedPackageParcel mArchivedPackage\npublic  long getLongVersionCode()\nprivate  boolean hasAnyRequiredSplitTypes()\nclass ApkLite extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genConstructor=false, genConstDefs=false)")
    @Deprecated
    private void __metadata() {}

+1 −30
Original line number Diff line number Diff line
@@ -40,7 +40,6 @@ import android.util.Pair;
import android.util.Slog;

import com.android.internal.util.ArrayUtils;
import com.android.internal.util.XmlUtils;

import libcore.io.IoUtils;

@@ -447,13 +446,6 @@ public class ApkLiteParseUtils {
        int overlayPriority = 0;
        int rollbackDataPolicy = 0;

        boolean clearUserDataAllowed = true;
        boolean backupAllowed = true;
        boolean defaultToDeviceProtectedStorage = false;
        String requestLegacyExternalStorage = null;
        boolean userDataFragile = false;
        boolean clearUserDataOnFailedRestoreAllowed = true;

        String requiredSystemPropertyName = null;
        String requiredSystemPropertyValue = null;

@@ -493,22 +485,6 @@ public class ApkLiteParseUtils {
                useEmbeddedDex = parser.getAttributeBooleanValue(ANDROID_RES_NAMESPACE,
                        "useEmbeddedDex", false);

                clearUserDataAllowed = parser.getAttributeBooleanValue(ANDROID_RES_NAMESPACE,
                        "allowClearUserDataOnFailedRestore", true);
                backupAllowed = parser.getAttributeBooleanValue(ANDROID_RES_NAMESPACE,
                        "allowBackup", true);
                defaultToDeviceProtectedStorage = parser.getAttributeBooleanValue(
                        ANDROID_RES_NAMESPACE,
                        "defaultToDeviceProtectedStorage", false);
                userDataFragile = parser.getAttributeBooleanValue(ANDROID_RES_NAMESPACE,
                        "hasFragileUserData", false);
                clearUserDataOnFailedRestoreAllowed = parser.getAttributeBooleanValue(
                        ANDROID_RES_NAMESPACE,
                        "allowClearUserDataOnFailedRestore", true);

                requestLegacyExternalStorage = parser.getAttributeValue(ANDROID_RES_NAMESPACE,
                        "requestLegacyExternalStorage");

                rollbackDataPolicy = parser.getAttributeIntValue(ANDROID_RES_NAMESPACE,
                        "rollbackDataPolicy", 0);
                String permission = parser.getAttributeValue(ANDROID_RES_NAMESPACE,
@@ -629,9 +605,6 @@ public class ApkLiteParseUtils {
            return input.skip(message);
        }

        boolean isRequestLegacyExternalStorage = XmlUtils.convertValueToBoolean(
                requestLegacyExternalStorage, targetSdkVersion < Build.VERSION_CODES.Q);

        return input.success(
                new ApkLite(codePath, packageSplit.first, packageSplit.second, isFeatureSplit,
                        configForSplit, usesSplitName, isSplitRequired, versionCode,
@@ -641,9 +614,7 @@ public class ApkLiteParseUtils {
                        overlayIsStatic, overlayPriority, requiredSystemPropertyName,
                        requiredSystemPropertyValue, minSdkVersion, targetSdkVersion,
                        rollbackDataPolicy, requiredSplitTypes.first, requiredSplitTypes.second,
                        hasDeviceAdminReceiver, isSdkLibrary, clearUserDataAllowed, backupAllowed,
                        defaultToDeviceProtectedStorage, isRequestLegacyExternalStorage,
                        userDataFragile, clearUserDataOnFailedRestoreAllowed));
                        hasDeviceAdminReceiver, isSdkLibrary));
    }

    private static boolean isDeviceAdminReceiver(
+10 −66
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package android.content.pm.parsing;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.pm.ArchivedPackageParcel;
import android.content.pm.PackageInfo;
import android.content.pm.SigningDetails;
import android.content.pm.VerifierInfo;
@@ -112,29 +113,11 @@ public class PackageLite {
     * Indicates if this package is a sdk.
     */
    private final boolean mIsSdkLibrary;

    /**
     *  Set to <code>false</code> if the application does not wish to permit any OS-driven
     *  backups of its data; <code>true</code> otherwise.
     */
    private final boolean mBackupAllowed;
    /**
     * When set, the default data storage directory for this app is pointed at
     * the device-protected location.
     */
    private final boolean mDefaultToDeviceProtectedStorage;
    /**
     * If {@code true} this app requests full external storage access.
     */
    private final boolean mRequestLegacyExternalStorage;
    /**
     * Indicates whether this application has declared its user data as fragile, causing the
     * system to prompt the user on whether to keep the user data on uninstall.
     */
    private final boolean mUserDataFragile;
    /**
     * Indicates whether this application's data will be cleared on a failed restore.
     * Archival install info.
     */
    private final boolean mClearUserDataOnFailedRestoreAllowed;
    private final @Nullable ArchivedPackageParcel mArchivedPackage;

    public PackageLite(String path, String baseApkPath, ApkLite baseApk,
            String[] splitNames, boolean[] isFeatureSplits, String[] usesSplitNames,
@@ -171,11 +154,7 @@ public class PackageLite {
        mSplitApkPaths = splitApkPaths;
        mSplitRevisionCodes = splitRevisionCodes;
        mTargetSdk = targetSdk;
        mBackupAllowed = baseApk.isBackupAllowed();
        mDefaultToDeviceProtectedStorage = baseApk.isDefaultToDeviceProtectedStorage();
        mRequestLegacyExternalStorage = baseApk.isRequestLegacyExternalStorage();
        mUserDataFragile = baseApk.isUserDataFragile();
        mClearUserDataOnFailedRestoreAllowed = baseApk.isClearUserDataOnFailedRestoreAllowed();
        mArchivedPackage = baseApk.getArchivedPackage();
    }

    /**
@@ -455,53 +434,18 @@ public class PackageLite {
    }

    /**
     *  Set to <code>false</code> if the application does not wish to permit any OS-driven
     *  backups of its data; <code>true</code> otherwise.
     */
    @DataClass.Generated.Member
    public boolean isBackupAllowed() {
        return mBackupAllowed;
    }

    /**
     * When set, the default data storage directory for this app is pointed at
     * the device-protected location.
     */
    @DataClass.Generated.Member
    public boolean isDefaultToDeviceProtectedStorage() {
        return mDefaultToDeviceProtectedStorage;
    }

    /**
     * If {@code true} this app requests full external storage access.
     */
    @DataClass.Generated.Member
    public boolean isRequestLegacyExternalStorage() {
        return mRequestLegacyExternalStorage;
    }

    /**
     * Indicates whether this application has declared its user data as fragile, causing the
     * system to prompt the user on whether to keep the user data on uninstall.
     */
    @DataClass.Generated.Member
    public boolean isUserDataFragile() {
        return mUserDataFragile;
    }

    /**
     * Indicates whether this application's data will be cleared on a failed restore.
     * Archival install info.
     */
    @DataClass.Generated.Member
    public boolean isClearUserDataOnFailedRestoreAllowed() {
        return mClearUserDataOnFailedRestoreAllowed;
    public @Nullable ArchivedPackageParcel getArchivedPackage() {
        return mArchivedPackage;
    }

    @DataClass.Generated(
            time = 1693513525097L,
            time = 1694792176268L,
            codegenVersion = "1.0.23",
            sourceFile = "frameworks/base/core/java/android/content/pm/parsing/PackageLite.java",
            inputSignatures = "private final @android.annotation.NonNull java.lang.String mPackageName\nprivate final @android.annotation.NonNull java.lang.String mPath\nprivate final @android.annotation.NonNull java.lang.String mBaseApkPath\nprivate final @android.annotation.Nullable java.lang.String[] mSplitApkPaths\nprivate final @android.annotation.Nullable java.lang.String[] mSplitNames\nprivate final @android.annotation.Nullable java.lang.String[] mUsesSplitNames\nprivate final @android.annotation.Nullable java.lang.String[] mConfigForSplit\nprivate final @android.annotation.Nullable java.util.Set<java.lang.String> mBaseRequiredSplitTypes\nprivate final @android.annotation.Nullable java.util.Set<java.lang.String>[] mRequiredSplitTypes\nprivate final @android.annotation.Nullable java.util.Set<java.lang.String>[] mSplitTypes\nprivate final  int mVersionCodeMajor\nprivate final  int mVersionCode\nprivate final  int mTargetSdk\nprivate final  int mBaseRevisionCode\nprivate final @android.annotation.Nullable int[] mSplitRevisionCodes\nprivate final  int mInstallLocation\nprivate final @android.annotation.NonNull android.content.pm.VerifierInfo[] mVerifiers\nprivate final @android.annotation.NonNull android.content.pm.SigningDetails mSigningDetails\nprivate final @android.annotation.Nullable boolean[] mIsFeatureSplits\nprivate final  boolean mIsolatedSplits\nprivate final  boolean mSplitRequired\nprivate final  boolean mCoreApp\nprivate final  boolean mDebuggable\nprivate final  boolean mMultiArch\nprivate final  boolean mUse32bitAbi\nprivate final  boolean mExtractNativeLibs\nprivate final  boolean mProfileableByShell\nprivate final  boolean mUseEmbeddedDex\nprivate final  boolean mIsSdkLibrary\nprivate final  boolean mBackupAllowed\nprivate final  boolean mDefaultToDeviceProtectedStorage\nprivate final  boolean mRequestLegacyExternalStorage\nprivate final  boolean mUserDataFragile\nprivate final  boolean mClearUserDataOnFailedRestoreAllowed\npublic  java.util.List<java.lang.String> getAllApkPaths()\npublic  long getLongVersionCode()\nprivate  boolean hasAnyRequiredSplitTypes()\nclass PackageLite extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genConstructor=false, genConstDefs=false)")
            inputSignatures = "private final @android.annotation.NonNull java.lang.String mPackageName\nprivate final @android.annotation.NonNull java.lang.String mPath\nprivate final @android.annotation.NonNull java.lang.String mBaseApkPath\nprivate final @android.annotation.Nullable java.lang.String[] mSplitApkPaths\nprivate final @android.annotation.Nullable java.lang.String[] mSplitNames\nprivate final @android.annotation.Nullable java.lang.String[] mUsesSplitNames\nprivate final @android.annotation.Nullable java.lang.String[] mConfigForSplit\nprivate final @android.annotation.Nullable java.util.Set<java.lang.String> mBaseRequiredSplitTypes\nprivate final @android.annotation.Nullable java.util.Set<java.lang.String>[] mRequiredSplitTypes\nprivate final @android.annotation.Nullable java.util.Set<java.lang.String>[] mSplitTypes\nprivate final  int mVersionCodeMajor\nprivate final  int mVersionCode\nprivate final  int mTargetSdk\nprivate final  int mBaseRevisionCode\nprivate final @android.annotation.Nullable int[] mSplitRevisionCodes\nprivate final  int mInstallLocation\nprivate final @android.annotation.NonNull android.content.pm.VerifierInfo[] mVerifiers\nprivate final @android.annotation.NonNull android.content.pm.SigningDetails mSigningDetails\nprivate final @android.annotation.Nullable boolean[] mIsFeatureSplits\nprivate final  boolean mIsolatedSplits\nprivate final  boolean mSplitRequired\nprivate final  boolean mCoreApp\nprivate final  boolean mDebuggable\nprivate final  boolean mMultiArch\nprivate final  boolean mUse32bitAbi\nprivate final  boolean mExtractNativeLibs\nprivate final  boolean mProfileableByShell\nprivate final  boolean mUseEmbeddedDex\nprivate final  boolean mIsSdkLibrary\nprivate final @android.annotation.Nullable android.content.pm.ArchivedPackageParcel mArchivedPackage\npublic  java.util.List<java.lang.String> getAllApkPaths()\npublic  long getLongVersionCode()\nprivate  boolean hasAnyRequiredSplitTypes()\nclass PackageLite extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genConstructor=false, genConstDefs=false)")
    @Deprecated
    private void __metadata() {}

+9 −1
Original line number Diff line number Diff line
@@ -44,6 +44,7 @@ import static android.os.incremental.IncrementalManager.isIncrementalPath;
import static android.os.storage.StorageManager.FLAG_STORAGE_CE;
import static android.os.storage.StorageManager.FLAG_STORAGE_DE;
import static android.os.storage.StorageManager.FLAG_STORAGE_EXTERNAL;

import static com.android.server.pm.DexOptHelper.useArtService;
import static com.android.server.pm.InstructionSets.getAppDexInstructionSets;
import static com.android.server.pm.InstructionSets.getDexCodeInstructionSet;
@@ -111,6 +112,7 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.content.IntentSender;
import android.content.pm.ApplicationInfo;
import android.content.pm.ArchivedPackageParcel;
import android.content.pm.DataLoaderType;
import android.content.pm.PackageInfo;
import android.content.pm.PackageInfoLite;
@@ -1142,15 +1144,18 @@ final class InstallPackageHelper {

        Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "parsePackage");
        final ParsedPackage parsedPackage;
        final ArchivedPackageParcel archivedPackage;
        try (PackageParser2 pp = mPm.mInjector.getPreparingPackageParser()) {
            if (request.getPackageLite() == null || !request.isArchived()) {
                // TODO: pass packageLite from install request instead of reparsing the package
                parsedPackage = pp.parsePackage(tmpPackageFile, parseFlags, false);
                AndroidPackageUtils.validatePackageDexMetadata(parsedPackage);
                archivedPackage = null;
            } else {
                // Archived install mode, no APK.
                parsedPackage = pp.parsePackageFromPackageLite(request.getPackageLite(),
                        parseFlags);
                archivedPackage = request.getPackageLite().getArchivedPackage();
            }
        } catch (PackageManagerException e) {
            throw new PrepareFailure("Failed parse during installPackageLI", e);
@@ -1833,7 +1838,7 @@ final class InstallPackageHelper {
            shouldCloseFreezerBeforeReturn = false;

            request.setPrepareResult(replace, targetScanFlags, targetParseFlags,
                    oldPackageState, parsedPackage,
                    oldPackageState, parsedPackage, archivedPackage,
                    replace /* clearCodeCache */, sysPkg, ps, disabledPs);
        } finally {
            request.setFreezer(freezer);
@@ -2164,6 +2169,9 @@ final class InstallPackageHelper {
                }
            }
            if (installRequest.getReturnCode() == PackageManager.INSTALL_SUCCEEDED) {
                mPm.createArchiveStateIfNeeded(ps,
                        installRequest.getArchivedPackage(),
                        installRequest.getNewUsers());
                mPm.updateSequenceNumberLP(ps, installRequest.getNewUsers());
                mPm.updateInstantAppInstallerLocked(packageName);
            }
Loading