Merge "Make sense out of scan & parse flags"
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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<String> 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<String>();
|
||||
}
|
||||
@@ -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(
|
||||
|
||||
@@ -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<String> 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) {
|
||||
|
||||
Reference in New Issue
Block a user