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

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

Merge "Extract ASL form APK during install" into main

parents 973895c3 b978f45b
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;