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

Commit 737b91f9 authored by Sanjana Sunil's avatar Sanjana Sunil
Browse files

Allow dependency installation if caller has suitable permission

If the calling app has INSTALL_DEPENDENCY_SHARED_LIBRARIES permission
and the package being installed is a dependency type, allow installation
to proceed with no further action. Otherwise, procees with the normal
flow of using user action.

Bug: 372861622
Test: atest PackageManagerShellCommandInstallTest
Flag: android.content.pm.sdk_dependency_installer
Change-Id: I3ebe5d4c7850cc249cd25522b422f3c678c8c110
parent 4e581df6
Loading
Loading
Loading
Loading
+18 −3
Original line number Diff line number Diff line
@@ -141,6 +141,11 @@ public class ApkLite {
     */
    private final boolean mIsSdkLibrary;

    /**
     * Indicates if this apk is a static library.
     */
    private final boolean mIsStaticLibrary;

    /**
     * List of SDK names used by this apk.
     */
@@ -191,7 +196,7 @@ public class ApkLite {
            Set<String> requiredSplitTypes, Set<String> splitTypes,
            boolean hasDeviceAdminReceiver, boolean isSdkLibrary,
            List<String> usesSdkLibraries, long[] usesSdkLibrariesVersionsMajor,
            String[][] usesSdkLibrariesCertDigests,
            String[][] usesSdkLibrariesCertDigests, boolean isStaticLibrary,
            List<String> usesStaticLibraries, long[] usesStaticLibrariesVersionsMajor,
            String[][] usesStaticLibrariesCertDigests,
            boolean updatableSystem,
@@ -229,6 +234,7 @@ public class ApkLite {
        mRollbackDataPolicy = rollbackDataPolicy;
        mHasDeviceAdminReceiver = hasDeviceAdminReceiver;
        mIsSdkLibrary = isSdkLibrary;
        mIsStaticLibrary = isStaticLibrary;
        mUsesSdkLibraries = usesSdkLibraries;
        mUsesSdkLibrariesVersionsMajor = usesSdkLibrariesVersionsMajor;
        mUsesSdkLibrariesCertDigests = usesSdkLibrariesCertDigests;
@@ -275,6 +281,7 @@ public class ApkLite {
        mRollbackDataPolicy = 0;
        mHasDeviceAdminReceiver = false;
        mIsSdkLibrary = false;
        mIsStaticLibrary = false;
        mUsesSdkLibraries = Collections.emptyList();
        mUsesSdkLibrariesVersionsMajor = null;
        mUsesSdkLibrariesCertDigests = null;
@@ -593,6 +600,14 @@ public class ApkLite {
        return mIsSdkLibrary;
    }

    /**
     * Indicates if this apk is a static library.
     */
    @DataClass.Generated.Member
    public boolean isIsStaticLibrary() {
        return mIsStaticLibrary;
    }

    /**
     * List of SDK names used by this apk.
     */
@@ -662,10 +677,10 @@ public class ApkLite {
    }

    @DataClass.Generated(
            time = 1730202160705L,
            time = 1731589363302L,
            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 @android.annotation.NonNull java.util.List<java.lang.String> mUsesSdkLibraries\nprivate final @android.annotation.Nullable long[] mUsesSdkLibrariesVersionsMajor\nprivate final @android.annotation.Nullable java.lang.String[][] mUsesSdkLibrariesCertDigests\nprivate final @android.annotation.NonNull java.util.List<java.lang.String> mUsesStaticLibraries\nprivate final @android.annotation.Nullable long[] mUsesStaticLibrariesVersions\nprivate final @android.annotation.Nullable java.lang.String[][] mUsesStaticLibrariesCertDigests\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)")
            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 mIsStaticLibrary\nprivate final @android.annotation.NonNull java.util.List<java.lang.String> mUsesSdkLibraries\nprivate final @android.annotation.Nullable long[] mUsesSdkLibrariesVersionsMajor\nprivate final @android.annotation.Nullable java.lang.String[][] mUsesSdkLibrariesCertDigests\nprivate final @android.annotation.NonNull java.util.List<java.lang.String> mUsesStaticLibraries\nprivate final @android.annotation.Nullable long[] mUsesStaticLibrariesVersions\nprivate final @android.annotation.Nullable java.lang.String[][] mUsesStaticLibrariesCertDigests\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() {}

+3 −1
Original line number Diff line number Diff line
@@ -465,6 +465,7 @@ public class ApkLiteParseUtils {
        boolean hasDeviceAdminReceiver = false;

        boolean isSdkLibrary = false;
        boolean isStaticLibrary = false;
        List<String> usesSdkLibraries = new ArrayList<>();
        long[] usesSdkLibrariesVersionsMajor = new long[0];
        String[][] usesSdkLibrariesCertDigests = new String[0][0];
@@ -653,6 +654,7 @@ public class ApkLiteParseUtils {
                                    SharedLibraryInfo.TYPE_SDK_PACKAGE));
                            break;
                        case TAG_STATIC_LIBRARY:
                            isSdkLibrary = true;
                            // Mirrors ParsingPackageUtils#parseStaticLibrary until lite and full
                            // parsing are combined
                            String staticLibName = parser.getAttributeValue(
@@ -806,7 +808,7 @@ public class ApkLiteParseUtils {
                        requiredSystemPropertyValue, minSdkVersion, targetSdkVersion,
                        rollbackDataPolicy, requiredSplitTypes.first, requiredSplitTypes.second,
                        hasDeviceAdminReceiver, isSdkLibrary, usesSdkLibraries,
                        usesSdkLibrariesVersionsMajor, usesSdkLibrariesCertDigests,
                        usesSdkLibrariesVersionsMajor, usesSdkLibrariesCertDigests, isStaticLibrary,
                        usesStaticLibraries, usesStaticLibrariesVersions,
                        usesStaticLibrariesCertDigests, updatableSystem, emergencyInstaller,
                        declaredLibraries));
+15 −2
Original line number Diff line number Diff line
@@ -114,6 +114,10 @@ public class PackageLite {
     * Indicates if this package is a sdk.
     */
    private final boolean mIsSdkLibrary;
    /**
     * Indicates if this package is a static library.
     */
    private final boolean mIsStaticLibrary;

    private final @NonNull List<String> mUsesSdkLibraries;

@@ -164,6 +168,7 @@ public class PackageLite {
        mUsesSdkLibraries = baseApk.getUsesSdkLibraries();
        mUsesSdkLibrariesVersionsMajor = baseApk.getUsesSdkLibrariesVersionsMajor();
        mUsesSdkLibrariesCertDigests = baseApk.getUsesSdkLibrariesCertDigests();
        mIsStaticLibrary = baseApk.isIsStaticLibrary();
        mUsesStaticLibraries = baseApk.getUsesStaticLibraries();
        mUsesStaticLibrariesVersions = baseApk.getUsesStaticLibrariesVersions();
        mUsesStaticLibrariesCertDigests = baseApk.getUsesStaticLibrariesCertDigests();
@@ -455,6 +460,14 @@ public class PackageLite {
        return mIsSdkLibrary;
    }

    /**
     * Indicates if this package is a static library.
     */
    @DataClass.Generated.Member
    public boolean isIsStaticLibrary() {
        return mIsStaticLibrary;
    }

    @DataClass.Generated.Member
    public @NonNull List<String> getUsesSdkLibraries() {
        return mUsesSdkLibraries;
@@ -499,10 +512,10 @@ public class PackageLite {
    }

    @DataClass.Generated(
            time = 1730203707341L,
            time = 1731591578587L,
            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.NonNull java.util.List<java.lang.String> mUsesSdkLibraries\nprivate final @android.annotation.Nullable long[] mUsesSdkLibrariesVersionsMajor\nprivate final @android.annotation.Nullable java.lang.String[][] mUsesSdkLibrariesCertDigests\nprivate final @android.annotation.NonNull java.util.List<java.lang.String> mUsesStaticLibraries\nprivate final @android.annotation.Nullable long[] mUsesStaticLibrariesVersions\nprivate final @android.annotation.Nullable java.lang.String[][] mUsesStaticLibrariesCertDigests\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)")
            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 mIsStaticLibrary\nprivate final @android.annotation.NonNull java.util.List<java.lang.String> mUsesSdkLibraries\nprivate final @android.annotation.Nullable long[] mUsesSdkLibrariesVersionsMajor\nprivate final @android.annotation.Nullable java.lang.String[][] mUsesSdkLibrariesCertDigests\nprivate final @android.annotation.NonNull java.util.List<java.lang.String> mUsesStaticLibraries\nprivate final @android.annotation.Nullable long[] mUsesStaticLibrariesVersions\nprivate final @android.annotation.Nullable java.lang.String[][] mUsesStaticLibrariesCertDigests\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() {}

+1 −0
Original line number Diff line number Diff line
@@ -179,6 +179,7 @@
    <uses-permission android:name="android.permission.SET_ORIENTATION" />
    <uses-permission android:name="android.permission.INSTALL_PACKAGES" />
    <uses-permission android:name="android.permission.INSTALL_PACKAGE_UPDATES" />
    <uses-permission android:name="android.permission.INSTALL_DEPENDENCY_SHARED_LIBRARIES" />
    <uses-permission android:name="android.permission.ENFORCE_UPDATE_OWNERSHIP" />
    <uses-permission android:name="android.permission.INSTALL_DPC_PACKAGES" />
    <uses-permission android:name="com.android.permission.USE_INSTALLER_V2" />
+15 −1
Original line number Diff line number Diff line
@@ -1092,6 +1092,12 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
        final boolean isInstallDpcPackagesPermissionGranted = (snapshot.checkUidPermission(
                android.Manifest.permission.INSTALL_DPC_PACKAGES, mInstallerUid)
                == PackageManager.PERMISSION_GRANTED);
        boolean isInstallDependencyPackagesPermissionGranted = false;
        if (Flags.sdkDependencyInstaller()) {
            isInstallDependencyPackagesPermissionGranted = (snapshot.checkUidPermission(
                    android.Manifest.permission.INSTALL_DEPENDENCY_SHARED_LIBRARIES, mInstallerUid)
                    == PackageManager.PERMISSION_GRANTED);
        }
        // Also query the package uid for archived packages, so that the user confirmation
        // dialog can be displayed for updating archived apps.
        final int targetPackageUid = snapshot.getPackageUid(packageName,
@@ -1113,10 +1119,18 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
        final boolean isSelfUpdate = targetPackageUid == mInstallerUid;
        final boolean isEmergencyInstall =
                isEmergencyInstallerEnabled(packageName, snapshot, userId, mInstallerUid);
        boolean isSdkOrStaticLibraryInstall = false;
        synchronized (mLock) {
            if (mPackageLite != null) {
                isSdkOrStaticLibraryInstall =
                        mPackageLite.isIsSdkLibrary() || mPackageLite.isIsStaticLibrary();
            }
        }
        final boolean isPermissionGranted = isInstallPermissionGranted
                || (isUpdatePermissionGranted && isUpdate)
                || (isSelfUpdatePermissionGranted && isSelfUpdate)
                || (isInstallDpcPackagesPermissionGranted && hasDeviceAdminReceiver);
                || (isInstallDpcPackagesPermissionGranted && hasDeviceAdminReceiver)
                || (isInstallDependencyPackagesPermissionGranted && isSdkOrStaticLibraryInstall);
        final boolean isInstallerRoot = (mInstallerUid == Process.ROOT_UID);
        final boolean isInstallerSystem = (mInstallerUid == Process.SYSTEM_UID);
        final boolean isInstallerShell = (mInstallerUid == Process.SHELL_UID);