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

Commit b978f45b authored by William Loh's avatar William Loh
Browse files

Extract ASL form APK during install

Bug: 332400370
Test: atest InstallAppMetadataTest
Change-Id: I0145deda589eaea68d76b956e70fd07ea6dbc98e
parent 906de616
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ 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.APP_METADATA_SOURCE_UNKNOWN;
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;
@@ -2210,6 +2211,7 @@ final class InstallPackageHelper {
                    Map<String, PackageManager.Property> properties = parsedPackage.getProperties();
                    if (Flags.aslInApkAppMetadataSource()
                            && properties.containsKey(PROPERTY_ANDROID_SAFETY_LABEL_PATH)) {
                        // ASL file extraction is done in post-install
                        ps.setAppMetadataFilePath(appMetadataFile.getAbsolutePath());
                        ps.setAppMetadataSource(APP_METADATA_SOURCE_APK);
                    } else {
@@ -2809,6 +2811,20 @@ final class InstallPackageHelper {
        }

        if (succeeded) {
            if (Flags.aslInApkAppMetadataSource()
                    && pkgSetting.getAppMetadataSource() == APP_METADATA_SOURCE_APK) {
                if (!PackageManagerServiceUtils.extractAppMetadataFromApk(request.getPkg(),
                        pkgSetting.getAppMetadataFilePath())) {
                    synchronized (mPm.mLock) {
                        PackageSetting setting = mPm.mSettings.getPackageLPr(packageName);
                        if (setting != null) {
                            setting.setAppMetadataFilePath(null)
                                    .setAppMetadataSource(APP_METADATA_SOURCE_UNKNOWN);
                        }
                    }
                }
            }

            // Clear the uid cache after we installed a new package.
            mPm.mPerUidReadTimeoutsCache = null;

+0 −22
Original line number Diff line number Diff line
@@ -19,8 +19,6 @@ import static android.Manifest.permission.MANAGE_DEVICE_ADMINS;
import static android.Manifest.permission.SET_HARMFUL_APP_WARNINGS;
import static android.app.AppOpsManager.MODE_IGNORED;
import static android.app.admin.flags.Flags.crossUserSuspensionEnabledRo;
import static android.content.pm.PackageManager.APP_METADATA_SOURCE_APK;
import static android.content.pm.PackageManager.APP_METADATA_SOURCE_UNKNOWN;
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.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED;
@@ -5232,26 +5230,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService
                return null;
            }
            File file = new File(filePath);
            if (Flags.aslInApkAppMetadataSource() && !file.exists()
                    && ps.getAppMetadataSource() == APP_METADATA_SOURCE_APK) {
                AndroidPackageInternal pkg = ps.getPkg();
                if (pkg == null) {
                    Slog.w(TAG, "Unable to to extract app metadata for " + packageName
                            + ". APK missing from device");
                    return null;
                }
                if (!PackageManagerServiceUtils.extractAppMetadataFromApk(pkg, file)) {
                    if (file.exists()) {
                        file.delete();
                    }
                    synchronized (mLock) {
                        PackageSetting pkgSetting = mSettings.getPackageLPr(packageName);
                        pkgSetting.setAppMetadataFilePath(null);
                        pkgSetting.setAppMetadataSource(APP_METADATA_SOURCE_UNKNOWN);
                    }
                    return null;
                }
            }
            try {
                return ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
            } catch (FileNotFoundException e) {
+7 −1
Original line number Diff line number Diff line
@@ -1570,7 +1570,12 @@ public class PackageManagerServiceUtils {
    /**
     * Extract the app.metadata file from apk.
     */
    public static boolean extractAppMetadataFromApk(AndroidPackage pkg, File appMetadataFile) {
    public static boolean extractAppMetadataFromApk(AndroidPackage pkg,
            String appMetadataFilePath) {
        if (appMetadataFilePath == null) {
            return false;
        }
        File appMetadataFile = new File(appMetadataFilePath);
        Map<String, Property> properties = pkg.getProperties();
        if (!properties.containsKey(PROPERTY_ANDROID_SAFETY_LABEL_PATH)) {
            return false;
@@ -1596,6 +1601,7 @@ public class PackageManagerServiceUtils {
                }
            } catch (Exception e) {
                Slog.e(TAG, e.getMessage());
                appMetadataFile.delete();
            }
        }
        return false;