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

Commit 32768925 authored by William Loh's avatar William Loh Committed by Android (Google) Code Review
Browse files

Merge "Extract ASL from APK" into main

parents e437c588 39dbb85f
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -421,6 +421,8 @@ public class PackageImpl implements ParsedPackage, AndroidPackageInternal,
    @NonNull
    private String[] mUsesStaticLibrariesSorted;

    private boolean mAppMetadataFileInApk = false;

    @NonNull
    public static PackageImpl forParsing(@NonNull String packageName, @NonNull String baseCodePath,
            @NonNull String codePath, @NonNull TypedArray manifestArray, boolean isCoreApp,
@@ -1063,6 +1065,11 @@ public class PackageImpl implements ParsedPackage, AndroidPackageInternal,
        return memtagMode;
    }

    @Override
    public boolean isAppMetadataFileInApk() {
        return mAppMetadataFileInApk;
    }

    @Nullable
    @Override
    public Bundle getMetaData() {
@@ -2150,6 +2157,12 @@ public class PackageImpl implements ParsedPackage, AndroidPackageInternal,
        return this;
    }

    @Override
    public PackageImpl setAppMetadataFileInApk(boolean fileInApk) {
        mAppMetadataFileInApk = fileInApk;
        return this;
    }

    @Override
    public PackageImpl setMetaData(@Nullable Bundle value) {
        metaData = value;
@@ -3264,6 +3277,7 @@ public class PackageImpl implements ParsedPackage, AndroidPackageInternal,
        dest.writeLong(this.mBooleans);
        dest.writeLong(this.mBooleans2);
        dest.writeBoolean(this.mAllowCrossUidActivitySwitchFromBelow);
        dest.writeBoolean(this.mAppMetadataFileInApk);
    }

    public PackageImpl(Parcel in) {
@@ -3426,6 +3440,7 @@ public class PackageImpl implements ParsedPackage, AndroidPackageInternal,
        this.mBooleans = in.readLong();
        this.mBooleans2 = in.readLong();
        this.mAllowCrossUidActivitySwitchFromBelow = in.readBoolean();
        this.mAppMetadataFileInApk = in.readBoolean();

        assignDerivedFields();
        assignDerivedFields2();
+3 −0
Original line number Diff line number Diff line
@@ -127,4 +127,7 @@ public interface ParsedPackage extends AndroidPackage {
    ParsedPackage setDirectBootAware(boolean directBootAware);

    ParsedPackage setPersistent(boolean persistent);

    /** Retrieves whether the apk contains a app metadata file. */
    boolean isAppMetadataFileInApk();
}
+3 −0
Original line number Diff line number Diff line
@@ -133,6 +133,9 @@ public interface ParsingPackage {
            @Nullable SparseArray<int[]> splitDependencies
    );

    /** Sets whether the apk contains a app metadata file. */
    ParsingPackage setAppMetadataFileInApk(boolean fileInApk);

    ParsingPackage setMetaData(Bundle metaData);

    ParsingPackage setForceQueryable(boolean forceQueryable);
+10 −1
Original line number Diff line number Diff line
@@ -46,6 +46,7 @@ import android.content.pm.ApplicationInfo;
import android.content.pm.ConfigurationInfo;
import android.content.pm.FeatureGroupInfo;
import android.content.pm.FeatureInfo;
import android.content.pm.Flags;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.Property;
@@ -163,6 +164,8 @@ public class ParsingPackageUtils {
     */
    public static final String ANDROID_MANIFEST_FILENAME = "AndroidManifest.xml";

    public static final String APP_METADATA_FILE_NAME = "app.metadata";

    /**
     * Path prefix for apps on expanded storage
     */
@@ -636,6 +639,11 @@ public class ParsingPackageUtils {
                pkg.setSigningDetails(SigningDetails.UNKNOWN);
            }

            if (Flags.aslInApkAppMetadataSource()
                    && ArrayUtils.contains(assets.list(""), APP_METADATA_FILE_NAME)) {
                pkg.setAppMetadataFileInApk(true);
            }

            return input.success(pkg);
        } catch (Exception e) {
            return input.error(INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION,
@@ -686,7 +694,8 @@ public class ParsingPackageUtils {
     */
    private ParseResult<ParsingPackage> parseBaseApk(ParseInput input, String apkPath,
            String codePath, Resources res, XmlResourceParser parser, int flags,
            boolean shouldSkipComponents) throws XmlPullParserException, IOException {
            boolean shouldSkipComponents)
            throws XmlPullParserException, IOException {
        final String splitName;
        final String pkgName;

+11 −3
Original line number Diff line number Diff line
@@ -17,6 +17,8 @@
package com.android.server.pm;

import static android.content.pm.Flags.disallowSdkLibsToBeApps;
import static android.content.pm.PackageManager.APP_METADATA_SOURCE_APK;
import static android.content.pm.PackageManager.APP_METADATA_SOURCE_INSTALLER;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
import static android.content.pm.PackageManager.INSTALL_FAILED_ALREADY_EXISTS;
@@ -43,11 +45,11 @@ 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.internal.pm.pkg.parsing.ParsingPackageUtils.APP_METADATA_FILE_NAME;
import static com.android.server.pm.DexOptHelper.useArtService;
import static com.android.server.pm.InstructionSets.getAppDexInstructionSets;
import static com.android.server.pm.InstructionSets.getDexCodeInstructionSet;
import static com.android.server.pm.InstructionSets.getPreferredInstructionSet;
import static com.android.server.pm.PackageManagerService.APP_METADATA_FILE_NAME;
import static com.android.server.pm.PackageManagerService.DEBUG_COMPRESSION;
import static com.android.server.pm.PackageManagerService.DEBUG_INSTALL;
import static com.android.server.pm.PackageManagerService.DEBUG_PACKAGE_SCANNING;
@@ -2225,12 +2227,18 @@ final class InstallPackageHelper {
                if (appMetadataFile.exists()) {
                    ps.setAppMetadataFilePath(appMetadataFile.getAbsolutePath());
                    if (Flags.aslInApkAppMetadataSource()) {
                        ps.setAppMetadataSource(PackageManager.APP_METADATA_SOURCE_INSTALLER);
                        ps.setAppMetadataSource(APP_METADATA_SOURCE_INSTALLER);
                    }
                } else {
                    if (Flags.aslInApkAppMetadataSource()
                            && parsedPackage.isAppMetadataFileInApk()) {
                        ps.setAppMetadataFilePath(appMetadataFile.getAbsolutePath());
                        ps.setAppMetadataSource(APP_METADATA_SOURCE_APK);
                    } else {
                        ps.setAppMetadataFilePath(null);
                    }
                }
            }
            if (installRequest.getReturnCode() == PackageManager.INSTALL_SUCCEEDED) {
                // If this is an archival installation then we'll initialize the archive status,
                // while also marking package as not installed.
Loading