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

Commit 390c749b authored by Joanne Chung's avatar Joanne Chung
Browse files

Do not parse components when installing sdk-library package

Bug: 295843617
Test: manual test with sample (ag/24677424). No launcher icon
is shown and components cannot be resolved.
Test: atest PackageManagerShellCommandInstallTest (with/without flag)
Test: atest atest SdkSandboxManagerServiceUnitTest (enabled)
Test: atest SdkSandboxManagerTest (enabled)

Change-Id: I8c0005484d6b0d08e4806a04a36a12353606191e
parent 1d9f1a6e
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ flag {
    namespace: "package_manager_service"
    description: "Feature flag to enable the prevent sdk-library be an application."
    bug: "295843617"
    is_fixed_read_only: true
}

flag {
+32 −14
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.server.pm.pkg.parsing;

import static android.content.pm.ActivityInfo.FLAG_SUPPORTS_PICTURE_IN_PICTURE;
import static android.content.pm.ActivityInfo.RESIZE_MODE_UNRESIZEABLE;
import static android.content.pm.Flags.preventSdkLibApp;
import static android.content.pm.PackageManager.INSTALL_FAILED_INVALID_APK;
import static android.content.pm.PackageManager.INSTALL_PARSE_FAILED_BAD_MANIFEST;
import static android.content.pm.PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES;
@@ -403,8 +404,9 @@ public class ParsingPackageUtils {

        try {
            final File baseApk = new File(lite.getBaseApkPath());
            boolean shouldSkipComponents = lite.isIsSdkLibrary() && preventSdkLibApp();
            final ParseResult<ParsingPackage> result = parseBaseApk(input, baseApk,
                    lite.getPath(), assetLoader, flags);
                    lite.getPath(), assetLoader, flags, shouldSkipComponents);
            if (result.isError()) {
                return input.error(result);
            }
@@ -456,10 +458,11 @@ public class ParsingPackageUtils {
        final PackageLite lite = liteResult.getResult();
        final SplitAssetLoader assetLoader = new DefaultSplitAssetLoader(lite, flags);
        try {
            boolean shouldSkipComponents =  lite.isIsSdkLibrary() && preventSdkLibApp();
            final ParseResult<ParsingPackage> result = parseBaseApk(input,
                    apkFile,
                    apkFile.getCanonicalPath(),
                    assetLoader, flags);
                    assetLoader, flags, shouldSkipComponents);
            if (result.isError()) {
                return input.error(result);
            }
@@ -594,7 +597,8 @@ public class ParsingPackageUtils {
    }

    private ParseResult<ParsingPackage> parseBaseApk(ParseInput input, File apkFile,
            String codePath, SplitAssetLoader assetLoader, int flags) {
            String codePath, SplitAssetLoader assetLoader, int flags,
            boolean shouldSkipComponents) {
        final String apkPath = apkFile.getAbsolutePath();

        final String volumeUuid = getVolumeUuid(apkPath);
@@ -619,7 +623,7 @@ public class ParsingPackageUtils {
            final Resources res = new Resources(assets, mDisplayMetrics, null);

            ParseResult<ParsingPackage> result = parseBaseApk(input, apkPath, codePath, res,
                    parser, flags);
                    parser, flags, shouldSkipComponents);
            if (result.isError()) {
                return input.error(result.getErrorCode(),
                        apkPath + " (at " + parser.getPositionDescription() + "): "
@@ -719,11 +723,12 @@ public class ParsingPackageUtils {
     * @param res     The resources from which to resolve values
     * @param parser  The manifest parser
     * @param flags   Flags how to parse
     * @param shouldSkipComponents If the package is a sdk-library
     * @return Parsed package or null on error.
     */
    private ParseResult<ParsingPackage> parseBaseApk(ParseInput input, String apkPath,
            String codePath, Resources res, XmlResourceParser parser, int flags)
            throws XmlPullParserException, IOException {
            String codePath, Resources res, XmlResourceParser parser, int flags,
            boolean shouldSkipComponents) throws XmlPullParserException, IOException {
        final String splitName;
        final String pkgName;

@@ -751,7 +756,8 @@ public class ParsingPackageUtils {
            final ParsingPackage pkg = mCallback.startParsingPackage(
                    pkgName, apkPath, codePath, manifestArray, isCoreApp);
            final ParseResult<ParsingPackage> result =
                    parseBaseApkTags(input, pkg, manifestArray, res, parser, flags);
                    parseBaseApkTags(input, pkg, manifestArray, res, parser, flags,
                            shouldSkipComponents);
            if (result.isError()) {
                return result;
            }
@@ -987,10 +993,9 @@ public class ParsingPackageUtils {
                return ParsingUtils.unknownTag("<application>", pkg, parser, input);
        }
    }

    private ParseResult<ParsingPackage> parseBaseApkTags(ParseInput input, ParsingPackage pkg,
            TypedArray sa, Resources res, XmlResourceParser parser, int flags)
            throws XmlPullParserException, IOException {
            TypedArray sa, Resources res, XmlResourceParser parser, int flags,
            boolean shouldSkipComponents) throws XmlPullParserException, IOException {
        ParseResult<ParsingPackage> sharedUserResult = parseSharedUser(input, pkg, sa);
        if (sharedUserResult.isError()) {
            return sharedUserResult;
@@ -1027,7 +1032,8 @@ public class ParsingPackageUtils {
                    }
                } else {
                    foundApp = true;
                    result = parseBaseApplication(input, pkg, res, parser, flags);
                    result = parseBaseApplication(input, pkg, res, parser, flags,
                            shouldSkipComponents);
                }
            } else {
                result = parseBaseApkTag(tagName, input, pkg, res, parser, flags);
@@ -1972,8 +1978,8 @@ public class ParsingPackageUtils {
     * code moves around.
     */
    private ParseResult<ParsingPackage> parseBaseApplication(ParseInput input,
            ParsingPackage pkg, Resources res, XmlResourceParser parser, int flags)
            throws XmlPullParserException, IOException {
            ParsingPackage pkg, Resources res, XmlResourceParser parser, int flags,
            boolean shouldSkipComponents) throws XmlPullParserException, IOException {
        final String pkgName = pkg.getPackageName();
        int targetSdk = pkg.getTargetSdkVersion();

@@ -2213,6 +2219,9 @@ public class ParsingPackageUtils {
                    isActivity = true;
                    // fall-through
                case "receiver":
                    if (shouldSkipComponents) {
                        continue;
                    }
                    ParseResult<ParsedActivity> activityResult =
                            ParsedActivityUtils.parseActivityOrReceiver(mSeparateProcesses, pkg,
                                    res, parser, flags, sUseRoundIcon, null /*defaultSplitName*/,
@@ -2232,6 +2241,9 @@ public class ParsingPackageUtils {
                    result = activityResult;
                    break;
                case "service":
                    if (shouldSkipComponents) {
                        continue;
                    }
                    ParseResult<ParsedService> serviceResult =
                            ParsedServiceUtils.parseService(mSeparateProcesses, pkg, res, parser,
                                    flags, sUseRoundIcon, null /*defaultSplitName*/,
@@ -2245,6 +2257,9 @@ public class ParsingPackageUtils {
                    result = serviceResult;
                    break;
                case "provider":
                    if (shouldSkipComponents) {
                        continue;
                    }
                    ParseResult<ParsedProvider> providerResult =
                            ParsedProviderUtils.parseProvider(mSeparateProcesses, pkg, res, parser,
                                    flags, sUseRoundIcon, null /*defaultSplitName*/,
@@ -2256,6 +2271,9 @@ public class ParsingPackageUtils {
                    result = providerResult;
                    break;
                case "activity-alias":
                    if (shouldSkipComponents) {
                        continue;
                    }
                    activityResult = ParsedActivityUtils.parseActivityAlias(pkg, res,
                            parser, sUseRoundIcon, null /*defaultSplitName*/,
                            input);
@@ -2414,7 +2432,7 @@ public class ParsingPackageUtils {
    /**
     * For parsing non-MainComponents. Main ones have an order and some special handling which is
     * done directly in {@link #parseBaseApplication(ParseInput, ParsingPackage, Resources,
     * XmlResourceParser, int)}.
     * XmlResourceParser, int, boolean)}.
     */
    private ParseResult parseBaseAppChildTag(ParseInput input, String tag, ParsingPackage pkg,
            Resources res, XmlResourceParser parser, int flags)