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

Commit e585720c authored by Song Chun Fan's avatar Song Chun Fan
Browse files

[3/N] implement getDeclaredLibraries

+ Add declaredLibraries to ApkLite and PackageLite
+ Move parsing time to be slightly earlier in the verification stage.
  This change only impact mode_inherit installations, because for
mode_full installs, parsing is already done at validation time.

Test: atest CtsPackageManagerTestCases:VerifierServiceTest

FLAG: android.content.pm.verification_service

BUG: 360129103
BUG: 360129657

Change-Id: I68e8da44b90e3b22a2bc0ef34f6c31afe7294e45
parent 2c5b6d7e
Loading
Loading
Loading
Loading
+18 −0
Original line number Diff line number Diff line
@@ -208,6 +208,24 @@ public final class SharedLibraryInfo implements Parcelable {
                VersionedPackage.class.getClassLoader(), VersionedPackage.class);
    }

    /**
     * @hide
     * @param name
     * @param versionMajor
     */
    public SharedLibraryInfo(String name, long versionMajor, int type) {
        mPath = null;
        mPackageName = null;
        mName = name;
        mVersion = versionMajor;
        mType = type;
        mDeclaringPackage = null;
        mDependentPackages = null;
        mDependencies = null;
        mIsNative = false;
        mOptionalDependentPackages = null;
    }

    /**
     * Gets the type of this library.
     *
+13 −3
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import android.annotation.Nullable;
import android.content.pm.ArchivedPackageParcel;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.SharedLibraryInfo;
import android.content.pm.SigningDetails;
import android.content.pm.VerifierInfo;

@@ -149,6 +150,8 @@ public class ApkLite {
     */
    private final @Nullable String mEmergencyInstaller;

    private final @NonNull List<SharedLibraryInfo> mDeclaredLibraries;

    /**
     * Archival install info.
     */
