diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 15ea4b53083d6..f796aabee2d18 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -1302,6 +1302,7 @@ public abstract class PackageManager { DELETE_ALL_USERS, DELETE_SYSTEM_APP, DELETE_DONT_KILL_APP, + DELETE_CHATTY, }) @Retention(RetentionPolicy.SOURCE) public @interface DeleteFlags {} @@ -1342,6 +1343,14 @@ public abstract class PackageManager { */ public static final int DELETE_DONT_KILL_APP = 0x00000008; + /** + * Flag parameter for {@link #deletePackage} to indicate that package deletion + * should be chatty. + * + * @hide + */ + public static final int DELETE_CHATTY = 0x80000000; + /** * Return code for when package deletion succeeds. This is passed to the * {@link IPackageDeleteObserver} if the system succeeded in deleting the diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index d9ac6818975c6..68bb5620de856 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -42,6 +42,7 @@ import static android.os.Build.VERSION_CODES.O; import static android.os.Trace.TRACE_TAG_PACKAGE_MANAGER; import static android.view.WindowManager.LayoutParams.ROTATION_ANIMATION_UNSPECIFIED; +import android.annotation.IntDef; import android.annotation.IntRange; import android.annotation.NonNull; import android.annotation.Nullable; @@ -107,6 +108,8 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.lang.reflect.Constructor; import java.security.GeneralSecurityException; import java.security.KeyFactory; @@ -818,22 +821,33 @@ public class PackageParser { } } - public static final int PARSE_IS_SYSTEM = 1 << 0; - public static final int PARSE_CHATTY = 1 << 1; - public static final int PARSE_MUST_BE_APK = 1 << 2; - public static final int PARSE_IGNORE_PROCESSES = 1 << 3; - public static final int PARSE_FORWARD_LOCK = 1 << 4; - public static final int PARSE_EXTERNAL_STORAGE = 1 << 5; - public static final int PARSE_IS_SYSTEM_DIR = 1 << 6; - public static final int PARSE_IS_PRIVILEGED = 1 << 7; - public static final int PARSE_COLLECT_CERTIFICATES = 1 << 8; - public static final int PARSE_TRUSTED_OVERLAY = 1 << 9; - public static final int PARSE_ENFORCE_CODE = 1 << 10; - /** @deprecated remove when fixing b/34761192 */ + public static final int PARSE_MUST_BE_APK = 1 << 0; + public static final int PARSE_IGNORE_PROCESSES = 1 << 1; + public static final int PARSE_FORWARD_LOCK = 1 << 2; + public static final int PARSE_EXTERNAL_STORAGE = 1 << 3; + public static final int PARSE_IS_SYSTEM_DIR = 1 << 4; + public static final int PARSE_COLLECT_CERTIFICATES = 1 << 5; + public static final int PARSE_ENFORCE_CODE = 1 << 6; + public static final int PARSE_FORCE_SDK = 1 << 7; + /** @deprecated remove when fixing b/68860689 */ @Deprecated - public static final int PARSE_IS_EPHEMERAL = 1 << 11; - public static final int PARSE_FORCE_SDK = 1 << 12; - public static final int PARSE_IS_OEM = 1 << 13; + public static final int PARSE_IS_EPHEMERAL = 1 << 8; + public static final int PARSE_CHATTY = 1 << 31; + + @IntDef(flag = true, prefix = { "PARSE_" }, value = { + PARSE_CHATTY, + PARSE_COLLECT_CERTIFICATES, + PARSE_ENFORCE_CODE, + PARSE_EXTERNAL_STORAGE, + PARSE_FORCE_SDK, + PARSE_FORWARD_LOCK, + PARSE_IGNORE_PROCESSES, + PARSE_IS_EPHEMERAL, + PARSE_IS_SYSTEM_DIR, + PARSE_MUST_BE_APK, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface ParseFlags {} private static final Comparator sSplitNameComparator = new SplitNameComparator(); @@ -1507,7 +1521,7 @@ public class PackageParser { * populating {@link Package#mSignatures}. Also asserts that all APK * contents are signed correctly and consistently. */ - public static void collectCertificates(Package pkg, int parseFlags) + public static void collectCertificates(Package pkg, @ParseFlags int parseFlags) throws PackageParserException { collectCertificatesInternal(pkg, parseFlags); final int childCount = (pkg.childPackages != null) ? pkg.childPackages.size() : 0; @@ -1519,7 +1533,7 @@ public class PackageParser { } } - private static void collectCertificatesInternal(Package pkg, int parseFlags) + private static void collectCertificatesInternal(Package pkg, @ParseFlags int parseFlags) throws PackageParserException { pkg.mCertificates = null; pkg.mSignatures = null; @@ -1539,7 +1553,7 @@ public class PackageParser { } } - private static void collectCertificates(Package pkg, File apkFile, int parseFlags) + private static void collectCertificates(Package pkg, File apkFile, @ParseFlags int parseFlags) throws PackageParserException { final String apkPath = apkFile.getAbsolutePath(); @@ -2454,7 +2468,7 @@ public class PackageParser { sa.recycle(); - if (name != null && (flags&PARSE_IS_SYSTEM) != 0) { + if (name != null) { if (pkg.protectedBroadcasts == null) { pkg.protectedBroadcasts = new ArrayList(); } @@ -3255,9 +3269,6 @@ public class PackageParser { com.android.internal.R.styleable.AndroidManifestPermissionGroup_permissionGroupFlags, 0); perm.info.priority = sa.getInt( com.android.internal.R.styleable.AndroidManifestPermissionGroup_priority, 0); - if (perm.info.priority > 0 && (flags&PARSE_IS_SYSTEM) == 0) { - perm.info.priority = 0; - } sa.recycle(); @@ -3563,17 +3574,14 @@ public class PackageParser { ai.descriptionRes = sa.getResourceId( com.android.internal.R.styleable.AndroidManifestApplication_description, 0); - if ((flags&PARSE_IS_SYSTEM) != 0) { - if (sa.getBoolean( - com.android.internal.R.styleable.AndroidManifestApplication_persistent, - false)) { - // Check if persistence is based on a feature being present - final String requiredFeature = sa.getNonResourceString( - com.android.internal.R.styleable. - AndroidManifestApplication_persistentWhenFeatureAvailable); - if (requiredFeature == null || mCallback.hasFeature(requiredFeature)) { - ai.flags |= ApplicationInfo.FLAG_PERSISTENT; - } + if (sa.getBoolean( + com.android.internal.R.styleable.AndroidManifestApplication_persistent, + false)) { + // Check if persistence is based on a feature being present + final String requiredFeature = sa.getNonResourceString(com.android.internal.R.styleable + .AndroidManifestApplication_persistentWhenFeatureAvailable); + if (requiredFeature == null || mCallback.hasFeature(requiredFeature)) { + ai.flags |= ApplicationInfo.FLAG_PERSISTENT; } } @@ -4443,13 +4451,6 @@ public class PackageParser { if (sa.getBoolean(R.styleable.AndroidManifestActivity_singleUser, false)) { a.info.flags |= ActivityInfo.FLAG_SINGLE_USER; - if (a.info.exported && (flags & PARSE_IS_PRIVILEGED) == 0) { - Slog.w(TAG, "Activity exported request ignored due to singleUser: " - + a.className + " at " + mArchiveSourcePath + " " - + parser.getPositionDescription()); - a.info.exported = false; - setExported = true; - } } a.info.encryptionAware = a.info.directBootAware = sa.getBoolean( @@ -5038,12 +5039,6 @@ public class PackageParser { com.android.internal.R.styleable.AndroidManifestProvider_singleUser, false)) { p.info.flags |= ProviderInfo.FLAG_SINGLE_USER; - if (p.info.exported && (flags & PARSE_IS_PRIVILEGED) == 0) { - Slog.w(TAG, "Provider exported request ignored due to singleUser: " - + p.className + " at " + mArchiveSourcePath + " " - + parser.getPositionDescription()); - p.info.exported = false; - } } p.info.encryptionAware = p.info.directBootAware = sa.getBoolean( @@ -5365,13 +5360,6 @@ public class PackageParser { com.android.internal.R.styleable.AndroidManifestService_singleUser, false)) { s.info.flags |= ServiceInfo.FLAG_SINGLE_USER; - if (s.info.exported && (flags & PARSE_IS_PRIVILEGED) == 0) { - Slog.w(TAG, "Service exported request ignored due to singleUser: " - + s.className + " at " + mArchiveSourcePath + " " - + parser.getPositionDescription()); - s.info.exported = false; - setExported = true; - } } s.info.encryptionAware = s.info.directBootAware = sa.getBoolean( diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 2e44e7973cab4..b5bcf27184ba7 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -81,8 +81,6 @@ import static android.content.pm.PackageManager.MOVE_FAILED_OPERATION_PENDING; import static android.content.pm.PackageManager.MOVE_FAILED_SYSTEM_PACKAGE; import static android.content.pm.PackageManager.PERMISSION_DENIED; import static android.content.pm.PackageManager.PERMISSION_GRANTED; -import static android.content.pm.PackageParser.PARSE_IS_OEM; -import static android.content.pm.PackageParser.PARSE_IS_PRIVILEGED; import static android.content.pm.PackageParser.isApkFile; import static android.os.Trace.TRACE_TAG_PACKAGE_MANAGER; import static android.os.storage.StorageManager.FLAG_STORAGE_CE; @@ -174,6 +172,7 @@ import android.content.pm.PackageParser.ActivityIntentInfo; import android.content.pm.PackageParser.Package; import android.content.pm.PackageParser.PackageLite; import android.content.pm.PackageParser.PackageParserException; +import android.content.pm.PackageParser.ParseFlags; import android.content.pm.PackageStats; import android.content.pm.PackageUserState; import android.content.pm.ParceledListSlice; @@ -448,27 +447,48 @@ public class PackageManagerService extends IPackageManager.Stub // package apks to install directory. private static final String INSTALL_PACKAGE_SUFFIX = "-"; - static final int SCAN_NO_DEX = 1<<1; - static final int SCAN_FORCE_DEX = 1<<2; - static final int SCAN_UPDATE_SIGNATURE = 1<<3; - static final int SCAN_NEW_INSTALL = 1<<4; - static final int SCAN_UPDATE_TIME = 1<<5; - static final int SCAN_BOOTING = 1<<6; - static final int SCAN_TRUSTED_OVERLAY = 1<<7; - static final int SCAN_DELETE_DATA_ON_FAILURES = 1<<8; - static final int SCAN_REPLACING = 1<<9; - static final int SCAN_REQUIRE_KNOWN = 1<<10; - static final int SCAN_MOVE = 1<<11; - static final int SCAN_INITIAL = 1<<12; - static final int SCAN_CHECK_ONLY = 1<<13; - static final int SCAN_DONT_KILL_APP = 1<<14; - static final int SCAN_IGNORE_FROZEN = 1<<15; - static final int SCAN_FIRST_BOOT_OR_UPGRADE = 1<<16; - static final int SCAN_AS_INSTANT_APP = 1<<17; - static final int SCAN_AS_FULL_APP = 1<<18; - static final int SCAN_AS_VIRTUAL_PRELOAD = 1<<19; - /** Should not be with the scan flags */ - static final int FLAGS_REMOVE_CHATTY = 1<<31; + static final int SCAN_NO_DEX = 1<<0; + static final int SCAN_UPDATE_SIGNATURE = 1<<1; + static final int SCAN_NEW_INSTALL = 1<<2; + static final int SCAN_UPDATE_TIME = 1<<3; + static final int SCAN_BOOTING = 1<<4; + static final int SCAN_TRUSTED_OVERLAY = 1<<5; + static final int SCAN_DELETE_DATA_ON_FAILURES = 1<<6; + static final int SCAN_REQUIRE_KNOWN = 1<<7; + static final int SCAN_MOVE = 1<<8; + static final int SCAN_INITIAL = 1<<9; + static final int SCAN_CHECK_ONLY = 1<<10; + static final int SCAN_DONT_KILL_APP = 1<<11; + static final int SCAN_IGNORE_FROZEN = 1<<12; + static final int SCAN_FIRST_BOOT_OR_UPGRADE = 1<<13; + static final int SCAN_AS_INSTANT_APP = 1<<14; + static final int SCAN_AS_FULL_APP = 1<<15; + static final int SCAN_AS_VIRTUAL_PRELOAD = 1<<16; + static final int SCAN_AS_SYSTEM = 1<<17; + static final int SCAN_AS_PRIVILEGED = 1<<18; + static final int SCAN_AS_OEM = 1<<19; + + @IntDef(flag = true, prefix = { "SCAN_" }, value = { + SCAN_NO_DEX, + SCAN_UPDATE_SIGNATURE, + SCAN_NEW_INSTALL, + SCAN_UPDATE_TIME, + SCAN_BOOTING, + SCAN_TRUSTED_OVERLAY, + SCAN_DELETE_DATA_ON_FAILURES, + SCAN_REQUIRE_KNOWN, + SCAN_MOVE, + SCAN_INITIAL, + SCAN_CHECK_ONLY, + SCAN_DONT_KILL_APP, + SCAN_IGNORE_FROZEN, + SCAN_FIRST_BOOT_OR_UPGRADE, + SCAN_AS_INSTANT_APP, + SCAN_AS_FULL_APP, + SCAN_AS_VIRTUAL_PRELOAD, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface ScanFlags {} private static final String STATIC_SHARED_LIB_DELIMITER = "_"; /** Extension of the compressed packages */ @@ -2515,32 +2535,44 @@ public class PackageManagerService extends IPackageManager.Stub // Collect vendor overlay packages. (Do this before scanning any apps.) // For security and version matching reason, only consider // overlay packages if they reside in the right directory. - scanDirTracedLI(new File(VENDOR_OVERLAY_DIR), mDefParseFlags - | PackageParser.PARSE_IS_SYSTEM - | PackageParser.PARSE_IS_SYSTEM_DIR - | PackageParser.PARSE_TRUSTED_OVERLAY, scanFlags | SCAN_TRUSTED_OVERLAY, 0); + scanDirTracedLI(new File(VENDOR_OVERLAY_DIR), + mDefParseFlags + | PackageParser.PARSE_IS_SYSTEM_DIR, + scanFlags + | SCAN_AS_SYSTEM + | SCAN_TRUSTED_OVERLAY, + 0); mParallelPackageParserCallback.findStaticOverlayPackages(); // Find base frameworks (resource packages without code). - scanDirTracedLI(frameworkDir, mDefParseFlags - | PackageParser.PARSE_IS_SYSTEM - | PackageParser.PARSE_IS_SYSTEM_DIR - | PackageParser.PARSE_IS_PRIVILEGED, - scanFlags | SCAN_NO_DEX, 0); + scanDirTracedLI(frameworkDir, + mDefParseFlags + | PackageParser.PARSE_IS_SYSTEM_DIR, + scanFlags + | SCAN_NO_DEX + | SCAN_AS_SYSTEM + | SCAN_AS_PRIVILEGED, + 0); // Collected privileged system packages. final File privilegedAppDir = new File(Environment.getRootDirectory(), "priv-app"); - scanDirTracedLI(privilegedAppDir, mDefParseFlags - | PackageParser.PARSE_IS_SYSTEM - | PackageParser.PARSE_IS_SYSTEM_DIR - | PackageParser.PARSE_IS_PRIVILEGED, scanFlags, 0); + scanDirTracedLI(privilegedAppDir, + mDefParseFlags + | PackageParser.PARSE_IS_SYSTEM_DIR, + scanFlags + | SCAN_AS_SYSTEM + | SCAN_AS_PRIVILEGED, + 0); // Collect ordinary system packages. final File systemAppDir = new File(Environment.getRootDirectory(), "app"); - scanDirTracedLI(systemAppDir, mDefParseFlags - | PackageParser.PARSE_IS_SYSTEM - | PackageParser.PARSE_IS_SYSTEM_DIR, scanFlags, 0); + scanDirTracedLI(systemAppDir, + mDefParseFlags + | PackageParser.PARSE_IS_SYSTEM_DIR, + scanFlags + | SCAN_AS_SYSTEM, + 0); // Collect all vendor packages. File vendorAppDir = new File("/vendor/app"); @@ -2549,16 +2581,22 @@ public class PackageManagerService extends IPackageManager.Stub } catch (IOException e) { // failed to look up canonical path, continue with original one } - scanDirTracedLI(vendorAppDir, mDefParseFlags - | PackageParser.PARSE_IS_SYSTEM - | PackageParser.PARSE_IS_SYSTEM_DIR, scanFlags, 0); + scanDirTracedLI(vendorAppDir, + mDefParseFlags + | PackageParser.PARSE_IS_SYSTEM_DIR, + scanFlags + | SCAN_AS_SYSTEM, + 0); // Collect all OEM packages. final File oemAppDir = new File(Environment.getOemDirectory(), "app"); - scanDirTracedLI(oemAppDir, mDefParseFlags - | PackageParser.PARSE_IS_SYSTEM - | PackageParser.PARSE_IS_SYSTEM_DIR - | PackageParser.PARSE_IS_OEM, scanFlags, 0); + scanDirTracedLI(oemAppDir, + mDefParseFlags + | PackageParser.PARSE_IS_SYSTEM_DIR, + scanFlags + | SCAN_AS_SYSTEM + | SCAN_AS_OEM, + 0); // Prune any system packages that no longer exist. final List possiblyDeletedUpdatedSystemApps = new ArrayList<>(); @@ -2715,21 +2753,38 @@ public class PackageManagerService extends IPackageManager.Stub logCriticalInfo(Log.WARN, "Expected better " + packageName + " but never showed up; reverting to system"); - int reparseFlags = mDefParseFlags; + final @ParseFlags int reparseFlags; + final @ScanFlags int rescanFlags; if (FileUtils.contains(privilegedAppDir, scanFile)) { - reparseFlags = PackageParser.PARSE_IS_SYSTEM - | PackageParser.PARSE_IS_SYSTEM_DIR - | PackageParser.PARSE_IS_PRIVILEGED; + reparseFlags = + mDefParseFlags | + PackageParser.PARSE_IS_SYSTEM_DIR; + rescanFlags = + scanFlags + | SCAN_AS_SYSTEM + | SCAN_AS_PRIVILEGED; } else if (FileUtils.contains(systemAppDir, scanFile)) { - reparseFlags = PackageParser.PARSE_IS_SYSTEM - | PackageParser.PARSE_IS_SYSTEM_DIR; + reparseFlags = + mDefParseFlags | + PackageParser.PARSE_IS_SYSTEM_DIR; + rescanFlags = + scanFlags + | SCAN_AS_SYSTEM; } else if (FileUtils.contains(vendorAppDir, scanFile)) { - reparseFlags = PackageParser.PARSE_IS_SYSTEM - | PackageParser.PARSE_IS_SYSTEM_DIR; + reparseFlags = + mDefParseFlags | + PackageParser.PARSE_IS_SYSTEM_DIR; + rescanFlags = + scanFlags + | SCAN_AS_SYSTEM; } else if (FileUtils.contains(oemAppDir, scanFile)) { - reparseFlags = PackageParser.PARSE_IS_SYSTEM - | PackageParser.PARSE_IS_SYSTEM_DIR - | PackageParser.PARSE_IS_OEM; + reparseFlags = + mDefParseFlags | + PackageParser.PARSE_IS_SYSTEM_DIR; + rescanFlags = + scanFlags + | SCAN_AS_SYSTEM + | SCAN_AS_OEM; } else { Slog.e(TAG, "Ignoring unexpected fallback path " + scanFile); continue; @@ -2738,7 +2793,7 @@ public class PackageManagerService extends IPackageManager.Stub mSettings.enableSystemPackageLPw(packageName); try { - scanPackageTracedLI(scanFile, reparseFlags, scanFlags, 0, null); + scanPackageTracedLI(scanFile, reparseFlags, rescanFlags, 0, null); } catch (PackageManagerException e) { Slog.e(TAG, "Failed to parse original system package: " + e.getMessage()); @@ -8010,62 +8065,61 @@ public class PackageManagerService extends IPackageManager.Stub Log.d(TAG, "Scanning app dir " + dir + " scanFlags=" + scanFlags + " flags=0x" + Integer.toHexString(parseFlags)); } - ParallelPackageParser parallelPackageParser = new ParallelPackageParser( + try (ParallelPackageParser parallelPackageParser = new ParallelPackageParser( mSeparateProcesses, mOnlyCore, mMetrics, mCacheDir, - mParallelPackageParserCallback); - - // Submit files for parsing in parallel - int fileCount = 0; - for (File file : files) { - final boolean isPackage = (isApkFile(file) || file.isDirectory()) - && !PackageInstallerService.isStageName(file.getName()); - if (!isPackage) { - // Ignore entries which are not packages - continue; - } - parallelPackageParser.submit(file, parseFlags); - fileCount++; - } - - // Process results one by one - for (; fileCount > 0; fileCount--) { - ParallelPackageParser.ParseResult parseResult = parallelPackageParser.take(); - Throwable throwable = parseResult.throwable; - int errorCode = PackageManager.INSTALL_SUCCEEDED; - - if (throwable == null) { - // Static shared libraries have synthetic package names - if (parseResult.pkg.applicationInfo.isStaticSharedLibrary()) { - renameStaticSharedLibraryPackage(parseResult.pkg); + mParallelPackageParserCallback)) { + // Submit files for parsing in parallel + int fileCount = 0; + for (File file : files) { + final boolean isPackage = (isApkFile(file) || file.isDirectory()) + && !PackageInstallerService.isStageName(file.getName()); + if (!isPackage) { + // Ignore entries which are not packages + continue; } - try { - if (errorCode == PackageManager.INSTALL_SUCCEEDED) { - scanPackageLI(parseResult.pkg, parseResult.scanFile, parseFlags, scanFlags, - currentTime, null); + parallelPackageParser.submit(file, parseFlags); + fileCount++; + } + + // Process results one by one + for (; fileCount > 0; fileCount--) { + ParallelPackageParser.ParseResult parseResult = parallelPackageParser.take(); + Throwable throwable = parseResult.throwable; + int errorCode = PackageManager.INSTALL_SUCCEEDED; + + if (throwable == null) { + // Static shared libraries have synthetic package names + if (parseResult.pkg.applicationInfo.isStaticSharedLibrary()) { + renameStaticSharedLibraryPackage(parseResult.pkg); } - } catch (PackageManagerException e) { + try { + if (errorCode == PackageManager.INSTALL_SUCCEEDED) { + scanPackageLI(parseResult.pkg, parseResult.scanFile, parseFlags, scanFlags, + currentTime, null); + } + } catch (PackageManagerException e) { + errorCode = e.error; + Slog.w(TAG, "Failed to scan " + parseResult.scanFile + ": " + e.getMessage()); + } + } else if (throwable instanceof PackageParser.PackageParserException) { + PackageParser.PackageParserException e = (PackageParser.PackageParserException) + throwable; errorCode = e.error; - Slog.w(TAG, "Failed to scan " + parseResult.scanFile + ": " + e.getMessage()); + Slog.w(TAG, "Failed to parse " + parseResult.scanFile + ": " + e.getMessage()); + } else { + throw new IllegalStateException("Unexpected exception occurred while parsing " + + parseResult.scanFile, throwable); } - } else if (throwable instanceof PackageParser.PackageParserException) { - PackageParser.PackageParserException e = (PackageParser.PackageParserException) - throwable; - errorCode = e.error; - Slog.w(TAG, "Failed to parse " + parseResult.scanFile + ": " + e.getMessage()); - } else { - throw new IllegalStateException("Unexpected exception occurred while parsing " - + parseResult.scanFile, throwable); - } - // Delete invalid userdata apps - if ((parseFlags & PackageParser.PARSE_IS_SYSTEM) == 0 && - errorCode == PackageManager.INSTALL_FAILED_INVALID_APK) { - logCriticalInfo(Log.WARN, - "Deleting invalid package at " + parseResult.scanFile); - removeCodePathLI(parseResult.scanFile); + // Delete invalid userdata apps + if ((scanFlags & SCAN_AS_SYSTEM) == 0 && + errorCode == PackageManager.INSTALL_FAILED_INVALID_APK) { + logCriticalInfo(Log.WARN, + "Deleting invalid package at " + parseResult.scanFile); + removeCodePathLI(parseResult.scanFile); + } } } - parallelPackageParser.close(); } public static void reportSettingsProblem(int priority, String msg) { @@ -8073,7 +8127,7 @@ public class PackageManagerService extends IPackageManager.Stub } private void collectCertificatesLI(PackageSetting ps, PackageParser.Package pkg, File srcFile, - final int policyFlags) throws PackageManagerException { + final @ParseFlags int parseFlags) throws PackageManagerException { // When upgrading from pre-N MR1, verify the package time stamp using the package // directory and not the APK file. final long lastModifiedTime = mIsPreNMR1Upgrade @@ -8107,7 +8161,7 @@ public class PackageManagerService extends IPackageManager.Stub try { Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "collectCertificates"); - PackageParser.collectCertificates(pkg, policyFlags); + PackageParser.collectCertificates(pkg, parseFlags); } catch (PackageParserException e) { throw PackageManagerException.from(e); } finally { @@ -8142,10 +8196,6 @@ public class PackageManagerService extends IPackageManager.Stub pp.setDisplayMetrics(mMetrics); pp.setCallback(mPackageParserCallback); - if ((scanFlags & SCAN_TRUSTED_OVERLAY) != 0) { - parseFlags |= PackageParser.PARSE_TRUSTED_OVERLAY; - } - Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "parsePackage"); final PackageParser.Package pkg; try { @@ -8169,8 +8219,9 @@ public class PackageManagerService extends IPackageManager.Stub * @throws PackageManagerException on a parse error. */ private PackageParser.Package scanPackageLI(PackageParser.Package pkg, File scanFile, - final int policyFlags, int scanFlags, long currentTime, @Nullable UserHandle user) - throws PackageManagerException { + final @ParseFlags int parseFlags, @ScanFlags int scanFlags, long currentTime, + @Nullable UserHandle user) + throws PackageManagerException { // If the package has children and this is the first dive in the function // we scan the package with the SCAN_CHECK_ONLY flag set to see whether all // packages (parent and children) would be successfully scanned before the @@ -8185,20 +8236,20 @@ public class PackageManagerService extends IPackageManager.Stub } // Scan the parent - PackageParser.Package scannedPkg = scanPackageInternalLI(pkg, scanFile, policyFlags, + PackageParser.Package scannedPkg = scanPackageInternalLI(pkg, scanFile, parseFlags, scanFlags, currentTime, user); // Scan the children final int childCount = (pkg.childPackages != null) ? pkg.childPackages.size() : 0; for (int i = 0; i < childCount; i++) { PackageParser.Package childPackage = pkg.childPackages.get(i); - scanPackageInternalLI(childPackage, scanFile, policyFlags, scanFlags, + scanPackageInternalLI(childPackage, scanFile, parseFlags, scanFlags, currentTime, user); } if ((scanFlags & SCAN_CHECK_ONLY) != 0) { - return scanPackageLI(pkg, scanFile, policyFlags, scanFlags, currentTime, user); + return scanPackageLI(pkg, scanFile, parseFlags, scanFlags, currentTime, user); } return scannedPkg; @@ -8209,8 +8260,9 @@ public class PackageManagerService extends IPackageManager.Stub * @throws PackageManagerException on a parse error. */ private PackageParser.Package scanPackageInternalLI(PackageParser.Package pkg, File scanFile, - int policyFlags, int scanFlags, long currentTime, @Nullable UserHandle user) - throws PackageManagerException { + @ParseFlags int parseFlags, @ScanFlags int scanFlags, long currentTime, + @Nullable UserHandle user) + throws PackageManagerException { PackageSetting ps = null; PackageSetting updatedPkg; // reader @@ -8236,7 +8288,7 @@ public class PackageManagerService extends IPackageManager.Stub // may need to remove disabled child packages on the system partition // or may need to not add child packages if the parent apk is updated // on the data partition and no longer defines this child package. - if ((policyFlags & PackageParser.PARSE_IS_SYSTEM) != 0) { + if ((scanFlags & SCAN_AS_SYSTEM) != 0) { // If this is a parent package for an updated system app and this system // app got an OTA update which no longer defines some of the child packages // we have to prune them from the disabled system packages. @@ -8265,8 +8317,7 @@ public class PackageManagerService extends IPackageManager.Stub } final boolean isUpdatedPkg = updatedPkg != null; - final boolean isUpdatedSystemPkg = isUpdatedPkg - && (policyFlags & PackageParser.PARSE_IS_SYSTEM) != 0; + final boolean isUpdatedSystemPkg = isUpdatedPkg && (scanFlags & SCAN_AS_SYSTEM) != 0; boolean isUpdatedPkgBetter = false; // First check if this is a system package that may involve an update if (isUpdatedSystemPkg) { @@ -8353,7 +8404,7 @@ public class PackageManagerService extends IPackageManager.Stub String resourcePath = null; String baseResourcePath = null; - if ((policyFlags & PackageParser.PARSE_FORWARD_LOCK) != 0 && !isUpdatedPkgBetter) { + if ((parseFlags & PackageParser.PARSE_FORWARD_LOCK) != 0 && !isUpdatedPkgBetter) { if (ps != null && ps.resourcePathString != null) { resourcePath = ps.resourcePathString; baseResourcePath = ps.resourcePathString; @@ -8394,25 +8445,24 @@ public class PackageManagerService extends IPackageManager.Stub } if (isUpdatedPkg) { - // An updated system app will not have the PARSE_IS_SYSTEM flag set - // initially - policyFlags |= PackageParser.PARSE_IS_SYSTEM; + // updated system applications don't initially have the SCAN_AS_SYSTEM flag set + scanFlags |= SCAN_AS_SYSTEM; - // An updated privileged app will not have the PARSE_IS_PRIVILEGED + // An updated privileged application will not have the PARSE_IS_PRIVILEGED // flag set initially if ((updatedPkg.pkgPrivateFlags & ApplicationInfo.PRIVATE_FLAG_PRIVILEGED) != 0) { - policyFlags |= PackageParser.PARSE_IS_PRIVILEGED; + scanFlags |= SCAN_AS_PRIVILEGED; } // An updated OEM app will not have the PARSE_IS_OEM // flag set initially if ((updatedPkg.pkgPrivateFlags & ApplicationInfo.PRIVATE_FLAG_OEM) != 0) { - policyFlags |= PackageParser.PARSE_IS_OEM; + scanFlags |= SCAN_AS_OEM; } } // Verify certificates against what was last scanned - collectCertificatesLI(ps, pkg, scanFile, policyFlags); + collectCertificatesLI(ps, pkg, scanFile, parseFlags); /* * A new system app appeared, but we already had a non-system one of the @@ -8420,7 +8470,7 @@ public class PackageManagerService extends IPackageManager.Stub */ boolean shouldHideSystemApp = false; if (!isUpdatedPkg && ps != null - && (policyFlags & PackageParser.PARSE_IS_SYSTEM_DIR) != 0 && !isSystemApp(ps)) { + && (parseFlags & PackageParser.PARSE_IS_SYSTEM_DIR) != 0 && !isSystemApp(ps)) { /* * Check to make sure the signatures match first. If they don't, * wipe the installed application and its data. @@ -8468,9 +8518,9 @@ public class PackageManagerService extends IPackageManager.Stub // are kept in different files. (except for app in either system or // vendor path). // TODO grab this value from PackageSettings - if ((policyFlags & PackageParser.PARSE_IS_SYSTEM_DIR) == 0) { + if ((parseFlags & PackageParser.PARSE_IS_SYSTEM_DIR) == 0) { if (ps != null && !ps.codePath.equals(ps.resourcePath)) { - policyFlags |= PackageParser.PARSE_FORWARD_LOCK; + parseFlags |= PackageParser.PARSE_FORWARD_LOCK; } } @@ -8483,7 +8533,7 @@ public class PackageManagerService extends IPackageManager.Stub } // Note that we invoke the following method only if we are about to unpack an application - PackageParser.Package scannedPkg = scanPackageLI(pkg, policyFlags, scanFlags + PackageParser.Package scannedPkg = scanPackageLI(pkg, parseFlags, scanFlags | SCAN_UPDATE_SIGNATURE, currentTime, user); /* @@ -9485,8 +9535,8 @@ public class PackageManagerService extends IPackageManager.Stub } private PackageParser.Package scanPackageTracedLI(PackageParser.Package pkg, - final int policyFlags, int scanFlags, long currentTime, @Nullable UserHandle user) - throws PackageManagerException { + final @ParseFlags int parseFlags, @ScanFlags int scanFlags, long currentTime, + @Nullable UserHandle user) throws PackageManagerException { Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "scanPackage"); // If the package has children and this is the first dive in the function // we recursively scan the package with the SCAN_CHECK_ONLY flag set to see @@ -9504,12 +9554,12 @@ public class PackageManagerService extends IPackageManager.Stub final PackageParser.Package scannedPkg; try { // Scan the parent - scannedPkg = scanPackageLI(pkg, policyFlags, scanFlags, currentTime, user); + scannedPkg = scanPackageLI(pkg, parseFlags, scanFlags, currentTime, user); // Scan the children final int childCount = (pkg.childPackages != null) ? pkg.childPackages.size() : 0; for (int i = 0; i < childCount; i++) { PackageParser.Package childPkg = pkg.childPackages.get(i); - scanPackageLI(childPkg, policyFlags, + scanPackageLI(childPkg, parseFlags, scanFlags, currentTime, user); } } finally { @@ -9517,18 +9567,18 @@ public class PackageManagerService extends IPackageManager.Stub } if ((scanFlags & SCAN_CHECK_ONLY) != 0) { - return scanPackageTracedLI(pkg, policyFlags, scanFlags, currentTime, user); + return scanPackageTracedLI(pkg, parseFlags, scanFlags, currentTime, user); } return scannedPkg; } - private PackageParser.Package scanPackageLI(PackageParser.Package pkg, final int policyFlags, - int scanFlags, long currentTime, @Nullable UserHandle user) - throws PackageManagerException { + private PackageParser.Package scanPackageLI(PackageParser.Package pkg, + final @ParseFlags int parseFlags, final @ScanFlags int scanFlags, long currentTime, + @Nullable UserHandle user) throws PackageManagerException { boolean success = false; try { - final PackageParser.Package res = scanPackageDirtyLI(pkg, policyFlags, scanFlags, + final PackageParser.Package res = scanPackageDirtyLI(pkg, parseFlags, scanFlags, currentTime, user); success = true; return res; @@ -9591,16 +9641,17 @@ public class PackageManagerService extends IPackageManager.Stub } private PackageParser.Package scanPackageDirtyLI(PackageParser.Package pkg, - final int policyFlags, final int scanFlags, long currentTime, @Nullable UserHandle user) + final @ParseFlags int parseFlags, final @ScanFlags int scanFlags, long currentTime, + @Nullable UserHandle user) throws PackageManagerException { if (DEBUG_PACKAGE_SCANNING) { - if ((policyFlags & PackageParser.PARSE_CHATTY) != 0) + if ((parseFlags & PackageParser.PARSE_CHATTY) != 0) Log.d(TAG, "Scanning package " + pkg.packageName); } - applyPolicy(pkg, policyFlags); + applyPolicy(pkg, parseFlags, scanFlags); - assertPackageIsValid(pkg, policyFlags, scanFlags); + assertPackageIsValid(pkg, parseFlags, scanFlags); if (Build.IS_DEBUGGABLE && pkg.isPrivileged() && @@ -9633,7 +9684,7 @@ public class PackageManagerService extends IPackageManager.Stub suid = mSettings.getSharedUserLPw( pkg.mSharedUserId, 0 /*pkgFlags*/, 0 /*pkgPrivateFlags*/, true /*create*/); if (DEBUG_PACKAGE_SCANNING) { - if ((policyFlags & PackageParser.PARSE_CHATTY) != 0) + if ((parseFlags & PackageParser.PARSE_CHATTY) != 0) Log.d(TAG, "Shared UserID " + pkg.mSharedUserId + " (uid=" + suid.userId + "): packages=" + suid.packages); } @@ -9801,7 +9852,7 @@ public class PackageManagerService extends IPackageManager.Stub } if ((scanFlags & SCAN_BOOTING) == 0 - && (policyFlags & PackageParser.PARSE_IS_SYSTEM_DIR) == 0) { + && (parseFlags & PackageParser.PARSE_IS_SYSTEM_DIR) == 0) { // Check all shared libraries and map to their actual file path. // We only do this here for apps not on a system dir, because those // are the only ones that can fail an install due to this. We @@ -9838,7 +9889,7 @@ public class PackageManagerService extends IPackageManager.Stub // over the latest parsed certs. pkgSetting.signatures.mSignatures = pkg.mSignatures; } else { - if ((policyFlags & PackageParser.PARSE_IS_SYSTEM_DIR) == 0) { + if ((parseFlags & PackageParser.PARSE_IS_SYSTEM_DIR) == 0) { throw new PackageManagerException(INSTALL_FAILED_UPDATE_INCOMPATIBLE, "Package " + pkg.packageName + " upgrade keys do not match the " + "previously installed version"); @@ -9865,7 +9916,7 @@ public class PackageManagerService extends IPackageManager.Stub // over the latest parsed certs. pkgSetting.signatures.mSignatures = pkg.mSignatures; } catch (PackageManagerException e) { - if ((policyFlags & PackageParser.PARSE_IS_SYSTEM_DIR) == 0) { + if ((parseFlags & PackageParser.PARSE_IS_SYSTEM_DIR) == 0) { throw e; } // The signature has changed, but this package is in the system @@ -10043,7 +10094,7 @@ public class PackageManagerService extends IPackageManager.Stub } else if (pkgSetting.firstInstallTime == 0) { // We need *something*. Take time time stamp of the file. pkgSetting.firstInstallTime = pkgSetting.lastUpdateTime = scanFileTime; - } else if ((policyFlags & PackageParser.PARSE_IS_SYSTEM_DIR) != 0) { + } else if ((parseFlags & PackageParser.PARSE_IS_SYSTEM_DIR) != 0) { if (scanFileTime != pkgSetting.timeStamp) { // A package on the system image has changed; consider this // to be an update. @@ -10062,7 +10113,7 @@ public class PackageManagerService extends IPackageManager.Stub final int userId = user == null ? 0 : user.getIdentifier(); // Modify state for the given package setting commitPackageSettings(pkg, pkgSetting, user, scanFlags, - (policyFlags & PackageParser.PARSE_CHATTY) != 0 /*chatty*/); + (parseFlags & PackageParser.PARSE_CHATTY) != 0 /*chatty*/); if (pkgSetting.getInstantApp(userId)) { mInstantAppRegistry.addInstantAppLPw(userId, pkgSetting.appId); } @@ -10077,8 +10128,9 @@ public class PackageManagerService extends IPackageManager.Stub * Implementation detail: This method must NOT have any side effect. It would * ideally be static, but, it requires locks to read system state. */ - private void applyPolicy(PackageParser.Package pkg, int policyFlags) { - if ((policyFlags&PackageParser.PARSE_IS_SYSTEM) != 0) { + private void applyPolicy(PackageParser.Package pkg, final @ParseFlags int parseFlags, + final @ScanFlags int scanFlags) { + if ((scanFlags & SCAN_AS_SYSTEM) != 0) { pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM; if (pkg.applicationInfo.isDirectBootAware()) { // we're direct boot aware; set for all components @@ -10099,21 +10151,60 @@ public class PackageManagerService extends IPackageManager.Stub pkg.isStub = true; } } else { - // Only allow system apps to be flagged as core apps. + // non system apps can't be flagged as core pkg.coreApp = false; // clear flags not applicable to regular apps + pkg.applicationInfo.flags &= + ~ApplicationInfo.FLAG_PERSISTENT; pkg.applicationInfo.privateFlags &= ~ApplicationInfo.PRIVATE_FLAG_DEFAULT_TO_DEVICE_PROTECTED_STORAGE; pkg.applicationInfo.privateFlags &= ~ApplicationInfo.PRIVATE_FLAG_DIRECT_BOOT_AWARE; + // clear protected broadcasts + pkg.protectedBroadcasts = null; + // cap permission priorities + if (pkg.permissionGroups != null && pkg.permissionGroups.size() > 0) { + for (int i = pkg.permissionGroups.size() - 1; i >= 0; --i) { + pkg.permissionGroups.get(i).info.priority = 0; + } + } } - pkg.mTrustedOverlay = (policyFlags&PackageParser.PARSE_TRUSTED_OVERLAY) != 0; + if ((scanFlags & SCAN_AS_PRIVILEGED) == 0) { + // ignore export request for single user receivers + if (pkg.receivers != null) { + for (int i = pkg.receivers.size() - 1; i >= 0; --i) { + final PackageParser.Activity receiver = pkg.receivers.get(i); + if ((receiver.info.flags & ActivityInfo.FLAG_SINGLE_USER) != 0) { + receiver.info.exported = false; + } + } + } + // ignore export request for single user services + if (pkg.services != null) { + for (int i = pkg.services.size() - 1; i >= 0; --i) { + final PackageParser.Service service = pkg.services.get(i); + if ((service.info.flags & ServiceInfo.FLAG_SINGLE_USER) != 0) { + service.info.exported = false; + } + } + } + // ignore export request for single user providers + if (pkg.providers != null) { + for (int i = pkg.providers.size() - 1; i >= 0; --i) { + final PackageParser.Provider provider = pkg.providers.get(i); + if ((provider.info.flags & ProviderInfo.FLAG_SINGLE_USER) != 0) { + provider.info.exported = false; + } + } + } + } + pkg.mTrustedOverlay = (scanFlags & SCAN_TRUSTED_OVERLAY) != 0; - if ((policyFlags&PackageParser.PARSE_IS_PRIVILEGED) != 0) { + if ((scanFlags & SCAN_AS_PRIVILEGED) != 0) { pkg.applicationInfo.privateFlags |= ApplicationInfo.PRIVATE_FLAG_PRIVILEGED; } - if ((policyFlags&PackageParser.PARSE_IS_OEM) != 0) { + if ((scanFlags & SCAN_AS_OEM) != 0) { pkg.applicationInfo.privateFlags |= ApplicationInfo.PRIVATE_FLAG_OEM; } @@ -10134,9 +10225,10 @@ public class PackageManagerService extends IPackageManager.Stub * * @throws PackageManagerException If the package fails any of the validation checks */ - private void assertPackageIsValid(PackageParser.Package pkg, int policyFlags, int scanFlags) - throws PackageManagerException { - if ((policyFlags & PackageParser.PARSE_ENFORCE_CODE) != 0) { + private void assertPackageIsValid(PackageParser.Package pkg, final @ParseFlags int parseFlags, + final @ScanFlags int scanFlags) + throws PackageManagerException { + if ((parseFlags & PackageParser.PARSE_ENFORCE_CODE) != 0) { assertCodePolicy(pkg); } @@ -10294,7 +10386,7 @@ public class PackageManagerService extends IPackageManager.Stub // Only privileged apps and updated privileged apps can add child packages. if (pkg.childPackages != null && !pkg.childPackages.isEmpty()) { - if ((policyFlags & PARSE_IS_PRIVILEGED) == 0) { + if ((scanFlags & SCAN_AS_PRIVILEGED) == 0) { throw new PackageManagerException("Only privileged apps can add child " + "packages. Ignoring package " + pkg.packageName); } @@ -10420,7 +10512,8 @@ public class PackageManagerService extends IPackageManager.Stub * be available for query, resolution, etc... */ private void commitPackageSettings(PackageParser.Package pkg, PackageSetting pkgSetting, - UserHandle user, int scanFlags, boolean chatty) throws PackageManagerException { + UserHandle user, final @ScanFlags int scanFlags, boolean chatty) + throws PackageManagerException { final String pkgName = pkg.packageName; if (mCustomResolverComponentName != null && mCustomResolverComponentName.getPackageName().equals(pkg.packageName)) { @@ -15252,9 +15345,9 @@ public class PackageManagerService extends IPackageManager.Stub /* * Install a non-existing package. */ - private void installNewPackageLIF(PackageParser.Package pkg, final int policyFlags, - int scanFlags, UserHandle user, String installerPackageName, String volumeUuid, - PackageInstalledInfo res, int installReason) { + private void installNewPackageLIF(PackageParser.Package pkg, final @ParseFlags int parseFlags, + final @ScanFlags int scanFlags, UserHandle user, String installerPackageName, + String volumeUuid, PackageInstalledInfo res, int installReason) { Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "installNewPackage"); // Remember this for later, in case we need to rollback this install @@ -15283,7 +15376,7 @@ public class PackageManagerService extends IPackageManager.Stub } try { - PackageParser.Package newPackage = scanPackageTracedLI(pkg, policyFlags, scanFlags, + PackageParser.Package newPackage = scanPackageTracedLI(pkg, parseFlags, scanFlags, System.currentTimeMillis(), user); updateSettingsLI(newPackage, installerPackageName, null, res, user, installReason); @@ -15311,9 +15404,9 @@ public class PackageManagerService extends IPackageManager.Stub } } - private void replacePackageLIF(PackageParser.Package pkg, final int policyFlags, int scanFlags, - UserHandle user, String installerPackageName, PackageInstalledInfo res, - int installReason) { + private void replacePackageLIF(PackageParser.Package pkg, final @ParseFlags int parseFlags, + final @ScanFlags int scanFlags, UserHandle user, String installerPackageName, + PackageInstalledInfo res, int installReason) { final boolean isInstantApp = (scanFlags & SCAN_AS_INSTANT_APP) != 0; final PackageParser.Package oldPackage; @@ -15333,7 +15426,7 @@ public class PackageManagerService extends IPackageManager.Stub == android.os.Build.VERSION_CODES.CUR_DEVELOPMENT; if (oldTargetsPreRelease && !newTargetsPreRelease - && ((policyFlags & PackageParser.PARSE_FORCE_SDK) == 0)) { + && ((parseFlags & PackageParser.PARSE_FORCE_SDK) == 0)) { Slog.w(TAG, "Can't install package targeting released sdk"); res.setReturnCode(PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE); return; @@ -15484,15 +15577,16 @@ public class PackageManagerService extends IPackageManager.Stub final boolean oem = (oldPackage.applicationInfo.privateFlags & ApplicationInfo.PRIVATE_FLAG_OEM) != 0; - final int systemPolicyFlags = policyFlags - | PackageParser.PARSE_IS_SYSTEM - | (privileged ? PARSE_IS_PRIVILEGED : 0) - | (oem ? PARSE_IS_OEM : 0); + final @ParseFlags int systemParseFlags = parseFlags; + final @ScanFlags int systemScanFlags = scanFlags + | SCAN_AS_SYSTEM + | (privileged ? SCAN_AS_PRIVILEGED : 0) + | (oem ? SCAN_AS_OEM : 0); - replaceSystemPackageLIF(oldPackage, pkg, systemPolicyFlags, scanFlags, + replaceSystemPackageLIF(oldPackage, pkg, systemParseFlags, systemScanFlags, user, allUsers, installerPackageName, res, installReason); } else { - replaceNonSystemPackageLIF(oldPackage, pkg, policyFlags, scanFlags, + replaceNonSystemPackageLIF(oldPackage, pkg, parseFlags, scanFlags, user, allUsers, installerPackageName, res, installReason); } } @@ -15514,9 +15608,9 @@ public class PackageManagerService extends IPackageManager.Stub } private void replaceNonSystemPackageLIF(PackageParser.Package deletedPackage, - PackageParser.Package pkg, final int policyFlags, int scanFlags, UserHandle user, - int[] allUsers, String installerPackageName, PackageInstalledInfo res, - int installReason) { + PackageParser.Package pkg, final @ParseFlags int parseFlags, + final @ScanFlags int scanFlags, UserHandle user, int[] allUsers, + String installerPackageName, PackageInstalledInfo res, int installReason) { if (DEBUG_INSTALL) Slog.d(TAG, "replaceNonSystemPackageLI: new=" + pkg + ", old=" + deletedPackage); @@ -15557,7 +15651,7 @@ public class PackageManagerService extends IPackageManager.Stub clearAppProfilesLIF(deletedPackage, UserHandle.USER_ALL); try { - final PackageParser.Package newPackage = scanPackageTracedLI(pkg, policyFlags, + final PackageParser.Package newPackage = scanPackageTracedLI(pkg, parseFlags, scanFlags | SCAN_UPDATE_TIME, System.currentTimeMillis(), user); updateSettingsLI(newPackage, installerPackageName, allUsers, res, user, installReason); @@ -15663,7 +15757,8 @@ public class PackageManagerService extends IPackageManager.Stub } private void replaceSystemPackageLIF(PackageParser.Package deletedPackage, - PackageParser.Package pkg, final int policyFlags, int scanFlags, UserHandle user, + PackageParser.Package pkg, final @ParseFlags int parseFlags, + final @ScanFlags int scanFlags, UserHandle user, int[] allUsers, String installerPackageName, PackageInstalledInfo res, int installReason) { if (DEBUG_INSTALL) Slog.d(TAG, "replaceSystemPackageLI: new=" + pkg @@ -15701,7 +15796,7 @@ public class PackageManagerService extends IPackageManager.Stub PackageParser.Package newPackage = null; try { // Add the package to the internal data structures - newPackage = scanPackageTracedLI(pkg, policyFlags, scanFlags, 0, user); + newPackage = scanPackageTracedLI(pkg, parseFlags, scanFlags, 0, user); // Set the update and install times PackageSetting deletedPkgSetting = (PackageSetting) deletedPackage.mExtras; @@ -15758,7 +15853,7 @@ public class PackageManagerService extends IPackageManager.Stub } // Add back the old system package try { - scanPackageTracedLI(deletedPackage, policyFlags, SCAN_UPDATE_SIGNATURE, 0, user); + scanPackageTracedLI(deletedPackage, parseFlags, SCAN_UPDATE_SIGNATURE, 0, user); } catch (PackageManagerException e) { Slog.e(TAG, "Failed to restore original package: " + e.getMessage()); } @@ -16012,7 +16107,7 @@ public class PackageManagerService extends IPackageManager.Stub final boolean virtualPreload = ((installFlags & PackageManager.INSTALL_VIRTUAL_PRELOAD) != 0); boolean replace = false; - int scanFlags = SCAN_NEW_INSTALL | SCAN_UPDATE_SIGNATURE; + @ScanFlags int scanFlags = SCAN_NEW_INSTALL | SCAN_UPDATE_SIGNATURE; if (args.move != null) { // moving a complete application; perform an initial scan on the new install location scanFlags |= SCAN_INITIAL; @@ -16045,7 +16140,7 @@ public class PackageManagerService extends IPackageManager.Stub } // Retrieve PackageSettings and parse package - final int parseFlags = mDefParseFlags | PackageParser.PARSE_CHATTY + @ParseFlags final int parseFlags = mDefParseFlags | PackageParser.PARSE_CHATTY | PackageParser.PARSE_ENFORCE_CODE | (forwardLocked ? PackageParser.PARSE_FORWARD_LOCK : 0) | (onExternal ? PackageParser.PARSE_EXTERNAL_STORAGE : 0) @@ -16477,7 +16572,7 @@ public class PackageManagerService extends IPackageManager.Stub return; } } - replacePackageLIF(pkg, parseFlags, scanFlags | SCAN_REPLACING, args.user, + replacePackageLIF(pkg, parseFlags, scanFlags, args.user, installerPackageName, res, args.installReason); } else { installNewPackageLIF(pkg, parseFlags, scanFlags | SCAN_DELETE_DATA_ON_FAILURES, @@ -17103,7 +17198,7 @@ public class PackageManagerService extends IPackageManager.Stub try (PackageFreezer freezer = freezePackageForDelete(packageName, freezeUser, deleteFlags, "deletePackageX")) { res = deletePackageLIF(packageName, UserHandle.of(removeUser), true, allUsers, - deleteFlags | FLAGS_REMOVE_CHATTY, info, true, null); + deleteFlags | PackageManager.DELETE_CHATTY, info, true, null); } synchronized (mPackages) { if (res) { @@ -17295,7 +17390,7 @@ public class PackageManagerService extends IPackageManager.Stub } } - removePackageLI(ps, (flags & FLAGS_REMOVE_CHATTY) != 0); + removePackageLI(ps, (flags & PackageManager.DELETE_CHATTY) != 0); if ((flags & PackageManager.DELETE_KEEP_DATA) == 0) { final PackageParser.Package resolvedPkg; @@ -17523,19 +17618,20 @@ public class PackageManagerService extends IPackageManager.Stub boolean isPrivileged, @Nullable int[] allUserHandles, @Nullable int[] origUserHandles, @Nullable PermissionsState origPermissionState, boolean writeSettings) throws PackageManagerException { - int parseFlags = mDefParseFlags + @ParseFlags int parseFlags = + mDefParseFlags | PackageParser.PARSE_MUST_BE_APK - | PackageParser.PARSE_IS_SYSTEM | PackageParser.PARSE_IS_SYSTEM_DIR; + @ScanFlags int scanFlags = SCAN_AS_SYSTEM; if (isPrivileged || locationIsPrivileged(codePath)) { - parseFlags |= PackageParser.PARSE_IS_PRIVILEGED; + scanFlags |= SCAN_AS_PRIVILEGED; } if (locationIsOem(codePath)) { - parseFlags |= PackageParser.PARSE_IS_OEM; + scanFlags |= SCAN_AS_OEM; } final PackageParser.Package pkg = - scanPackageTracedLI(codePath, parseFlags, 0 /*scanFlags*/, 0 /*currentTime*/, null); + scanPackageTracedLI(codePath, parseFlags, scanFlags, 0 /*currentTime*/, null); try { // update shared libraries for the newly re-installed system package @@ -19591,9 +19687,8 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); pp.setCallback(mPackageParserCallback); final PackageParser.Package tmpPkg; try { - final int parseFlags = mDefParseFlags + final @ParseFlags int parseFlags = mDefParseFlags | PackageParser.PARSE_MUST_BE_APK - | PackageParser.PARSE_IS_SYSTEM | PackageParser.PARSE_IS_SYSTEM_DIR; tmpPkg = pp.parsePackage(codePath, parseFlags); } catch (PackageParserException e) {