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

Commit 39dbb85f authored by William Loh's avatar William Loh
Browse files

Extract ASL from APK

ASLs in APKs will only extracted if no app metadata is provided by the
installer. The ASL file must be placed in the assets folder of the APK
as "app.metadata".

Bug: 323510649
Test: atest InstallAppMetadataTest
Change-Id: Iff6a1c00069b22153d864eb6bc77662a37e5dfc0
parent 1d8fc144
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;
@@ -2207,12 +2209,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