Merge "Make sense out of scan & parse flags"
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index 15ea4b5..f796aab 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -1302,6 +1302,7 @@
DELETE_ALL_USERS,
DELETE_SYSTEM_APP,
DELETE_DONT_KILL_APP,
+ DELETE_CHATTY,
})
@Retention(RetentionPolicy.SOURCE)
public @interface DeleteFlags {}
@@ -1343,6 +1344,14 @@
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
* package.
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index d9ac681..68bb562 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.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.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 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<String> sSplitNameComparator = new SplitNameComparator();
@@ -1507,7 +1521,7 @@
* 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 @@
}
}
- 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 @@
}
}
- 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 @@
sa.recycle();
- if (name != null && (flags&PARSE_IS_SYSTEM) != 0) {
+ if (name != null) {
if (pkg.protectedBroadcasts == null) {
pkg.protectedBroadcasts = new ArrayList<String>();
}
@@ -3255,9 +3269,6 @@
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 @@
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 @@
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 @@
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 @@
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 2e44e79..b5bcf27 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_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.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 @@
// 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 @@
// 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 @@
} 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<String> possiblyDeletedUpdatedSystemApps = new ArrayList<>();
@@ -2715,21 +2753,38 @@
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 @@
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 @@
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 @@
}
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 @@
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 @@
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 @@
* @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 @@
}
// 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 @@
* @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 @@
// 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 @@
}
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 @@
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 @@
}
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 @@
*/
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 @@
// 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 @@
}
// 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 @@
}
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 @@
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 @@
}
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 @@
}
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 @@
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 @@
}
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 @@
// 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 @@
// 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 @@
} 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 @@
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 @@
* 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 @@
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 @@
*
* @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 @@
// 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 @@
* 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 @@
/*
* 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 @@
}
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 @@
}
}
- 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 @@
== 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 @@
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 @@
}
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 @@
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 @@
}
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 @@
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 @@
}
// 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 @@
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 @@
}
// 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 @@
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 @@
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 @@
}
}
- 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 @@
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 @@
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) {