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

Commit 5c0ed71c authored by Samiul Islam's avatar Samiul Islam Committed by Android (Google) Code Review
Browse files

Merge "Extract uses-sdk-library information into ApkLite" into main

parents 6e84ab4f f0c45329
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -319,6 +319,13 @@ flag {
    is_fixed_read_only: true
}

flag {
    name: "sdk_dependency_installer"
    namespace: "package_manager_service"
    description: "Feature flag to enable installation of missing sdk dependency of app"
    bug: "370822870"
}

flag {
    name: "include_feature_flags_in_package_cacher"
    namespace: "package_manager_service"
+51 −3
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ import android.content.pm.VerifierInfo;
import com.android.internal.util.CollectionUtils;
import com.android.internal.util.DataClass;

import java.util.Collections;
import java.util.List;
import java.util.Set;

@@ -140,6 +141,21 @@ public class ApkLite {
     */
    private final boolean mIsSdkLibrary;

    /**
     * List of SDK names used by this apk.
     */
    private final @NonNull List<String> mUsesSdkLibraries;

    /**
     * List of SDK major versions used by this apk.
     */
    private final @Nullable long[] mUsesSdkLibrariesVersionsMajor;

    /**
     * List of SDK certificates used by this apk.
     */
    private final @Nullable String[][] mUsesSdkLibrariesCertDigests;

    /**
     * Indicates if this system app can be updated.
     */
@@ -167,7 +183,9 @@ public class ApkLite {
            String requiredSystemPropertyName, String requiredSystemPropertyValue,
            int minSdkVersion, int targetSdkVersion, int rollbackDataPolicy,
            Set<String> requiredSplitTypes, Set<String> splitTypes,
            boolean hasDeviceAdminReceiver, boolean isSdkLibrary, boolean updatableSystem,
            boolean hasDeviceAdminReceiver, boolean isSdkLibrary,
            List<String> usesSdkLibraries, long[] usesSdkLibrariesVersionsMajor,
            String[][] usesSdkLibrariesCertDigests, boolean updatableSystem,
            String emergencyInstaller, List<SharedLibraryInfo> declaredLibraries) {
        mPath = path;
        mPackageName = packageName;
@@ -202,6 +220,9 @@ public class ApkLite {
        mRollbackDataPolicy = rollbackDataPolicy;
        mHasDeviceAdminReceiver = hasDeviceAdminReceiver;
        mIsSdkLibrary = isSdkLibrary;
        mUsesSdkLibraries = usesSdkLibraries;
        mUsesSdkLibrariesVersionsMajor = usesSdkLibrariesVersionsMajor;
        mUsesSdkLibrariesCertDigests = usesSdkLibrariesCertDigests;
        mUpdatableSystem = updatableSystem;
        mEmergencyInstaller = emergencyInstaller;
        mArchivedPackage = null;
@@ -242,6 +263,9 @@ public class ApkLite {
        mRollbackDataPolicy = 0;
        mHasDeviceAdminReceiver = false;
        mIsSdkLibrary = false;
        mUsesSdkLibraries = Collections.emptyList();
        mUsesSdkLibrariesVersionsMajor = null;
        mUsesSdkLibrariesCertDigests = null;
        mUpdatableSystem = true;
        mEmergencyInstaller = null;
        mArchivedPackage = archivedPackage;
@@ -554,6 +578,30 @@ public class ApkLite {
        return mIsSdkLibrary;
    }

    /**
     * List of SDK names used by this apk.
     */
    @DataClass.Generated.Member
    public @NonNull List<String> getUsesSdkLibraries() {
        return mUsesSdkLibraries;
    }

    /**
     * List of SDK major versions used by this apk.
     */
    @DataClass.Generated.Member
    public @Nullable long[] getUsesSdkLibrariesVersionsMajor() {
        return mUsesSdkLibrariesVersionsMajor;
    }

    /**
     * List of SDK certificates used by this apk.
     */
    @DataClass.Generated.Member
    public @Nullable String[][] getUsesSdkLibrariesCertDigests() {
        return mUsesSdkLibrariesCertDigests;
    }

    /**
     * Indicates if this system app can be updated.
     */
@@ -584,10 +632,10 @@ public class ApkLite {
    }

    @DataClass.Generated(
            time = 1728333566322L,
            time = 1729247366948L,
            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.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 @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  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() {}

+61 −3
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ import android.content.pm.parsing.result.ParseResult;
import android.content.res.ApkAssets;
import android.content.res.XmlResourceParser;
import android.os.Build;
import android.os.SystemProperties;
import android.os.Trace;
import android.text.TextUtils;
import android.util.ArrayMap;
@@ -44,6 +45,7 @@ import com.android.internal.pm.pkg.component.flags.Flags;
import com.android.internal.util.ArrayUtils;

import libcore.io.IoUtils;
import libcore.util.HexEncoding;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
@@ -88,6 +90,7 @@ public class ApkLiteParseUtils {
    private static final String TAG_USES_SDK = "uses-sdk";
    private static final String TAG_USES_SPLIT = "uses-split";
    private static final String TAG_MANIFEST = "manifest";
    private static final String TAG_USES_SDK_LIBRARY = "uses-sdk-library";
    private static final String TAG_SDK_LIBRARY = "sdk-library";
    private static final int SDK_VERSION = Build.VERSION.SDK_INT;
    private static final String[] SDK_CODENAMES = Build.VERSION.ACTIVE_CODENAMES;
@@ -460,6 +463,9 @@ public class ApkLiteParseUtils {
        boolean hasDeviceAdminReceiver = false;

        boolean isSdkLibrary = false;
        List<String> usesSdkLibraries = new ArrayList<>();
        long[] usesSdkLibrariesVersionsMajor = new long[0];
        String[][] usesSdkLibrariesCertDigests = new String[0][0];
        List<SharedLibraryInfo> declaredLibraries = new ArrayList<>();

        // Only search the tree when the tag is the direct child of <manifest> tag
@@ -523,6 +529,57 @@ public class ApkLiteParseUtils {
                            hasDeviceAdminReceiver |= isDeviceAdminReceiver(parser,
                                    hasBindDeviceAdminPermission);
                            break;
                        case TAG_USES_SDK_LIBRARY:
                            String usesSdkLibName = parser.getAttributeValue(
                                    ANDROID_RES_NAMESPACE, "name");
                            long usesSdkLibVersionMajor = parser.getAttributeIntValue(
                                    ANDROID_RES_NAMESPACE, "versionMajor", -1);
                            String usesSdkCertDigest = parser.getAttributeValue(
                                     ANDROID_RES_NAMESPACE, "certDigest");

                            if (usesSdkLibName == null || usesSdkLibName.isBlank()
                                    || usesSdkLibVersionMajor < 0) {
                                return input.error(
                                        PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED,
                                        "Bad uses-sdk-library declaration name: "
                                                + usesSdkLibName
                                                + " version: " + usesSdkLibVersionMajor);
                            }

                            if (usesSdkLibraries.contains(usesSdkLibName)) {
                                return input.error(
                                        PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED,
                                        "Bad uses-sdk-library declaration. Depending on"
                                                + " multiple versions of SDK library: "
                                                + usesSdkLibName);
                            }

                            usesSdkLibraries.add(usesSdkLibName);
                            usesSdkLibrariesVersionsMajor = ArrayUtils.appendLong(
                                    usesSdkLibrariesVersionsMajor, usesSdkLibVersionMajor,
                                    /*allowDuplicates=*/ true);

                            // We allow ":" delimiters in the SHA declaration as this is the format
                            // emitted by the certtool making it easy for developers to copy/paste.
                            // TODO(372862145): Add test for this replacement
                            usesSdkCertDigest = usesSdkCertDigest.replace(":", "").toLowerCase();

                            if ("".equals(usesSdkCertDigest)) {
                                // Test-only uses-sdk-library empty certificate digest override.
                                usesSdkCertDigest = SystemProperties.get(
                                        "debug.pm.uses_sdk_library_default_cert_digest", "");
                                // Validate the overridden digest.
                                try {
                                    HexEncoding.decode(usesSdkCertDigest, false);
                                } catch (IllegalArgumentException e) {
                                    usesSdkCertDigest = "";
                                }
                            }
                            // TODO(372862145): Add support for multiple signer
                            usesSdkLibrariesCertDigests = ArrayUtils.appendElement(String[].class,
                                    usesSdkLibrariesCertDigests, new String[]{usesSdkCertDigest},
                                    /*allowDuplicates=*/ true);
                            break;
                        case TAG_SDK_LIBRARY:
                            isSdkLibrary = true;
                            // Mirrors ParsingPackageUtils#parseSdkLibrary until lite and full
@@ -534,7 +591,7 @@ public class ApkLiteParseUtils {
                            if (sdkLibName == null || sdkLibVersionMajor < 0) {
                                return input.error(
                                        PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED,
                                        "Bad uses-sdk-library declaration name: " + sdkLibName
                                        "Bad sdk-library declaration name: " + sdkLibName
                                                + " version: " + sdkLibVersionMajor);
                            }
                            declaredLibraries.add(new SharedLibraryInfo(
@@ -694,8 +751,9 @@ public class ApkLiteParseUtils {
                        overlayIsStatic, overlayPriority, requiredSystemPropertyName,
                        requiredSystemPropertyValue, minSdkVersion, targetSdkVersion,
                        rollbackDataPolicy, requiredSplitTypes.first, requiredSplitTypes.second,
                        hasDeviceAdminReceiver, isSdkLibrary, updatableSystem, emergencyInstaller,
                        declaredLibraries));
                        hasDeviceAdminReceiver, isSdkLibrary, usesSdkLibraries,
                        usesSdkLibrariesVersionsMajor, usesSdkLibrariesCertDigests,
                        updatableSystem, emergencyInstaller, declaredLibraries));
    }

    private static boolean isDeviceAdminReceiver(
+26 −2
Original line number Diff line number Diff line
@@ -115,6 +115,12 @@ public class PackageLite {
     */
    private final boolean mIsSdkLibrary;

    private final @NonNull List<String> mUsesSdkLibraries;

    private final @Nullable long[] mUsesSdkLibrariesVersionsMajor;

    private final @Nullable String[][] mUsesSdkLibrariesCertDigests;

    private final @NonNull List<SharedLibraryInfo> mDeclaredLibraries;

    /**
@@ -149,6 +155,9 @@ public class PackageLite {
        mSplitRequired = (baseApk.isSplitRequired() || hasAnyRequiredSplitTypes());
        mProfileableByShell = baseApk.isProfileableByShell();
        mIsSdkLibrary = baseApk.isIsSdkLibrary();
        mUsesSdkLibraries = baseApk.getUsesSdkLibraries();
        mUsesSdkLibrariesVersionsMajor = baseApk.getUsesSdkLibrariesVersionsMajor();
        mUsesSdkLibrariesCertDigests = baseApk.getUsesSdkLibrariesCertDigests();
        mSplitNames = splitNames;
        mSplitTypes = splitTypes;
        mIsFeatureSplits = isFeatureSplits;
@@ -437,6 +446,21 @@ public class PackageLite {
        return mIsSdkLibrary;
    }

    @DataClass.Generated.Member
    public @NonNull List<String> getUsesSdkLibraries() {
        return mUsesSdkLibraries;
    }

    @DataClass.Generated.Member
    public @Nullable long[] getUsesSdkLibrariesVersionsMajor() {
        return mUsesSdkLibrariesVersionsMajor;
    }

    @DataClass.Generated.Member
    public @Nullable String[][] getUsesSdkLibrariesCertDigests() {
        return mUsesSdkLibrariesCertDigests;
    }

    @DataClass.Generated.Member
    public @NonNull List<SharedLibraryInfo> getDeclaredLibraries() {
        return mDeclaredLibraries;
@@ -451,10 +475,10 @@ public class PackageLite {
    }

    @DataClass.Generated(
            time = 1728333569917L,
            time = 1729248757933L,
            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<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 @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<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() {}

+4 −0
Original line number Diff line number Diff line
@@ -146,6 +146,10 @@ android_test {
        ":BinderProxyCountingTestService",
        ":AppThatUsesAppOps",
        ":AppThatCallsBinderMethods",
        ":HelloWorldSdk1",
        ":HelloWorldUsingSdk1AndSdk1",
        ":HelloWorldUsingSdk1And2",
        ":HelloWorldUsingSdkMalformedNegativeVersion",
    ],
}

Loading