@@ -165,7 +168,7 @@ public class ApkLite {
            int minSdkVersion, int targetSdkVersion, int rollbackDataPolicy,
            Set<String> requiredSplitTypes, Set<String> splitTypes,
            boolean hasDeviceAdminReceiver, boolean isSdkLibrary, boolean updatableSystem,
            String emergencyInstaller) {
            String emergencyInstaller, List<SharedLibraryInfo> declaredLibraries) {
        mPath = path;
        mPackageName = packageName;
        mSplitName = splitName;
@@ -202,6 +205,7 @@ public class ApkLite {
        mUpdatableSystem = updatableSystem;
        mEmergencyInstaller = emergencyInstaller;
        mArchivedPackage = null;
        mDeclaredLibraries = declaredLibraries;
    }

    public ApkLite(String path, ArchivedPackageParcel archivedPackage) {
@@ -241,6 +245,7 @@ public class ApkLite {
        mUpdatableSystem = true;
        mEmergencyInstaller = null;
        mArchivedPackage = archivedPackage;
        mDeclaredLibraries = null;
    }

    /**
@@ -565,6 +570,11 @@ public class ApkLite {
        return mEmergencyInstaller;
    }

    @DataClass.Generated.Member
    public @NonNull List<SharedLibraryInfo> getDeclaredLibraries() {
        return mDeclaredLibraries;
    }

    /**
     * Archival install info.
     */
@@ -574,10 +584,10 @@ public class ApkLite {
    }

    @DataClass.Generated(
            time = 1706896661616L,
            time = 1728333566322L,
            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 mUpdatableSystem\nprivate final @android.annotation.Nullable java.lang.String mEmergencyInstaller\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)")
            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 mUpdatableSystem\nprivate final @android.annotation.Nullable java.lang.String mEmergencyInstaller\nprivate final @android.annotation.NonNull java.util.List<android.content.pm.SharedLibraryInfo> mDeclaredLibraries\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() {}

+51 −1
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import android.annotation.NonNull;
import android.app.admin.DeviceAdminReceiver;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.SharedLibraryInfo;
import android.content.pm.SigningDetails;
import android.content.pm.VerifierInfo;
import android.content.pm.parsing.result.ParseInput;
@@ -92,6 +93,8 @@ public class ApkLiteParseUtils {
    private static final String[] SDK_CODENAMES = Build.VERSION.ACTIVE_CODENAMES;
    private static final String TAG_PROCESSES = "processes";
    private static final String TAG_PROCESS = "process";
    private static final String TAG_STATIC_LIBRARY = "static-library";
    private static final String TAG_LIBRARY = "library";

    /**
     * Parse only lightweight details about the package at the given location.
@@ -457,6 +460,7 @@ public class ApkLiteParseUtils {
        boolean hasDeviceAdminReceiver = false;

        boolean isSdkLibrary = false;
        List<SharedLibraryInfo> declaredLibraries = new ArrayList<>();

        // Only search the tree when the tag is the direct child of <manifest> tag
        int type;
@@ -521,6 +525,51 @@ public class ApkLiteParseUtils {
                            break;
                        case TAG_SDK_LIBRARY:
                            isSdkLibrary = true;
                            // Mirrors ParsingPackageUtils#parseSdkLibrary until lite and full
                            // parsing are combined
                            String sdkLibName = parser.getAttributeValue(
                                    ANDROID_RES_NAMESPACE, "name");
                            int sdkLibVersionMajor = parser.getAttributeIntValue(
                                        ANDROID_RES_NAMESPACE, "versionMajor", -1);
                            if (sdkLibName == null || sdkLibVersionMajor < 0) {
                                return input.error(
                                        PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED,
                                        "Bad uses-sdk-library declaration name: " + sdkLibName
                                                + " version: " + sdkLibVersionMajor);
                            }
                            declaredLibraries.add(new SharedLibraryInfo(
                                    sdkLibName, sdkLibVersionMajor,
                                    SharedLibraryInfo.TYPE_SDK_PACKAGE));
                            break;
                        case TAG_STATIC_LIBRARY:
                            // Mirrors ParsingPackageUtils#parseStaticLibrary until lite and full
                            // parsing are combined
                            String staticLibName = parser.getAttributeValue(
                                    ANDROID_RES_NAMESPACE, "name");
                            int staticLibVersion = parser.getAttributeIntValue(
                                    ANDROID_RES_NAMESPACE, "version", -1);
                            int staticLibVersionMajor = parser.getAttributeIntValue(
                                    ANDROID_RES_NAMESPACE, "versionMajor", 0);
                            if (staticLibName == null || staticLibVersion < 0) {
                                return input.error("Bad static-library declaration name: "
                                        + staticLibName + " version: " + staticLibVersion);
                            }
                            declaredLibraries.add(new SharedLibraryInfo(staticLibName,
                                    PackageInfo.composeLongVersionCode(staticLibVersionMajor,
                                            staticLibVersion), SharedLibraryInfo.TYPE_STATIC));
                            break;
                        case TAG_LIBRARY:
                            // Mirrors ParsingPackageUtils#parseLibrary until lite and full parsing
                            // are combined
                            String libName = parser.getAttributeValue(
                                    ANDROID_RES_NAMESPACE, "name");
                            if (libName == null) {
                                return input.error("Bad library declaration name: null");
                            }
                            libName = libName.intern();
                            declaredLibraries.add(new SharedLibraryInfo(libName,
                                    SharedLibraryInfo.VERSION_UNDEFINED,
                                    SharedLibraryInfo.TYPE_DYNAMIC));
                            break;
                        case TAG_PROCESSES:
                            final int processesDepth = parser.getDepth();
@@ -645,7 +694,8 @@ public class ApkLiteParseUtils {
                        overlayIsStatic, overlayPriority, requiredSystemPropertyName,
                        requiredSystemPropertyValue, minSdkVersion, targetSdkVersion,
                        rollbackDataPolicy, requiredSplitTypes.first, requiredSplitTypes.second,
                        hasDeviceAdminReceiver, isSdkLibrary, updatableSystem, emergencyInstaller));
                        hasDeviceAdminReceiver, isSdkLibrary, updatableSystem, emergencyInstaller,
                        declaredLibraries));
    }

    private static boolean isDeviceAdminReceiver(
+11 −2
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.pm.ArchivedPackageParcel;
import android.content.pm.PackageInfo;
import android.content.pm.SharedLibraryInfo;
import android.content.pm.SigningDetails;
import android.content.pm.VerifierInfo;

@@ -114,6 +115,8 @@ public class PackageLite {
     */
    private final boolean mIsSdkLibrary;

    private final @NonNull List<SharedLibraryInfo> mDeclaredLibraries;

    /**
     * Archival install info.
     */
@@ -154,6 +157,7 @@ public class PackageLite {
        mSplitApkPaths = splitApkPaths;
        mSplitRevisionCodes = splitRevisionCodes;
        mTargetSdk = targetSdk;
        mDeclaredLibraries = baseApk.getDeclaredLibraries();
        mArchivedPackage = baseApk.getArchivedPackage();
    }

@@ -433,6 +437,11 @@ public class PackageLite {
        return mIsSdkLibrary;
    }

    @DataClass.Generated.Member
    public @NonNull List<SharedLibraryInfo> getDeclaredLibraries() {
        return mDeclaredLibraries;
    }

    /**
     * Archival install info.
     */
@@ -442,10 +451,10 @@ public class PackageLite {
    }

    @DataClass.Generated(
            time = 1694792176268L,
            time = 1728333569917L,
            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 @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)")
            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.NonNull java.util.List<android.content.pm.SharedLibraryInfo> mDeclaredLibraries\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() {}

+34 −12
Original line number Diff line number Diff line
@@ -109,6 +109,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.SigningInfo;
import android.content.pm.dex.DexMetadataHelper;
@@ -2840,19 +2841,38 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
            // since installation is in progress.
            activate();
        }
        try {
            List<PackageInstallerSession> children = getChildSessions();
            if (isMultiPackage()) {
                for (PackageInstallerSession child : children) {
                    child.prepareInheritedFiles();
                    child.parseApk();
                }
            } else {
                prepareInheritedFiles();
                parseApk();
            }
        }  catch (PackageManagerException e) {
            final String completeMsg = ExceptionUtils.getCompleteMessage(e);
            final String errorMsg = PackageManager.installStatusToString(e.error, completeMsg);
            setSessionFailed(e.error, errorMsg);
            onSessionVerificationFailure(e.error, errorMsg);
        }
        if (Flags.verificationService()) {
            final Supplier<Computer> snapshotSupplier = mPm::snapshotComputer;
            if (mVerifierController.isVerifierInstalled(snapshotSupplier, userId)) {
                // TODO: extract shared library declarations
                final SigningInfo signingInfo;
                final List<SharedLibraryInfo> declaredLibraries;
                synchronized (mLock) {
                    signingInfo = new SigningInfo(mSigningDetails);
                    declaredLibraries =
                            mPackageLite == null ? null : mPackageLite.getDeclaredLibraries();
                }
                // Send the request to the verifier and wait for its response before the rest of
                // the installation can proceed.
                if (!mVerifierController.startVerificationSession(snapshotSupplier, userId,
                        sessionId, params.appPackageName, Uri.fromFile(stageDir), signingInfo,
                        /* declaredLibraries= */null, /* extensionParams= */ null,
                        sessionId, getPackageName(), Uri.fromFile(stageDir), signingInfo,
                        declaredLibraries, /* extensionParams= */ null,
                        new VerifierCallback(), /* retry= */ false)) {
                    // A verifier is installed but cannot be connected. Installation disallowed.
                    onSessionVerificationFailure(INSTALL_FAILED_INTERNAL_ERROR,
@@ -2887,12 +2907,10 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
            List<PackageInstallerSession> children = getChildSessions();
            if (isMultiPackage()) {
                for (PackageInstallerSession child : children) {
                    child.prepareInheritedFiles();
                    child.parseApkAndExtractNativeLibraries();
                    child.extractNativeLibraries();
                }
            } else {
                prepareInheritedFiles();
                parseApkAndExtractNativeLibraries();
                extractNativeLibraries();
            }
            verifyNonStaged();
        } catch (PackageManagerException e) {
@@ -3069,7 +3087,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
        mStageDirInUse = true;
    }

    private void parseApkAndExtractNativeLibraries() throws PackageManagerException {
    private void parseApk() throws PackageManagerException {
        synchronized (mLock) {
            if (mStageDirInUse) {
                throw new PackageManagerException(INSTALL_FAILED_INTERNAL_ERROR,
@@ -3102,12 +3120,16 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
                // stage dir here.
                // Besides, PackageLite may be null for staged sessions that don't complete
                // pre-reboot verification.
                result = getOrParsePackageLiteLocked(stageDir, /* flags */ 0);
                mPackageLite = getOrParsePackageLiteLocked(stageDir, /* flags */ 0);
            } else {
                result = getOrParsePackageLiteLocked(mResolvedBaseFile, /* flags */ 0);
                mPackageLite = getOrParsePackageLiteLocked(mResolvedBaseFile, /* flags */ 0);
            }
            if (result != null) {
                mPackageLite = result;
        }
    }

    private void extractNativeLibraries() throws PackageManagerException {
        synchronized (mLock) {
            if (mPackageLite != null) {
                if (!isApexSession()) {
                    synchronized (mProgressLock) {
                        mInternalProgress = 0.5f;