Remove AndroidPackageWrite
Moves all system state out of AndroidPackage and into
PackageStateUnserialized, which lives inside a PackageSetting.
This makes AndroidPackage effectively immutable after it exits
the scan/install process.
Specifically, moves isUpdatedSystemApp, isHiddenUntilInstalled,
seInfoOverride, cpuAbiOverride, PackageUsage,
and sharedLibraryFiles/Infos.
Bug: 135203078
Test: atest com.android.server.pm.parsing
Change-Id: I44baab113f3b6b138472b15a61e0874173bc694f
diff --git a/services/core/java/android/content/pm/PackageManagerInternal.java b/services/core/java/android/content/pm/PackageManagerInternal.java
index 39a9efb..0f8d57e 100644
--- a/services/core/java/android/content/pm/PackageManagerInternal.java
+++ b/services/core/java/android/content/pm/PackageManagerInternal.java
@@ -37,6 +37,7 @@
import android.util.SparseArray;
import com.android.server.pm.PackageList;
+import com.android.server.pm.PackageSetting;
import com.android.server.pm.parsing.pkg.AndroidPackage;
import java.io.IOException;
@@ -586,9 +587,7 @@
*/
public abstract @Nullable AndroidPackage getPackage(@NonNull String packageName);
- // TODO(b/135203078): PackageSetting can't be referenced directly. Should move to a server side
- // internal PM which is aware of PS.
- public abstract @Nullable Object getPackageSetting(String packageName);
+ public abstract @Nullable PackageSetting getPackageSetting(String packageName);
/**
* Returns a package for the given UID. If the UID is part of a shared user ID, one
@@ -625,18 +624,17 @@
*/
public abstract void removePackageListObserver(@NonNull PackageListObserver observer);
- // TODO(b/135203078): PackageSetting can't be referenced directly
/**
* Returns a package object for the disabled system package name.
*/
- public abstract @Nullable Object getDisabledSystemPackage(@NonNull String packageName);
+ public abstract @Nullable PackageSetting getDisabledSystemPackage(@NonNull String packageName);
/**
* Returns the package name for the disabled system package.
*
* This is equivalent to
* {@link #getDisabledSystemPackage(String)}
- * .{@link com.android.server.pm.PackageSetting#pkg}
+ * .{@link PackageSetting#pkg}
* .{@link AndroidPackage#getPackageName()}
*/
public abstract @Nullable String getDisabledSystemPackageName(@NonNull String packageName);
@@ -677,7 +675,7 @@
/**
* Returns whether or not access to the application should be filtered.
*
- * @see #filterAppAccess(android.content.pm.PackageParser.Package, int, int)
+ * @see #filterAppAccess(AndroidPackage, int, int)
*/
public abstract boolean filterAppAccess(
@NonNull String packageName, int callingUid, int userId);
@@ -771,13 +769,21 @@
/**
* Perform the given action for each package.
- * Note that packages lock will be held while performin the actions.
+ * Note that packages lock will be held while performing the actions.
*
* @param actionLocked action to be performed
*/
public abstract void forEachPackage(Consumer<AndroidPackage> actionLocked);
/**
+ * Perform the given action for each {@link PackageSetting}.
+ * Note that packages lock will be held while performing the actions.
+ *
+ * @param actionLocked action to be performed
+ */
+ public abstract void forEachPackageSetting(Consumer<PackageSetting> actionLocked);
+
+ /**
* Perform the given action for each installed package for a user.
* Note that packages lock will be held while performin the actions.
*/
diff --git a/services/core/java/com/android/server/integrity/AppIntegrityManagerServiceImpl.java b/services/core/java/com/android/server/integrity/AppIntegrityManagerServiceImpl.java
index c45c95c..63054cf 100644
--- a/services/core/java/com/android/server/integrity/AppIntegrityManagerServiceImpl.java
+++ b/services/core/java/com/android/server/integrity/AppIntegrityManagerServiceImpl.java
@@ -515,7 +515,7 @@
int flags = PackageManager.GET_SIGNING_CERTIFICATES | PackageManager.GET_META_DATA;
pkg.setSigningDetails(ParsingPackageUtils.collectCertificates(pkg, false));
return PackageInfoUtils.generate(pkg, null, flags, 0, 0, null, new PackageUserState(),
- UserHandle.getCallingUserId());
+ UserHandle.getCallingUserId(), null);
} catch (Exception e) {
throw new IllegalArgumentException("Exception reading " + dataUri, e);
}
diff --git a/services/core/java/com/android/server/pm/ComponentResolver.java b/services/core/java/com/android/server/pm/ComponentResolver.java
index 1f112be..85810e3 100644
--- a/services/core/java/com/android/server/pm/ComponentResolver.java
+++ b/services/core/java/com/android/server/pm/ComponentResolver.java
@@ -301,7 +301,7 @@
continue;
}
final ProviderInfo info = PackageInfoUtils.generateProviderInfo(
- pkg, p, flags, ps.readUserState(userId), userId);
+ pkg, p, flags, ps.readUserState(userId), userId, ps);
if (info == null) {
continue;
}
@@ -331,7 +331,7 @@
return null;
}
return PackageInfoUtils.generateProviderInfo(pkg, p, flags,
- ps.readUserState(userId), userId);
+ ps.readUserState(userId), userId, ps);
}
}
@@ -361,7 +361,7 @@
}
final ProviderInfo info =
PackageInfoUtils.generateProviderInfo(pkg, p, 0,
- ps.readUserState(userId), userId);
+ ps.readUserState(userId), userId, ps);
if (info == null) {
continue;
}
@@ -1396,7 +1396,7 @@
}
final PackageUserState userState = ps.readUserState(userId);
ActivityInfo ai = PackageInfoUtils.generateActivityInfo(pkg, activity, mFlags,
- userState, userId);
+ userState, userId, ps);
if (ai == null) {
if (DEBUG) {
log("Failed to create ActivityInfo based on " + activity, info, match,
@@ -1707,7 +1707,7 @@
return null;
}
ProviderInfo pi = PackageInfoUtils.generateProviderInfo(pkg, provider, mFlags,
- userState, userId);
+ userState, userId, ps);
if (pi == null) {
return null;
}
@@ -1916,7 +1916,7 @@
}
final PackageUserState userState = ps.readUserState(userId);
ServiceInfo si = PackageInfoUtils.generateServiceInfo(pkg, service, mFlags,
- userState, userId);
+ userState, userId, ps);
if (si == null) {
return null;
}
diff --git a/services/core/java/com/android/server/pm/InstantAppRegistry.java b/services/core/java/com/android/server/pm/InstantAppRegistry.java
index 52c29ff..cf85b0f 100644
--- a/services/core/java/com/android/server/pm/InstantAppRegistry.java
+++ b/services/core/java/com/android/server/pm/InstantAppRegistry.java
@@ -694,12 +694,13 @@
final int packageCount = mService.mPackages.size();
for (int i = 0; i < packageCount; i++) {
final AndroidPackage pkg = mService.mPackages.valueAt(i);
- if (now - pkg.getLatestPackageUseTimeInMills() < maxInstalledCacheDuration) {
+ final PackageSetting ps = mService.getPackageSetting(pkg.getPackageName());
+ if (ps == null) {
continue;
}
- final PackageSetting ps = mService.getPackageSetting(pkg.getPackageName());
- if (ps == null) {
+ if (now - ps.getPkgState().getLatestPackageUseTimeInMills()
+ < maxInstalledCacheDuration) {
continue;
}
@@ -733,30 +734,28 @@
} else if (rhsPkg == null) {
return 1;
} else {
- if (lhsPkg.getLatestPackageUseTimeInMills() >
- rhsPkg.getLatestPackageUseTimeInMills()) {
+ final PackageSetting lhsPs = mService.getPackageSetting(
+ lhsPkg.getPackageName());
+ if (lhsPs == null) {
+ return 0;
+ }
+
+ final PackageSetting rhsPs = mService.getPackageSetting(
+ rhsPkg.getPackageName());
+ if (rhsPs == null) {
+ return 0;
+ }
+
+ if (lhsPs.getPkgState().getLatestPackageUseTimeInMills() >
+ rhsPs.getPkgState().getLatestPackageUseTimeInMills()) {
return 1;
- } else if (lhsPkg.getLatestPackageUseTimeInMills() <
- rhsPkg.getLatestPackageUseTimeInMills()) {
+ } else if (lhsPs.getPkgState().getLatestPackageUseTimeInMills() <
+ rhsPs.getPkgState().getLatestPackageUseTimeInMills()) {
return -1;
+ } else if (lhsPs.firstInstallTime > rhsPs.firstInstallTime) {
+ return 1;
} else {
- final PackageSetting lhsPs = mService.getPackageSetting(
- lhsPkg.getPackageName());
- if (lhsPs == null) {
- return 0;
- }
-
- final PackageSetting rhsPs = mService.getPackageSetting(
- rhsPkg.getPackageName());
- if (rhsPs == null) {
- return 0;
- }
-
- if (lhsPs.firstInstallTime > rhsPs.firstInstallTime) {
- return 1;
- } else {
- return -1;
- }
+ return -1;
}
}
});
@@ -869,10 +868,9 @@
// TODO(b/135203078): This may be broken due to inner mutability problems that were broken
// as part of moving to PackageInfoUtils. Flags couldn't be determined.
ApplicationInfo appInfo = PackageInfoUtils.generateApplicationInfo(ps.pkg, 0,
- ps.readUserState(userId), userId);
+ ps.readUserState(userId), userId, ps);
if (addApplicationInfo) {
- return new InstantAppInfo(appInfo,
- requestedPermissions, grantedPermissions);
+ return new InstantAppInfo(appInfo, requestedPermissions, grantedPermissions);
} else {
return new InstantAppInfo(appInfo.packageName,
appInfo.loadLabel(mService.mContext.getPackageManager()),
diff --git a/services/core/java/com/android/server/pm/InstructionSets.java b/services/core/java/com/android/server/pm/InstructionSets.java
index 02db01a..2d42107 100644
--- a/services/core/java/com/android/server/pm/InstructionSets.java
+++ b/services/core/java/com/android/server/pm/InstructionSets.java
@@ -22,6 +22,7 @@
import android.util.ArraySet;
import com.android.server.pm.parsing.pkg.AndroidPackage;
+import com.android.server.pm.parsing.pkg.AndroidPackageUtils;
import dalvik.system.VMRuntime;
@@ -110,13 +111,4 @@
return VMRuntime.getInstructionSet(abis.primary);
}
-
- public static String getPrimaryInstructionSet(AndroidPackage pkg) {
- if (pkg.getPrimaryCpuAbi() == null) {
- return getPreferredInstructionSet();
- }
-
- return VMRuntime.getInstructionSet(pkg.getPrimaryCpuAbi());
- }
-
}
diff --git a/services/core/java/com/android/server/pm/OtaDexoptService.java b/services/core/java/com/android/server/pm/OtaDexoptService.java
index 3198f91..2df4a92 100644
--- a/services/core/java/com/android/server/pm/OtaDexoptService.java
+++ b/services/core/java/com/android/server/pm/OtaDexoptService.java
@@ -42,7 +42,9 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import java.util.concurrent.TimeUnit;
/**
@@ -119,31 +121,33 @@
if (mDexoptCommands != null) {
throw new IllegalStateException("already called prepare()");
}
- final List<AndroidPackage> important;
- final List<AndroidPackage> others;
+ final List<PackageSetting> important;
+ final List<PackageSetting> others;
synchronized (mPackageManagerService.mLock) {
// Important: the packages we need to run with ab-ota compiler-reason.
important = PackageManagerServiceUtils.getPackagesForDexopt(
- mPackageManagerService.mPackages.values(), mPackageManagerService,
+ mPackageManagerService.mSettings.mPackages.values(), mPackageManagerService,
DEBUG_DEXOPT);
// Others: we should optimize this with the (first-)boot compiler-reason.
- others = new ArrayList<>(mPackageManagerService.mPackages.values());
+ others = new ArrayList<>(mPackageManagerService.mSettings.mPackages.values());
others.removeAll(important);
+ others.removeIf(PackageManagerServiceUtils.REMOVE_IF_NULL_PKG);
// Pre-size the array list by over-allocating by a factor of 1.5.
mDexoptCommands = new ArrayList<>(3 * mPackageManagerService.mPackages.size() / 2);
}
- for (AndroidPackage p : important) {
- mDexoptCommands.addAll(generatePackageDexopts(p, PackageManagerService.REASON_AB_OTA));
+ for (PackageSetting pkgSetting : important) {
+ mDexoptCommands.addAll(generatePackageDexopts(pkgSetting.pkg, pkgSetting,
+ PackageManagerService.REASON_AB_OTA));
}
- for (AndroidPackage p : others) {
+ for (PackageSetting pkgSetting : others) {
// We assume here that there are no core apps left.
- if (p.isCoreApp()) {
+ if (pkgSetting.pkg.isCoreApp()) {
throw new IllegalStateException("Found a core app that's not important");
}
- mDexoptCommands.addAll(
- generatePackageDexopts(p, PackageManagerService.REASON_FIRST_BOOT));
+ mDexoptCommands.addAll(generatePackageDexopts(pkgSetting.pkg, pkgSetting,
+ PackageManagerService.REASON_FIRST_BOOT));
}
completeSize = mDexoptCommands.size();
@@ -151,8 +155,8 @@
if (spaceAvailable < BULK_DELETE_THRESHOLD) {
Log.i(TAG, "Low on space, deleting oat files in an attempt to free up space: "
+ PackageManagerServiceUtils.packagesToString(others));
- for (AndroidPackage pkg : others) {
- mPackageManagerService.deleteOatArtifactsOfPackage(pkg.getPackageName());
+ for (PackageSetting pkg : others) {
+ mPackageManagerService.deleteOatArtifactsOfPackage(pkg.name);
}
}
long spaceAvailableNow = getAvailableSpace();
@@ -162,16 +166,18 @@
if (DEBUG_DEXOPT) {
try {
// Output some data about the packages.
- AndroidPackage lastUsed = Collections.max(important,
- (pkg1, pkg2) -> Long.compare(
- pkg1.getLatestForegroundPackageUseTimeInMills(),
- pkg2.getLatestForegroundPackageUseTimeInMills()));
+ PackageSetting lastUsed = Collections.max(important,
+ (pkgSetting1, pkgSetting2) -> Long.compare(
+ pkgSetting1.getPkgState()
+ .getLatestForegroundPackageUseTimeInMills(),
+ pkgSetting2.getPkgState()
+ .getLatestForegroundPackageUseTimeInMills()));
Log.d(TAG, "A/B OTA: lastUsed time = "
- + lastUsed.getLatestForegroundPackageUseTimeInMills());
+ + lastUsed.getPkgState().getLatestForegroundPackageUseTimeInMills());
Log.d(TAG, "A/B OTA: deprioritized packages:");
- for (AndroidPackage pkg : others) {
- Log.d(TAG, " " + pkg.getPackageName() + " - "
- + pkg.getLatestForegroundPackageUseTimeInMills());
+ for (PackageSetting pkgSetting : others) {
+ Log.d(TAG, " " + pkgSetting.name + " - "
+ + pkgSetting.getPkgState().getLatestForegroundPackageUseTimeInMills());
}
} catch (Exception ignored) {
}
@@ -264,7 +270,7 @@
* Generate all dexopt commands for the given package.
*/
private synchronized List<String> generatePackageDexopts(AndroidPackage pkg,
- int compilationReason) {
+ PackageSetting pkgSetting, int compilationReason) {
// Intercept and collect dexopt requests
final List<String> commands = new ArrayList<String>();
final Installer collectingInstaller = new Installer(mContext, true) {
@@ -334,7 +340,7 @@
PackageDexOptimizer optimizer = new OTADexoptPackageDexOptimizer(
collectingInstaller, mPackageManagerService.mInstallLock, mContext);
- optimizer.performDexOpt(pkg,
+ optimizer.performDexOpt(pkg, pkgSetting,
null /* ISAs */,
null /* CompilerStats.PackageStats */,
mPackageManagerService.getDexManager().getPackageUseInfoOrDefault(
@@ -387,8 +393,10 @@
continue;
}
- final String[] instructionSets = getAppDexInstructionSets(pkg.getPrimaryCpuAbi(),
- pkg.getSecondaryCpuAbi());
+ PackageSetting pkgSetting = mPackageManagerService.getPackageSetting(pkg.getPackageName());
+ final String[] instructionSets = getAppDexInstructionSets(
+ AndroidPackageUtils.getPrimaryCpuAbi(pkg, pkgSetting),
+ AndroidPackageUtils.getSecondaryCpuAbi(pkg, pkgSetting));
final List<String> paths =
AndroidPackageUtils.getAllCodePathsExcludingResourceOnly(pkg);
final String[] dexCodeInstructionSets = getDexCodeInstructionSets(instructionSets);
diff --git a/services/core/java/com/android/server/pm/PackageAbiHelper.java b/services/core/java/com/android/server/pm/PackageAbiHelper.java
index 3d27b4f..e355bb9 100644
--- a/services/core/java/com/android/server/pm/PackageAbiHelper.java
+++ b/services/core/java/com/android/server/pm/PackageAbiHelper.java
@@ -21,6 +21,7 @@
import com.android.internal.annotations.VisibleForTesting;
import com.android.server.pm.parsing.pkg.AndroidPackage;
+import com.android.server.pm.parsing.pkg.AndroidPackageUtils;
import com.android.server.pm.parsing.pkg.ParsedPackage;
import java.io.File;
@@ -33,7 +34,8 @@
* Derive and get the location of native libraries for the given package,
* which varies depending on where and how the package was installed.
*/
- NativeLibraryPaths getNativeLibraryPaths(AndroidPackage pkg, File appLib32InstallDir);
+ NativeLibraryPaths getNativeLibraryPaths(AndroidPackage pkg, PackageSetting pkgSetting,
+ File appLib32InstallDir);
/**
* Calculate the abis for a bundled app. These can uniquely be determined from the contents of
@@ -48,9 +50,8 @@
*
* If {@code extractLibs} is true, native libraries are extracted from the app if required.
*/
- Pair<Abis, NativeLibraryPaths> derivePackageAbi(
- AndroidPackage pkg, String cpuAbiOverride, boolean extractLibs)
- throws PackageManagerException;
+ Pair<Abis, NativeLibraryPaths> derivePackageAbi(AndroidPackage pkg, boolean isUpdatedSystemApp,
+ String cpuAbiOverride, boolean extractLibs) throws PackageManagerException;
/**
* Calculates adjusted ABIs for a set of packages belonging to a shared user so that they all
@@ -113,8 +114,9 @@
this.secondary = secondary;
}
- Abis(AndroidPackage pkg) {
- this(pkg.getPrimaryCpuAbi(), pkg.getSecondaryCpuAbi());
+ Abis(AndroidPackage pkg, PackageSetting pkgSetting) {
+ this(AndroidPackageUtils.getPrimaryCpuAbi(pkg, pkgSetting),
+ AndroidPackageUtils.getSecondaryCpuAbi(pkg, pkgSetting));
}
public void applyTo(ParsedPackage pkg) {
diff --git a/services/core/java/com/android/server/pm/PackageAbiHelperImpl.java b/services/core/java/com/android/server/pm/PackageAbiHelperImpl.java
index e136613..0bd8b28 100644
--- a/services/core/java/com/android/server/pm/PackageAbiHelperImpl.java
+++ b/services/core/java/com/android/server/pm/PackageAbiHelperImpl.java
@@ -27,7 +27,6 @@
import static com.android.server.pm.InstructionSets.getPrimaryInstructionSet;
import android.annotation.Nullable;
-import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Environment;
@@ -132,11 +131,11 @@
}
@Override
- public NativeLibraryPaths getNativeLibraryPaths(
- AndroidPackage pkg, File appLib32InstallDir) {
- return getNativeLibraryPaths(new Abis(pkg), appLib32InstallDir, pkg.getCodePath(),
- pkg.getBaseCodePath(), pkg.isSystem(),
- pkg.isUpdatedSystemApp());
+ public NativeLibraryPaths getNativeLibraryPaths(AndroidPackage pkg, PackageSetting pkgSetting,
+ File appLib32InstallDir) {
+ return getNativeLibraryPaths(new Abis(pkg, pkgSetting), appLib32InstallDir,
+ pkg.getCodePath(), pkg.getBaseCodePath(), pkg.isSystem(),
+ pkgSetting.getPkgState().isUpdatedSystemApp());
}
private static NativeLibraryPaths getNativeLibraryPaths(final Abis abis,
@@ -294,18 +293,21 @@
}
@Override
- public Pair<Abis, NativeLibraryPaths> derivePackageAbi(
- AndroidPackage pkg, String cpuAbiOverride, boolean extractLibs)
+ public Pair<Abis, NativeLibraryPaths> derivePackageAbi(AndroidPackage pkg,
+ boolean isUpdatedSystemApp, String cpuAbiOverride, boolean extractLibs)
throws PackageManagerException {
// Give ourselves some initial paths; we'll come back for another
// pass once we've determined ABI below.
- final NativeLibraryPaths initialLibraryPaths = getNativeLibraryPaths(new Abis(pkg),
+ String pkgRawPrimaryCpuAbi = AndroidPackageUtils.getRawPrimaryCpuAbi(pkg);
+ String pkgRawSecondaryCpuAbi = AndroidPackageUtils.getRawSecondaryCpuAbi(pkg);
+ final NativeLibraryPaths initialLibraryPaths = getNativeLibraryPaths(
+ new Abis(pkgRawPrimaryCpuAbi, pkgRawSecondaryCpuAbi),
PackageManagerService.sAppLib32InstallDir, pkg.getCodePath(),
pkg.getBaseCodePath(), pkg.isSystem(),
- pkg.isUpdatedSystemApp());
+ isUpdatedSystemApp);
// We shouldn't attempt to extract libs from system app when it was not updated.
- if (pkg.isSystem() && !pkg.isUpdatedSystemApp()) {
+ if (pkg.isSystem() && !isUpdatedSystemApp) {
extractLibs = false;
}
@@ -331,16 +333,6 @@
primaryCpuAbi = null;
secondaryCpuAbi = null;
if (pkg.isMultiArch()) {
- // Warn if we've set an abiOverride for multi-lib packages..
- // By definition, we need to copy both 32 and 64 bit libraries for
- // such packages.
- if (pkg.getCpuAbiOverride() != null
- && !NativeLibraryHelper.CLEAR_ABI_OVERRIDE.equals(
- pkg.getCpuAbiOverride())) {
- Slog.w(PackageManagerService.TAG,
- "Ignoring abiOverride for multi arch application.");
- }
-
int abi32 = PackageManager.NO_NATIVE_LIBRARIES;
int abi64 = PackageManager.NO_NATIVE_LIBRARIES;
if (Build.SUPPORTED_32_BIT_ABIS.length > 0) {
@@ -462,8 +454,8 @@
final Abis abis = new Abis(primaryCpuAbi, secondaryCpuAbi);
return new Pair<>(abis,
getNativeLibraryPaths(abis, PackageManagerService.sAppLib32InstallDir,
- pkg.getCodePath(), pkg.getBaseCodePath(),
- pkg.isSystem(), pkg.isUpdatedSystemApp()));
+ pkg.getCodePath(), pkg.getBaseCodePath(), pkg.isSystem(),
+ isUpdatedSystemApp));
}
/**
@@ -484,9 +476,11 @@
public String getAdjustedAbiForSharedUser(
Set<PackageSetting> packagesForUser, AndroidPackage scannedPackage) {
String requiredInstructionSet = null;
- if (scannedPackage != null && scannedPackage.getPrimaryCpuAbi() != null) {
- requiredInstructionSet = VMRuntime.getInstructionSet(
- scannedPackage.getPrimaryCpuAbi());
+ if (scannedPackage != null) {
+ String pkgRawPrimaryCpuAbi = AndroidPackageUtils.getRawPrimaryCpuAbi(scannedPackage);
+ if (pkgRawPrimaryCpuAbi != null) {
+ requiredInstructionSet = VMRuntime.getInstructionSet(pkgRawPrimaryCpuAbi);
+ }
}
PackageSetting requirer = null;
@@ -533,7 +527,7 @@
} else {
// requirer == null implies that we're updating all ABIs in the set to
// match scannedPackage.
- adjustedAbi = scannedPackage.getPrimaryCpuAbi();
+ adjustedAbi = AndroidPackageUtils.getRawPrimaryCpuAbi(scannedPackage);
}
return adjustedAbi;
}
diff --git a/services/core/java/com/android/server/pm/PackageDexOptimizer.java b/services/core/java/com/android/server/pm/PackageDexOptimizer.java
index b1b1497..e625aef 100644
--- a/services/core/java/com/android/server/pm/PackageDexOptimizer.java
+++ b/services/core/java/com/android/server/pm/PackageDexOptimizer.java
@@ -38,6 +38,7 @@
import static dalvik.system.DexFile.getSafeModeCompilerFilter;
import static dalvik.system.DexFile.isProfileGuidedCompilerFilter;
+import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
import android.content.pm.ApplicationInfo;
@@ -127,7 +128,7 @@
* <p>Calls to {@link com.android.server.pm.Installer#dexopt} on {@link #mInstaller} are
* synchronized on {@link #mInstallLock}.
*/
- int performDexOpt(AndroidPackage pkg,
+ int performDexOpt(AndroidPackage pkg, @NonNull PackageSetting pkgSetting,
String[] instructionSets, CompilerStats.PackageStats packageStats,
PackageDexUsage.PackageUseInfo packageUseInfo, DexoptOptions options) {
if (pkg.getUid() == -1) {
@@ -140,7 +141,7 @@
synchronized (mInstallLock) {
final long acquireTime = acquireWakeLockLI(pkg.getUid());
try {
- return performDexOptLI(pkg, instructionSets,
+ return performDexOptLI(pkg, pkgSetting, instructionSets,
packageStats, packageUseInfo, options);
} finally {
releaseWakeLockLI(acquireTime);
@@ -153,13 +154,15 @@
* It assumes the install lock is held.
*/
@GuardedBy("mInstallLock")
- private int performDexOptLI(AndroidPackage pkg,
+ private int performDexOptLI(AndroidPackage pkg, @NonNull PackageSetting pkgSetting,
String[] targetInstructionSets, CompilerStats.PackageStats packageStats,
PackageDexUsage.PackageUseInfo packageUseInfo, DexoptOptions options) {
- final List<SharedLibraryInfo> sharedLibraries = pkg.getUsesLibraryInfos();
+ final List<SharedLibraryInfo> sharedLibraries = pkgSetting.getPkgState()
+ .getUsesLibraryInfos();
final String[] instructionSets = targetInstructionSets != null ?
- targetInstructionSets : getAppDexInstructionSets(pkg.getPrimaryCpuAbi(),
- pkg.getSecondaryCpuAbi());
+ targetInstructionSets : getAppDexInstructionSets(
+ AndroidPackageUtils.getPrimaryCpuAbi(pkg, pkgSetting),
+ AndroidPackageUtils.getSecondaryCpuAbi(pkg, pkgSetting));
final String[] dexCodeInstructionSets = getDexCodeInstructionSets(instructionSets);
final List<String> paths = AndroidPackageUtils.getAllCodePaths(pkg);
@@ -233,10 +236,10 @@
// Get the dexopt flags after getRealCompilerFilter to make sure we get the correct
// flags.
- final int dexoptFlags = getDexFlags(pkg, compilerFilter, options);
+ final int dexoptFlags = getDexFlags(pkg, pkgSetting, compilerFilter, options);
for (String dexCodeIsa : dexCodeInstructionSets) {
- int newResult = dexOptPath(pkg, path, dexCodeIsa, compilerFilter,
+ int newResult = dexOptPath(pkg, pkgSetting, path, dexCodeIsa, compilerFilter,
profileUpdated, classLoaderContexts[i], dexoptFlags, sharedGid,
packageStats, options.isDowngrade(), profileName, dexMetadataPath,
options.getCompilationReason());
@@ -261,8 +264,8 @@
* DEX_OPT_SKIPPED if the path does not need to be deopt-ed.
*/
@GuardedBy("mInstallLock")
- private int dexOptPath(AndroidPackage pkg, String path, String isa,
- String compilerFilter, boolean profileUpdated, String classLoaderContext,
+ private int dexOptPath(AndroidPackage pkg, @NonNull PackageSetting pkgSetting, String path,
+ String isa, String compilerFilter, boolean profileUpdated, String classLoaderContext,
int dexoptFlags, int uid, CompilerStats.PackageStats packageStats, boolean downgrade,
String profileName, String dexMetadataPath, int compilationReason) {
int dexoptNeeded = getDexoptNeeded(path, isa, compilerFilter, classLoaderContext,
@@ -271,7 +274,8 @@
return DEX_OPT_SKIPPED;
}
- String oatDir = getPackageOatDirIfSupported(pkg);
+ String oatDir = getPackageOatDirIfSupported(pkg,
+ pkgSetting.getPkgState().isUpdatedSystemApp());
Log.i(TAG, "Running dexopt (dexoptNeeded=" + dexoptNeeded + ") on: " + path
+ " pkg=" + pkg.getPackageName() + " isa=" + isa
@@ -285,9 +289,10 @@
// TODO: Consider adding 2 different APIs for primary and secondary dexopt.
// installd only uses downgrade flag for secondary dex files and ignores it for
// primary dex files.
+ String seInfo = AndroidPackageUtils.getSeInfo(pkg, pkgSetting);
mInstaller.dexopt(path, uid, pkg.getPackageName(), isa, dexoptNeeded, oatDir,
dexoptFlags, compilerFilter, pkg.getVolumeUuid(), classLoaderContext,
- pkg.getSeInfo(), false /* downgrade*/, pkg.getTargetSdkVersion(),
+ seInfo, false /* downgrade*/, pkg.getTargetSdkVersion(),
profileName, dexMetadataPath,
getAugmentedReasonName(compilationReason, dexMetadataPath != null));
@@ -450,10 +455,11 @@
/**
* Dumps the dexopt state of the given package {@code pkg} to the given {@code PrintWriter}.
*/
- void dumpDexoptState(IndentingPrintWriter pw, AndroidPackage pkg,
+ void dumpDexoptState(IndentingPrintWriter pw, AndroidPackage pkg, PackageSetting pkgSetting,
PackageDexUsage.PackageUseInfo useInfo) {
- final String[] instructionSets = getAppDexInstructionSets(pkg.getPrimaryCpuAbi(),
- pkg.getSecondaryCpuAbi());
+ final String[] instructionSets = getAppDexInstructionSets(
+ AndroidPackageUtils.getPrimaryCpuAbi(pkg, pkgSetting),
+ AndroidPackageUtils.getSecondaryCpuAbi(pkg, pkgSetting));
final String[] dexCodeInstructionSets = getDexCodeInstructionSets(instructionSets);
final List<String> paths = AndroidPackageUtils.getAllCodePathsExcludingResourceOnly(pkg);
@@ -587,9 +593,10 @@
info.getHiddenApiEnforcementPolicy(), info.splitDependencies,
info.requestsIsolatedSplitLoading(), compilerFilter, options);
}
- private int getDexFlags(AndroidPackage pkg, String compilerFilter, DexoptOptions options) {
+ private int getDexFlags(AndroidPackage pkg, @NonNull PackageSetting pkgSetting,
+ String compilerFilter, DexoptOptions options) {
return getDexFlags(pkg.isDebuggable(),
- AndroidPackageUtils.getHiddenApiEnforcementPolicy(pkg),
+ AndroidPackageUtils.getHiddenApiEnforcementPolicy(pkg, pkgSetting),
pkg.getSplitDependencies(), pkg.isIsolatedSplitLoading(), compilerFilter,
options);
}
@@ -698,8 +705,8 @@
* not needed or unsupported for the package.
*/
@Nullable
- private String getPackageOatDirIfSupported(AndroidPackage pkg) {
- if (!AndroidPackageUtils.canHaveOatDir(pkg, pkg.isUpdatedSystemApp())) {
+ private String getPackageOatDirIfSupported(AndroidPackage pkg, boolean isUpdatedSystemApp) {
+ if (!AndroidPackageUtils.canHaveOatDir(pkg, isUpdatedSystemApp)) {
return null;
}
File codePath = new File(pkg.getCodePath());
diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java
index 7cb9ef1..41988d6 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerSession.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java
@@ -1169,12 +1169,13 @@
*/
private static boolean isIncrementalInstallationAllowed(String packageName) {
final PackageManagerInternal pmi = LocalServices.getService(PackageManagerInternal.class);
- final AndroidPackage existingPackage = pmi.getPackage(packageName);
- if (existingPackage == null) {
+ final PackageSetting existingPkgSetting = pmi.getPackageSetting(packageName);
+ if (existingPkgSetting == null || existingPkgSetting.pkg == null) {
return true;
}
- return !PackageManagerService.isSystemApp(existingPackage);
+ return !existingPkgSetting.pkg.isSystem()
+ && !existingPkgSetting.getPkgState().isUpdatedSystemApp();
}
/**
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index a66e696..d7eac58 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -2503,15 +2503,18 @@
packageName -> {
synchronized (m.mInstallLock) {
final AndroidPackage pkg;
+ final PackageSetting ps;
final SharedUserSetting sharedUser;
+ final String oldSeInfo;
synchronized (m.mLock) {
- PackageSetting ps = m.mSettings.getPackageLPr(packageName);
+ ps = m.mSettings.getPackageLPr(packageName);
if (ps == null) {
Slog.e(TAG, "Failed to find package setting " + packageName);
return;
}
pkg = ps.pkg;
- sharedUser = ps.sharedUser;
+ sharedUser = ps.getSharedUser();
+ oldSeInfo = AndroidPackageUtils.getSeInfo(pkg, ps);
}
if (pkg == null) {
@@ -2521,10 +2524,10 @@
final String newSeInfo = SELinuxMMAC.getSeInfo(pkg, sharedUser,
m.mInjector.getCompatibility());
- if (!newSeInfo.equals(pkg.getSeInfo())) {
+ if (!newSeInfo.equals(oldSeInfo)) {
Slog.i(TAG, "Updating seInfo for package " + packageName + " from: "
- + pkg.getSeInfo() + " to: " + newSeInfo);
- pkg.mutate().setSeInfo(newSeInfo);
+ + oldSeInfo + " to: " + newSeInfo);
+ ps.getPkgState().setOverrideSeInfo(newSeInfo);
m.prepareAppDataAfterInstallLIF(pkg);
}
}
@@ -3151,7 +3154,7 @@
// Now that we know all of the shared libraries, update all clients to have
// the correct library paths.
- updateAllSharedLibrariesLocked(null, Collections.unmodifiableMap(mPackages));
+ updateAllSharedLibrariesLocked(null, null, Collections.unmodifiableMap(mPackages));
for (SharedUserSetting setting : mSettings.getAllSharedUsersLPw()) {
// NOTE: We ignore potential failures here during a system scan (like
@@ -3179,7 +3182,7 @@
// Now that we know all the packages we are keeping,
// read and update their last usage times.
- mPackageUsage.read(mPackages);
+ mPackageUsage.read(mSettings.mPackages);
mCompilerStats.read();
EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_SCAN_END,
@@ -3478,7 +3481,8 @@
* APK will be installed and the package will be disabled. To recover from this situation,
* the user will need to go into system settings and re-enable the package.
*/
- private boolean enableCompressedPackage(AndroidPackage stubPkg) {
+ private boolean enableCompressedPackage(AndroidPackage stubPkg,
+ @NonNull PackageSetting stubPkgSetting) {
final int parseFlags = mDefParseFlags | PackageParser.PARSE_CHATTY
| PackageParser.PARSE_ENFORCE_CODE;
synchronized (mInstallLock) {
@@ -3489,7 +3493,7 @@
synchronized (mLock) {
prepareAppDataAfterInstallLIF(pkg);
try {
- updateSharedLibrariesLocked(pkg, null,
+ updateSharedLibrariesLocked(pkg, stubPkgSetting, null, null,
Collections.unmodifiableMap(mPackages));
} catch (PackageManagerException e) {
Slog.e(TAG, "updateAllSharedLibrariesLPw failed: ", e);
@@ -4146,7 +4150,7 @@
? Collections.emptySet() : permissionsState.getPermissions(userId);
PackageInfo packageInfo = PackageInfoUtils.generate(p, gids, flags,
- ps.firstInstallTime, ps.lastUpdateTime, permissions, state, userId);
+ ps.firstInstallTime, ps.lastUpdateTime, permissions, state, userId, ps);
if (packageInfo == null) {
return null;
@@ -4654,7 +4658,7 @@
return null;
}
ApplicationInfo ai = PackageInfoUtils.generateApplicationInfo(ps.pkg, flags,
- ps.readUserState(userId), userId);
+ ps.readUserState(userId), userId, ps);
if (ai != null) {
ai.packageName = resolveExternalPackageNameLPr(ps.pkg);
}
@@ -4706,7 +4710,7 @@
}
// Note: isEnabledLP() does not apply here - always return info
ApplicationInfo ai = PackageInfoUtils.generateApplicationInfo(
- p, flags, ps.readUserState(userId), userId);
+ p, flags, ps.readUserState(userId), userId, ps);
if (ai != null) {
ai.packageName = resolveExternalPackageNameLPr(p);
}
@@ -5090,7 +5094,7 @@
return null;
}
return PackageInfoUtils.generateActivityInfo(pkg,
- a, flags, ps.readUserState(userId), userId);
+ a, flags, ps.readUserState(userId), userId, ps);
}
if (mResolveComponentName.equals(component)) {
return PackageParser.generateActivityInfo(
@@ -5177,7 +5181,7 @@
return null;
}
return PackageInfoUtils.generateActivityInfo(pkg,
- a, flags, ps.readUserState(userId), userId);
+ a, flags, ps.readUserState(userId), userId, ps);
}
}
return null;
@@ -5398,7 +5402,7 @@
return null;
}
return PackageInfoUtils.generateServiceInfo(pkg,
- s, flags, ps.readUserState(userId), userId);
+ s, flags, ps.readUserState(userId), userId, ps);
}
}
return null;
@@ -5432,7 +5436,7 @@
return null;
}
PackageUserState state = ps.readUserState(userId);
- return PackageInfoUtils.generateProviderInfo(pkg, p, flags, state, userId);
+ return PackageInfoUtils.generateProviderInfo(pkg, p, flags, state, userId, ps);
}
}
return null;
@@ -8270,7 +8274,7 @@
continue;
}
ai = PackageInfoUtils.generateApplicationInfo(ps.pkg, effectiveFlags,
- ps.readUserState(userId), userId);
+ ps.readUserState(userId), userId, ps);
if (ai != null) {
ai.packageName = resolveExternalPackageNameLPr(ps.pkg);
}
@@ -8296,7 +8300,7 @@
continue;
}
ApplicationInfo ai = PackageInfoUtils.generateApplicationInfo(p, flags,
- ps.readUserState(userId), userId);
+ ps.readUserState(userId), userId, ps);
if (ai != null) {
ai.packageName = resolveExternalPackageNameLPr(p);
list.add(ai);
@@ -8455,7 +8459,7 @@
PackageSetting ps = mSettings.mPackages.get(p.getPackageName());
if (ps != null) {
ApplicationInfo ai = PackageInfoUtils.generateApplicationInfo(p, flags,
- ps.readUserState(userId), userId);
+ ps.readUserState(userId), userId, ps);
if (ai != null) {
finalList.add(ai);
}
@@ -8561,7 +8565,7 @@
return null;
}
final ParsedInstrumentation i = mInstrumentation.get(component);
- return PackageInfoUtils.generateInstrumentationInfo(i, pkg, flags, callingUserId);
+ return PackageInfoUtils.generateInstrumentationInfo(i, pkg, flags, callingUserId, ps);
}
}
@@ -8589,10 +8593,12 @@
final ParsedInstrumentation p = i.next();
if (targetPackage == null
|| targetPackage.equals(p.getTargetPackage())) {
- AndroidPackage pkg = mPackages.get(p.getPackageName());
+ String packageName = p.getPackageName();
+ AndroidPackage pkg = mPackages.get(packageName);
+ PackageSetting pkgSetting = getPackageSetting(packageName);
if (pkg != null) {
InstrumentationInfo ii = PackageInfoUtils.generateInstrumentationInfo(p,
- pkg, flags, userId);
+ pkg, flags, userId, pkgSetting);
if (ii != null) {
finalList.add(ii);
}
@@ -8918,8 +8924,8 @@
final ScanRequest request = new ScanRequest(parsedPackage, sharedUserSetting,
null, disabledPkgSetting /* pkgSetting */,
null /* disabledPkgSetting */, null /* originalPkgSetting */,
- null, parseFlags, scanFlags, isPlatformPackage, user);
- applyPolicy(parsedPackage, parseFlags, scanFlags, mPlatformPackage);
+ null, parseFlags, scanFlags, isPlatformPackage, user, null);
+ applyPolicy(parsedPackage, parseFlags, scanFlags, mPlatformPackage, true);
final ScanResult scanResult =
scanPackageOnlyLI(request, mInjector, mFactoryTest, -1L);
if (scanResult.existingSettingCopied && scanResult.request.pkgSetting != null) {
@@ -9053,7 +9059,7 @@
}
final ScanResult scanResult = scanPackageNewLI(parsedPackage, parseFlags, scanFlags
- | SCAN_UPDATE_SIGNATURE, currentTime, user);
+ | SCAN_UPDATE_SIGNATURE, currentTime, user, null);
if (scanResult.success) {
synchronized (mLock) {
boolean appIdCreated = false;
@@ -9193,9 +9199,15 @@
return;
}
- List<AndroidPackage> pkgs;
+ List<PackageSetting> pkgSettings;
synchronized (mLock) {
- pkgs = PackageManagerServiceUtils.getPackagesForDexopt(mPackages.values(), this);
+ pkgSettings = PackageManagerServiceUtils.getPackagesForDexopt(
+ mSettings.mPackages.values(), this);
+ }
+
+ List<AndroidPackage> pkgs = new ArrayList<>(pkgSettings.size());
+ for (int index = 0; index < pkgSettings.size(); index++) {
+ pkgs.add(pkgSettings.get(index).pkg);
}
final long startTime = System.nanoTime();
@@ -9394,11 +9406,11 @@
@GuardedBy("mLock")
private void notifyPackageUseLocked(String packageName, int reason) {
- final AndroidPackage p = mPackages.get(packageName);
- if (p == null) {
+ final PackageSetting pkgSetting = mSettings.getPackageLPr(packageName);
+ if (pkgSetting == null) {
return;
}
- p.mutate().setLastPackageUsageTimeInMills(reason, System.currentTimeMillis());
+ pkgSetting.getPkgState().setLastPackageUsageTimeInMills(reason, System.currentTimeMillis());
}
@Override
@@ -9526,19 +9538,21 @@
// if the package can now be considered up to date for the given filter.
private int performDexOptInternal(DexoptOptions options) {
AndroidPackage p;
+ PackageSetting pkgSetting;
synchronized (mLock) {
p = mPackages.get(options.getPackageName());
- if (p == null) {
+ pkgSetting = mSettings.getPackageLPr(options.getPackageName());
+ if (p == null || pkgSetting == null) {
// Package could not be found. Report failure.
return PackageDexOptimizer.DEX_OPT_FAILED;
}
- mPackageUsage.maybeWriteAsync(mPackages);
+ mPackageUsage.maybeWriteAsync(mSettings.mPackages);
mCompilerStats.maybeWriteAsync();
}
long callingId = Binder.clearCallingIdentity();
try {
synchronized (mInstallLock) {
- return performDexOptInternalWithDependenciesLI(p, options);
+ return performDexOptInternalWithDependenciesLI(p, pkgSetting, options);
}
} finally {
Binder.restoreCallingIdentity(callingId);
@@ -9558,7 +9572,7 @@
}
private int performDexOptInternalWithDependenciesLI(AndroidPackage p,
- DexoptOptions options) {
+ @NonNull PackageSetting pkgSetting, DexoptOptions options) {
// Select the dex optimizer based on the force parameter.
// Note: The force option is rarely used (cmdline input for testing, mostly), so it's OK to
// allocate an object here.
@@ -9573,9 +9587,10 @@
// at boot, or background job), the passed 'targetCompilerFilter' stays the same,
// and the first package that uses the library will dexopt it. The
// others will see that the compiled code for the library is up to date.
- Collection<SharedLibraryInfo> deps = findSharedLibraries(p);
- final String[] instructionSets = getAppDexInstructionSets(p.getPrimaryCpuAbi(),
- p.getSecondaryCpuAbi());
+ Collection<SharedLibraryInfo> deps = findSharedLibraries(pkgSetting);
+ final String[] instructionSets = getAppDexInstructionSets(
+ AndroidPackageUtils.getPrimaryCpuAbi(p, pkgSetting),
+ AndroidPackageUtils.getSecondaryCpuAbi(p, pkgSetting));
if (!deps.isEmpty()) {
DexoptOptions libraryOptions = new DexoptOptions(options.getPackageName(),
options.getCompilationReason(), options.getCompilerFilter(),
@@ -9583,12 +9598,14 @@
options.getFlags() | DexoptOptions.DEXOPT_AS_SHARED_LIBRARY);
for (SharedLibraryInfo info : deps) {
AndroidPackage depPackage = null;
+ PackageSetting depPackageSetting = null;
synchronized (mLock) {
depPackage = mPackages.get(info.getPackageName());
+ depPackageSetting = mSettings.getPackageLPr(info.getPackageName());
}
- if (depPackage != null) {
+ if (depPackage != null && depPackageSetting != null) {
// TODO: Analyze and investigate if we (should) profile libraries.
- pdo.performDexOpt(depPackage, instructionSets,
+ pdo.performDexOpt(depPackage, depPackageSetting, instructionSets,
getOrCreateCompilerPackageStats(depPackage),
mDexManager.getPackageUseInfoOrDefault(depPackage.getPackageName()),
libraryOptions);
@@ -9597,7 +9614,8 @@
}
}
}
- return pdo.performDexOpt(p, instructionSets,
+
+ return pdo.performDexOpt(p, pkgSetting, instructionSets,
getOrCreateCompilerPackageStats(p),
mDexManager.getPackageUseInfoOrDefault(p.getPackageName()), options);
}
@@ -9640,11 +9658,11 @@
}
}
- private static List<SharedLibraryInfo> findSharedLibraries(AndroidPackage p) {
- if (p.getUsesLibraryInfos() != null) {
+ private static List<SharedLibraryInfo> findSharedLibraries(PackageSetting pkgSetting) {
+ if (!pkgSetting.getPkgState().getUsesLibraryInfos().isEmpty()) {
ArrayList<SharedLibraryInfo> retValue = new ArrayList<>();
Set<String> collectedNames = new HashSet<>();
- for (SharedLibraryInfo info : p.getUsesLibraryInfos()) {
+ for (SharedLibraryInfo info : pkgSetting.getPkgState().getUsesLibraryInfos()) {
findSharedLibrariesRecursive(info, retValue, collectedNames);
}
return retValue;
@@ -9667,15 +9685,16 @@
}
}
- List<AndroidPackage> findSharedNonSystemLibraries(AndroidPackage pkg) {
- List<SharedLibraryInfo> deps = findSharedLibraries(pkg);
+ List<PackageSetting> findSharedNonSystemLibraries(PackageSetting pkgSetting) {
+ List<SharedLibraryInfo> deps = findSharedLibraries(pkgSetting);
if (!deps.isEmpty()) {
- ArrayList<AndroidPackage> retValue = new ArrayList<>();
+ List<PackageSetting> retValue = new ArrayList<>();
synchronized (mLock) {
for (SharedLibraryInfo info : deps) {
- AndroidPackage depPackage = mPackages.get(info.getPackageName());
- if (depPackage != null) {
- retValue.add(depPackage);
+ PackageSetting depPackageSetting =
+ mSettings.getPackageLPr(info.getPackageName());
+ if (depPackageSetting != null && depPackageSetting.pkg != null) {
+ retValue.add(depPackageSetting);
}
}
}
@@ -9747,7 +9766,7 @@
}
public void shutdown() {
- mPackageUsage.writeNow(mPackages);
+ mPackageUsage.writeNow(mSettings.mPackages);
mCompilerStats.writeNow();
mDexManager.writePackageDexUsageNow();
PackageWatchdog.getInstance(mContext).writeNow();
@@ -9793,9 +9812,11 @@
enforceSystemOrRoot("forceDexOpt");
AndroidPackage pkg;
+ PackageSetting pkgSetting;
synchronized (mLock) {
pkg = mPackages.get(packageName);
- if (pkg == null) {
+ pkgSetting = mSettings.getPackageLPr(packageName);
+ if (pkg == null || pkgSetting == null) {
throw new IllegalArgumentException("Unknown package: " + packageName);
}
}
@@ -9805,8 +9826,7 @@
// Whoever is calling forceDexOpt wants a compiled package.
// Don't use profiles since that may cause compilation to be skipped.
- final int res = performDexOptInternalWithDependenciesLI(
- pkg,
+ final int res = performDexOptInternalWithDependenciesLI(pkg, pkgSetting,
new DexoptOptions(packageName,
getDefaultCompilerFilter(),
DexoptOptions.DEXOPT_FORCE | DexoptOptions.DEXOPT_BOOT_COMPLETE));
@@ -9963,40 +9983,44 @@
@GuardedBy("mLock")
private void addSharedLibraryLPr(AndroidPackage pkg, Set<String> usesLibraryFiles,
- SharedLibraryInfo libInfo, AndroidPackage changingLib) {
+ SharedLibraryInfo libInfo, @Nullable AndroidPackage changingLib,
+ @Nullable PackageSetting changingLibSetting) {
if (libInfo.getPath() != null) {
usesLibraryFiles.add(libInfo.getPath());
return;
}
- AndroidPackage p = mPackages.get(libInfo.getPackageName());
+ AndroidPackage pkgForCodePaths = mPackages.get(libInfo.getPackageName());
+ PackageSetting pkgSetting = mSettings.getPackageLPr(libInfo.getPackageName());
if (changingLib != null && changingLib.getPackageName().equals(libInfo.getPackageName())) {
// If we are doing this while in the middle of updating a library apk,
// then we need to make sure to use that new apk for determining the
// dependencies here. (We haven't yet finished committing the new apk
// to the package manager state.)
- if (p == null || p.getPackageName().equals(changingLib.getPackageName())) {
- p = changingLib;
+ if (pkgForCodePaths == null
+ || pkgForCodePaths.getPackageName().equals(changingLib.getPackageName())) {
+ pkgForCodePaths = changingLib;
+ pkgSetting = changingLibSetting;
}
}
- if (p != null) {
- usesLibraryFiles.addAll(AndroidPackageUtils.getAllCodePaths(p));
+ if (pkgForCodePaths != null) {
+ usesLibraryFiles.addAll(AndroidPackageUtils.getAllCodePaths(pkgForCodePaths));
// If the package provides libraries, add the dependency to them.
- applyDefiningSharedLibraryUpdateLocked(pkg, libInfo, (definingLibrary, dependency) -> {
- definingLibrary.addDependency(dependency);
- });
- if (p.getUsesLibraryFiles() != null) {
- Collections.addAll(usesLibraryFiles, p.getUsesLibraryFiles());
+ applyDefiningSharedLibraryUpdateLocked(pkg, libInfo, SharedLibraryInfo::addDependency);
+ if (pkgSetting != null) {
+ usesLibraryFiles.addAll(pkgSetting.getPkgState().getUsesLibraryFiles());
}
}
}
@GuardedBy("mLock")
- private void updateSharedLibrariesLocked(AndroidPackage pkg,
- AndroidPackage changingLib, Map<String, AndroidPackage> availablePackages)
- throws PackageManagerException {
- final ArrayList<SharedLibraryInfo> sharedLibraryInfos =
- collectSharedLibraryInfos(pkg, availablePackages, mSharedLibraries, null);
- executeSharedLibrariesUpdateLPr(pkg, changingLib, sharedLibraryInfos);
+ private void updateSharedLibrariesLocked(AndroidPackage pkg, PackageSetting pkgSetting,
+ @Nullable AndroidPackage changingLib, @Nullable PackageSetting changingLibSetting,
+ Map<String, AndroidPackage> availablePackages)
+ throws PackageManagerException {
+ final ArrayList<SharedLibraryInfo> sharedLibraryInfos = collectSharedLibraryInfos(
+ pkgSetting.pkg, availablePackages, mSharedLibraries, null);
+ executeSharedLibrariesUpdateLPr(pkg, pkgSetting, changingLib, changingLibSetting,
+ sharedLibraryInfos);
}
private static ArrayList<SharedLibraryInfo> collectSharedLibraryInfos(AndroidPackage pkg,
@@ -10031,25 +10055,27 @@
}
private void executeSharedLibrariesUpdateLPr(AndroidPackage pkg,
- AndroidPackage changingLib, ArrayList<SharedLibraryInfo> usesLibraryInfos) {
+ @NonNull PackageSetting pkgSetting, @Nullable AndroidPackage changingLib,
+ @Nullable PackageSetting changingLibSetting,
+ ArrayList<SharedLibraryInfo> usesLibraryInfos) {
// If the package provides libraries, clear their old dependencies.
// This method will set them up again.
applyDefiningSharedLibraryUpdateLocked(pkg, null, (definingLibrary, dependency) -> {
definingLibrary.clearDependencies();
});
if (usesLibraryInfos != null) {
- pkg.mutate().setUsesLibraryInfos(usesLibraryInfos);
+ pkgSetting.getPkgState().setUsesLibraryInfos(usesLibraryInfos);
// Use LinkedHashSet to preserve the order of files added to
// usesLibraryFiles while eliminating duplicates.
Set<String> usesLibraryFiles = new LinkedHashSet<>();
for (SharedLibraryInfo libInfo : usesLibraryInfos) {
- addSharedLibraryLPr(pkg, usesLibraryFiles, libInfo, changingLib);
+ addSharedLibraryLPr(pkg, usesLibraryFiles, libInfo, changingLib,
+ changingLibSetting);
}
- pkg.mutate().setUsesLibraryFiles(usesLibraryFiles.toArray(
- new String[usesLibraryFiles.size()]));
+ pkgSetting.getPkgState().setUsesLibraryFiles(new ArrayList<>(usesLibraryFiles));
} else {
- pkg.mutate().setUsesLibraryInfos(null)
- .setUsesLibraryFiles(null);
+ pkgSetting.getPkgState().setUsesLibraryInfos(Collections.emptyList())
+ .setUsesLibraryFiles(Collections.emptyList());
}
}
@@ -10165,27 +10191,32 @@
@GuardedBy("mLock")
private ArrayList<AndroidPackage> updateAllSharedLibrariesLocked(
- AndroidPackage updatedPkg,
+ @Nullable AndroidPackage updatedPkg, @Nullable PackageSetting updatedPkgSetting,
Map<String, AndroidPackage> availablePackages) {
ArrayList<AndroidPackage> resultList = null;
// Set of all descendants of a library; used to eliminate cycles
ArraySet<String> descendants = null;
// The current list of packages that need updating
- ArrayList<AndroidPackage> needsUpdating = null;
- if (updatedPkg != null) {
+ List<Pair<AndroidPackage, PackageSetting>> needsUpdating = null;
+ if (updatedPkg != null && updatedPkgSetting != null) {
needsUpdating = new ArrayList<>(1);
- needsUpdating.add(updatedPkg);
+ needsUpdating.add(Pair.create(updatedPkg, updatedPkgSetting));
}
do {
- final AndroidPackage changingPkg =
+ final Pair<AndroidPackage, PackageSetting> changingPkgPair =
(needsUpdating == null) ? null : needsUpdating.remove(0);
+ final AndroidPackage changingPkg = changingPkgPair != null
+ ? changingPkgPair.first : null;
+ final PackageSetting changingPkgSetting = changingPkgPair != null
+ ? changingPkgPair.second : null;
for (int i = mPackages.size() - 1; i >= 0; --i) {
final AndroidPackage pkg = mPackages.valueAt(i);
+ final PackageSetting pkgSetting = mSettings.getPackageLPr(pkg.getPackageName());
if (changingPkg != null
&& !hasString(pkg.getUsesLibraries(), changingPkg.getLibraryNames())
&& !hasString(pkg.getUsesOptionalLibraries(), changingPkg.getLibraryNames())
&& !ArrayUtils.contains(pkg.getUsesStaticLibraries(),
- changingPkg.getStaticSharedLibName())) {
+ changingPkg.getStaticSharedLibName())) {
continue;
}
if (resultList == null) {
@@ -10199,19 +10230,20 @@
}
if (!descendants.contains(pkg.getPackageName())) {
descendants.add(pkg.getPackageName());
- needsUpdating.add(pkg);
+ needsUpdating.add(Pair.create(pkg, pkgSetting));
}
}
try {
- updateSharedLibrariesLocked(pkg, changingPkg, availablePackages);
+ updateSharedLibrariesLocked(pkg, pkgSetting, changingPkg,
+ changingPkgSetting, availablePackages);
} catch (PackageManagerException e) {
// If a system app update or an app and a required lib missing we
// delete the package and for updated system apps keep the data as
// it is better for the user to reinstall than to be in an limbo
// state. Also libs disappearing under an app should never happen
// - just in case.
- if (!pkg.isSystem() || pkg.isUpdatedSystemApp()) {
- final int flags = pkg.isUpdatedSystemApp()
+ if (!pkg.isSystem() || pkgSetting.getPkgState().isUpdatedSystemApp()) {
+ final int flags = pkgSetting.getPkgState().isUpdatedSystemApp()
? PackageManager.DELETE_KEEP_DATA : 0;
deletePackageLIF(pkg.getPackageName(), null, true,
mUserManager.getUserIds(), flags, null,
@@ -10227,10 +10259,11 @@
@GuardedBy({"mInstallLock", "mLock"})
private ScanResult scanPackageTracedLI(ParsedPackage parsedPackage,
final @ParseFlags int parseFlags, @ScanFlags int scanFlags, long currentTime,
- @Nullable UserHandle user) throws PackageManagerException {
+ @Nullable UserHandle user, String cpuAbiOverride) throws PackageManagerException {
Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "scanPackage");
try {
- return scanPackageNewLI(parsedPackage, parseFlags, scanFlags, currentTime, user);
+ return scanPackageNewLI(parsedPackage, parseFlags, scanFlags, currentTime, user,
+ cpuAbiOverride);
} finally {
Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
}
@@ -10305,6 +10338,9 @@
@Nullable public final UserHandle user;
/** Whether or not the platform package is being scanned */
public final boolean isPlatformPackage;
+ /** Override value for package ABI if set during install */
+ @Nullable
+ public final String cpuAbiOverride;
public ScanRequest(
@NonNull ParsedPackage parsedPackage,
@Nullable SharedUserSetting sharedUserSetting,
@@ -10316,7 +10352,8 @@
@ParseFlags int parseFlags,
@ScanFlags int scanFlags,
boolean isPlatformPackage,
- @Nullable UserHandle user) {
+ @Nullable UserHandle user,
+ @Nullable String cpuAbiOverride) {
this.parsedPackage = parsedPackage;
this.oldPkg = oldPkg;
this.pkgSetting = pkgSetting;
@@ -10329,6 +10366,7 @@
this.scanFlags = scanFlags;
this.isPlatformPackage = isPlatformPackage;
this.user = user;
+ this.cpuAbiOverride = cpuAbiOverride;
}
}
@@ -10436,7 +10474,7 @@
@GuardedBy({"mInstallLock", "mLock"})
private ScanResult scanPackageNewLI(@NonNull ParsedPackage parsedPackage,
final @ParseFlags int parseFlags, @ScanFlags int scanFlags, long currentTime,
- @Nullable UserHandle user) throws PackageManagerException {
+ @Nullable UserHandle user, String cpuAbiOverride) throws PackageManagerException {
final String renamedPkgName = mSettings.getRenamedPackageLPr(
parsedPackage.getRealPackage());
@@ -10457,7 +10495,13 @@
scanFlags = adjustScanFlags(scanFlags, pkgSetting, disabledPkgSetting, user, parsedPackage);
synchronized (mLock) {
- applyPolicy(parsedPackage, parseFlags, scanFlags, mPlatformPackage);
+ boolean isUpdatedSystemApp;
+ if (pkgSetting != null) {
+ isUpdatedSystemApp = pkgSetting.getPkgState().isUpdatedSystemApp();
+ } else {
+ isUpdatedSystemApp = disabledPkgSetting != null;
+ }
+ applyPolicy(parsedPackage, parseFlags, scanFlags, mPlatformPackage, isUpdatedSystemApp);
assertPackageIsValid(parsedPackage, parseFlags, scanFlags);
SharedUserSetting sharedUserSetting = null;
@@ -10477,7 +10521,8 @@
final ScanRequest request = new ScanRequest(parsedPackage, sharedUserSetting,
pkgSetting == null ? null : pkgSetting.pkg, pkgSetting, disabledPkgSetting,
originalPkgSetting, realPkgName, parseFlags, scanFlags,
- Objects.equals(parsedPackage.getPackageName(), platformPackageName), user);
+ Objects.equals(parsedPackage.getPackageName(), platformPackageName), user,
+ cpuAbiOverride);
return scanPackageOnlyLI(request, mInjector, mFactoryTest, currentTime);
}
}
@@ -10579,7 +10624,8 @@
}
if (reconciledPkg.collectedSharedLibraryInfos != null) {
- executeSharedLibrariesUpdateLPr(pkg, null, reconciledPkg.collectedSharedLibraryInfos);
+ executeSharedLibrariesUpdateLPr(pkg, pkgSetting, null, null,
+ reconciledPkg.collectedSharedLibraryInfos);
}
final KeySetManagerService ksms = mSettings.mKeySetManagerService;
@@ -10727,19 +10773,21 @@
}
ps.primaryCpuAbiString = adjustedAbi;
- if (ps.pkg != null && !TextUtils.equals(adjustedAbi, ps.pkg.getPrimaryCpuAbi())) {
- ps.pkg.mutate().setPrimaryCpuAbi(adjustedAbi);
- if (DEBUG_ABI_SELECTION) {
- Slog.i(TAG,
- "Adjusting ABI for " + ps.name + " to " + adjustedAbi
- + " (scannedPackage="
- + (scannedPackage != null ? scannedPackage : "null")
- + ")");
+ if (ps.pkg != null) {
+ if (!TextUtils.equals(adjustedAbi,
+ AndroidPackageUtils.getRawPrimaryCpuAbi(ps.pkg))) {
+ if (DEBUG_ABI_SELECTION) {
+ Slog.i(TAG,
+ "Adjusting ABI for " + ps.name + " to " + adjustedAbi
+ + " (scannedPackage="
+ + (scannedPackage != null ? scannedPackage : "null")
+ + ")");
+ }
+ if (changedAbiCodePath == null) {
+ changedAbiCodePath = new ArrayList<>();
+ }
+ changedAbiCodePath.add(ps.codePathString);
}
- if (changedAbiCodePath == null) {
- changedAbiCodePath = new ArrayList<>();
- }
- changedAbiCodePath.add(ps.codePathString);
}
}
}
@@ -10878,7 +10926,8 @@
pkgSetting = Settings.createNewSetting(parsedPackage.getPackageName(),
originalPkgSetting, disabledPkgSetting, realPkgName, sharedUserSetting,
destCodeFile, destResourceFile, parsedPackage.getNativeLibraryRootDir(),
- parsedPackage.getPrimaryCpuAbi(), parsedPackage.getSecondaryCpuAbi(),
+ AndroidPackageUtils.getRawPrimaryCpuAbi(parsedPackage),
+ AndroidPackageUtils.getRawSecondaryCpuAbi(parsedPackage),
parsedPackage.getVersionCode(),
PackageInfoWithoutStateUtils.appInfoFlags(parsedPackage),
PackageInfoWithoutStateUtils.appInfoPrivateFlags(parsedPackage),
@@ -10897,7 +10946,8 @@
// to null here, only to reset them at a later point.
Settings.updatePackageSetting(pkgSetting, disabledPkgSetting, sharedUserSetting,
destCodeFile, destResourceFile, parsedPackage.getNativeLibraryDir(),
- parsedPackage.getPrimaryCpuAbi(), parsedPackage.getSecondaryCpuAbi(),
+ AndroidPackageUtils.getRawPrimaryCpuAbi(parsedPackage),
+ AndroidPackageUtils.getRawSecondaryCpuAbi(parsedPackage),
PackageInfoWithoutStateUtils.appInfoFlags(parsedPackage),
PackageInfoWithoutStateUtils.appInfoPrivateFlags(parsedPackage),
UserManagerService.getInstance(),
@@ -10928,7 +10978,7 @@
if (disabledPkgSetting != null
|| (0 != (scanFlags & SCAN_NEW_INSTALL)
&& pkgSetting != null && pkgSetting.isSystem())) {
- parsedPackage.mutate().setUpdatedSystemApp(true);
+ pkgSetting.getPkgState().setUpdatedSystemApp(true);
}
parsedPackage
@@ -10941,15 +10991,15 @@
configurePackageComponents(parsedPackage);
}
- final String cpuAbiOverride = deriveAbiOverride(parsedPackage.getCpuAbiOverride(),
- pkgSetting);
+ final String cpuAbiOverride = deriveAbiOverride(request.cpuAbiOverride, pkgSetting);
if ((scanFlags & SCAN_NEW_INSTALL) == 0) {
if (needToDeriveAbi) {
Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "derivePackageAbi");
final boolean extractNativeLibs = !AndroidPackageUtils.isLibrary(parsedPackage);
final Pair<PackageAbiHelper.Abis, PackageAbiHelper.NativeLibraryPaths> derivedAbi =
- packageAbiHelper.derivePackageAbi(parsedPackage, cpuAbiOverride,
+ packageAbiHelper.derivePackageAbi(parsedPackage,
+ pkgSetting.getPkgState().isUpdatedSystemApp(), cpuAbiOverride,
extractNativeLibs);
derivedAbi.first.applyTo(parsedPackage);
derivedAbi.second.applyTo(parsedPackage);
@@ -10958,14 +11008,16 @@
// Some system apps still use directory structure for native libraries
// in which case we might end up not detecting abi solely based on apk
// structure. Try to detect abi based on directory structure.
- if (parsedPackage.isSystem() && !parsedPackage.isUpdatedSystemApp() &&
- parsedPackage.getPrimaryCpuAbi() == null) {
+
+ String pkgRawPrimaryCpuAbi = AndroidPackageUtils.getRawPrimaryCpuAbi(parsedPackage);
+ if (parsedPackage.isSystem() && !pkgSetting.getPkgState().isUpdatedSystemApp() &&
+ pkgRawPrimaryCpuAbi == null) {
final PackageAbiHelper.Abis abis = packageAbiHelper.getBundledAppAbis(
parsedPackage);
abis.applyTo(parsedPackage);
abis.applyTo(pkgSetting);
final PackageAbiHelper.NativeLibraryPaths nativeLibraryPaths =
- packageAbiHelper.getNativeLibraryPaths(parsedPackage,
+ packageAbiHelper.getNativeLibraryPaths(parsedPackage, pkgSetting,
sAppLib32InstallDir);
nativeLibraryPaths.applyTo(parsedPackage);
}
@@ -10977,13 +11029,16 @@
.setSecondaryCpuAbi(secondaryCpuAbiFromSettings);
final PackageAbiHelper.NativeLibraryPaths nativeLibraryPaths =
- packageAbiHelper.getNativeLibraryPaths(parsedPackage, sAppLib32InstallDir);
+ packageAbiHelper.getNativeLibraryPaths(parsedPackage,
+ pkgSetting, sAppLib32InstallDir);
nativeLibraryPaths.applyTo(parsedPackage);
if (DEBUG_ABI_SELECTION) {
Slog.i(TAG, "Using ABIS and native lib paths from settings : " +
- parsedPackage.getPackageName() + " " + parsedPackage.getPrimaryCpuAbi()
- + ", " + parsedPackage.getSecondaryCpuAbi());
+ parsedPackage.getPackageName() + " " +
+ AndroidPackageUtils.getRawPrimaryCpuAbi(parsedPackage)
+ + ", "
+ + AndroidPackageUtils.getRawSecondaryCpuAbi(parsedPackage));
}
}
} else {
@@ -11000,7 +11055,8 @@
// ABIs we determined during compilation, but the path will depend on the final
// package path (after the rename away from the stage path).
final PackageAbiHelper.NativeLibraryPaths nativeLibraryPaths =
- packageAbiHelper.getNativeLibraryPaths(parsedPackage, sAppLib32InstallDir);
+ packageAbiHelper.getNativeLibraryPaths(parsedPackage, pkgSetting,
+ sAppLib32InstallDir);
nativeLibraryPaths.applyTo(parsedPackage);
}
@@ -11024,14 +11080,10 @@
}
}
- pkgSetting.primaryCpuAbiString = parsedPackage.getPrimaryCpuAbi();
- pkgSetting.secondaryCpuAbiString = parsedPackage.getSecondaryCpuAbi();
+ pkgSetting.primaryCpuAbiString = AndroidPackageUtils.getRawPrimaryCpuAbi(parsedPackage);
+ pkgSetting.secondaryCpuAbiString = AndroidPackageUtils.getRawSecondaryCpuAbi(parsedPackage);
pkgSetting.cpuAbiOverrideString = cpuAbiOverride;
- // Copy the derived override back to the parsed package, so that we can
- // update the package settings accordingly.
- parsedPackage.setCpuAbiOverride(cpuAbiOverride);
-
if (DEBUG_ABI_SELECTION) {
Slog.d(TAG, "Resolved nativeLibraryRoot for " + parsedPackage.getPackageName()
+ " to root=" + parsedPackage.getNativeLibraryRootDir() + ", isa="
@@ -11044,8 +11096,8 @@
if (DEBUG_ABI_SELECTION) {
Log.d(TAG, "Abis for package[" + parsedPackage.getPackageName() + "] are" +
- " primary=" + parsedPackage.getPrimaryCpuAbi() +
- " secondary=" + parsedPackage.getSecondaryCpuAbi());
+ " primary=" + AndroidPackageUtils.getRawPrimaryCpuAbi(parsedPackage) +
+ " secondary=" + AndroidPackageUtils.getRawSecondaryCpuAbi(parsedPackage));
}
if ((scanFlags & SCAN_BOOTING) == 0 && pkgSetting.sharedUser != null) {
@@ -11177,7 +11229,8 @@
* ideally be static, but, it requires locks to read system state.
*/
private static void applyPolicy(ParsedPackage parsedPackage, final @ParseFlags int parseFlags,
- final @ScanFlags int scanFlags, AndroidPackage platformPkg) {
+ final @ScanFlags int scanFlags, AndroidPackage platformPkg,
+ boolean isUpdatedSystemApp) {
if ((scanFlags & SCAN_AS_SYSTEM) != 0) {
parsedPackage.setSystem(true);
// TODO(b/135203078): Can this be done in PackageParser? Or just inferred when the flag
@@ -11228,7 +11281,7 @@
.clearAdoptPermissions();
}
- PackageBackwardCompatibility.modifySharedLibraries(parsedPackage);
+ PackageBackwardCompatibility.modifySharedLibraries(parsedPackage, isUpdatedSystemApp);
}
private static @NonNull <T> T assertNotNull(@Nullable T object, String message)
@@ -11743,14 +11796,16 @@
reconciledPkg.getCombinedAvailablePackages();
try {
// Shared libraries for the package need to be updated.
- updateSharedLibrariesLocked(pkg, null, combinedSigningDetails);
+ updateSharedLibrariesLocked(pkg, pkgSetting, null, null,
+ combinedSigningDetails);
} catch (PackageManagerException e) {
Slog.e(TAG, "updateSharedLibrariesLPr failed: ", e);
}
// Update all applications that use this library. Skip when booting
// since this will be done after all packages are scaned.
if ((scanFlags & SCAN_BOOTING) == 0) {
- clientLibPkgs = updateAllSharedLibrariesLocked(pkg, combinedSigningDetails);
+ clientLibPkgs = updateAllSharedLibrariesLocked(pkg, pkgSetting,
+ combinedSigningDetails);
}
}
}
@@ -12411,18 +12466,12 @@
if (pkgSetting == null || !pkgSetting.isSystem()) {
return;
}
- AndroidPackage pkg = pkgSetting.pkg;
- if (pkg != null) {
- pkg.mutate().setHiddenUntilInstalled(hidden);
- }
+ pkgSetting.getPkgState().setHiddenUntilInstalled(hidden);
final PackageSetting disabledPs = mSettings.getDisabledSystemPkgLPr(packageName);
if (disabledPs == null) {
return;
}
- pkg = disabledPs.pkg;
- if (pkg != null) {
- pkg.mutate().setHiddenUntilInstalled(hidden);
- }
+ disabledPs.getPkgState().setHiddenUntilInstalled(hidden);
}
}
@@ -13735,7 +13784,6 @@
ServiceManager.getService(Context.ROLLBACK_SERVICE));
final String packageName = res.pkg.getPackageName();
- final String seInfo = res.pkg.getSeInfo();
final int[] allUsers = mUserManager.getUserIds();
final int[] installedUsers;
@@ -13759,6 +13807,7 @@
|| (data.args.installFlags & PackageManager.INSTALL_REQUEST_DOWNGRADE) != 0);
if (ps != null && doSnapshotOrRestore) {
+ final String seInfo = AndroidPackageUtils.getSeInfo(res.pkg, ps);
try {
rm.snapshotAndRestoreUserData(packageName, installedUsers, appId, ceDataInode,
seInfo, token);
@@ -15309,8 +15358,8 @@
}
// Retrieve the overlays for shared libraries of the package.
- if (pkg.getUsesLibraryInfos() != null) {
- for (SharedLibraryInfo sharedLib : pkg.getUsesLibraryInfos()) {
+ if (!ps.getPkgState().getUsesLibraryInfos().isEmpty()) {
+ for (SharedLibraryInfo sharedLib : ps.getPkgState().getUsesLibraryInfos()) {
for (int currentUserId : UserManagerService.getInstance().getUserIds()) {
if (!sharedLib.isDynamic()) {
// TODO(146804378): Support overlaying static shared libraries
@@ -15787,7 +15836,8 @@
if (!hasDynamicLibraries) {
return null;
}
- final boolean isUpdatedSystemApp = parsedPackage.isUpdatedSystemApp();
+ final boolean isUpdatedSystemApp = scanResult.pkgSetting.getPkgState()
+ .isUpdatedSystemApp();
// We may not yet have disabled the updated package yet, so be sure to grab the
// current setting if that's the case.
final PackageSetting updatedSystemPs = isUpdatedSystemApp
@@ -15886,8 +15936,11 @@
res.removedInfo.args = createInstallArgsForExisting(
oldPackage.getCodePath(),
oldPackage.getCodePath(),
- getAppDexInstructionSets(oldPackage.getPrimaryCpuAbi(),
- oldPackage.getSecondaryCpuAbi()));
+ getAppDexInstructionSets(
+ AndroidPackageUtils.getPrimaryCpuAbi(oldPackage,
+ deletedPkgSetting),
+ AndroidPackageUtils.getSecondaryCpuAbi(oldPackage,
+ deletedPkgSetting)));
} else {
res.removedInfo.args = null;
}
@@ -16020,7 +16073,7 @@
final ScanResult result = scanPackageTracedLI(
prepareResult.packageToScan, prepareResult.parseFlags,
prepareResult.scanFlags, System.currentTimeMillis(),
- request.args.user);
+ request.args.user, request.args.abiOverride);
if (null != preparedScans.put(result.pkgSetting.pkg.getPackageName(), result)) {
request.installResult.setError(
PackageManager.INSTALL_FAILED_DUPLICATE_PACKAGE,
@@ -16173,7 +16226,7 @@
REASON_INSTALL,
DexoptOptions.DEXOPT_BOOT_COMPLETE
| DexoptOptions.DEXOPT_INSTALL_WITH_DEX_METADATA_FILE);
- mPackageDexOptimizer.performDexOpt(pkg,
+ mPackageDexOptimizer.performDexOpt(pkg, reconciledPkg.pkgSetting,
null /* instructionSets */,
getOrCreateCompilerPackageStats(pkg),
mDexManager.getPackageUseInfoOrDefault(packageName),
@@ -16332,14 +16385,6 @@
}
}
- // If package doesn't declare API override, mark that we have an install
- // time CPU ABI override.
- // TODO(b/135203078): Isn't this always true because cpuAbiOverride isn't assigned during
- // parsing?
- if (TextUtils.isEmpty(parsedPackage.getCpuAbiOverride())) {
- parsedPackage.setCpuAbiOverride(args.abiOverride);
- }
-
String pkgName = res.name = parsedPackage.getPackageName();
if (parsedPackage.isTestOnly()) {
if ((installFlags & PackageManager.INSTALL_ALLOW_TEST) == 0) {
@@ -16594,12 +16639,22 @@
scanFlags |= SCAN_NO_DEX;
try {
- String abiOverride = (TextUtils.isEmpty(parsedPackage.getCpuAbiOverride())
- ? args.abiOverride : parsedPackage.getCpuAbiOverride());
final boolean extractNativeLibs = !AndroidPackageUtils.isLibrary(parsedPackage);
+ PackageSetting pkgSetting;
+ synchronized (mLock) {
+ pkgSetting = mSettings.getPackageLPr(pkgName);
+ }
+ String abiOverride =
+ (pkgSetting == null || TextUtils.isEmpty(pkgSetting.cpuAbiOverrideString)
+ ? args.abiOverride : pkgSetting.cpuAbiOverrideString);
+ boolean isUpdatedSystemAppFromExistingSetting = pkgSetting != null
+ && pkgSetting.getPkgState().isUpdatedSystemApp();
+ AndroidPackage oldPackage = mPackages.get(pkgName);
+ boolean isUpdatedSystemAppInferred = oldPackage != null && oldPackage.isSystem();
final Pair<PackageAbiHelper.Abis, PackageAbiHelper.NativeLibraryPaths>
- derivedAbi = mInjector.getAbiHelper().derivePackageAbi(
- parsedPackage, abiOverride, extractNativeLibs);
+ derivedAbi = mInjector.getAbiHelper().derivePackageAbi(parsedPackage,
+ isUpdatedSystemAppFromExistingSetting || isUpdatedSystemAppInferred,
+ abiOverride, extractNativeLibs);
derivedAbi.first.applyTo(parsedPackage);
derivedAbi.second.applyTo(parsedPackage);
} catch (PackageManagerException pme) {
@@ -16796,7 +16851,7 @@
+ ", old=" + oldPackage);
}
res.setReturnCode(PackageManager.INSTALL_SUCCEEDED);
- parsedPackage.setUpdatedSystemApp(true);
+ ps.getPkgState().setUpdatedSystemApp(true);
targetParseFlags = systemParseFlags;
targetScanFlags = systemScanFlags;
} else { // non system replace
@@ -17569,10 +17624,11 @@
final AndroidPackage stubPkg =
(disabledSystemPs == null) ? null : disabledSystemPs.pkg;
if (stubPkg != null && stubPkg.isStub()) {
+ final PackageSetting stubPs;
synchronized (mLock) {
// restore the enabled state of the stub; the state is overwritten when
// the stub is uninstalled
- final PackageSetting stubPs = mSettings.mPackages.get(stubPkg.getPackageName());
+ stubPs = mSettings.getPackageLPr(stubPkg.getPackageName());
if (stubPs != null) {
stubPs.setEnabled(origEnabledState, userId, "android");
}
@@ -17583,7 +17639,7 @@
Slog.i(TAG, "Enabling system stub after removal; pkg: "
+ stubPkg.getPackageName());
}
- enableCompressedPackage(stubPkg);
+ enableCompressedPackage(stubPkg, stubPs);
}
}
}
@@ -17966,9 +18022,12 @@
final AndroidPackage pkg =
scanPackageTracedLI(codePath, parseFlags, scanFlags, 0 /*currentTime*/, null);
+ PackageSetting pkgSetting = mSettings.getPackageLPr(pkg.getPackageName());
+
try {
// update shared libraries for the newly re-installed system package
- updateSharedLibrariesLocked(pkg, null, Collections.unmodifiableMap(mPackages));
+ updateSharedLibrariesLocked(pkg, pkgSetting, null, null,
+ Collections.unmodifiableMap(mPackages));
} catch (PackageManagerException e) {
Slog.e(TAG, "updateAllSharedLibrariesLPw failed: " + e.getMessage());
}
@@ -18399,10 +18458,11 @@
// Try finding details about the requested package
AndroidPackage pkg;
+ PackageSetting ps;
synchronized (mLock) {
pkg = mPackages.get(packageName);
+ ps = mSettings.mPackages.get(packageName);
if (pkg == null) {
- final PackageSetting ps = mSettings.mPackages.get(packageName);
if (ps != null) {
pkg = ps.pkg;
}
@@ -18429,7 +18489,7 @@
} else {
flags = 0;
}
- prepareAppDataContentsLIF(pkg, userId, flags);
+ prepareAppDataContentsLIF(pkg, ps, userId, flags);
return true;
}
@@ -19886,7 +19946,7 @@
if (isSystemStub
&& (newState == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT
|| newState == PackageManager.COMPONENT_ENABLED_STATE_ENABLED)) {
- if (!enableCompressedPackage(deletedPkg)) {
+ if (!enableCompressedPackage(deletedPkg, pkgSetting)) {
return;
}
}
@@ -21136,24 +21196,27 @@
ipw.println();
ipw.println("Dexopt state:");
ipw.increaseIndent();
- Collection<AndroidPackage> packages;
+ Collection<PackageSetting> pkgSettings;
if (packageName != null) {
- AndroidPackage targetPackage = mPackages.get(packageName);
- if (targetPackage != null) {
- packages = Collections.singletonList(targetPackage);
+ PackageSetting targetPkgSetting = mSettings.mPackages.get(packageName);
+ if (targetPkgSetting != null) {
+ pkgSettings = Collections.singletonList(targetPkgSetting);
} else {
ipw.println("Unable to find package: " + packageName);
return;
}
} else {
- packages = mPackages.values();
+ pkgSettings = mSettings.mPackages.values();
}
- for (AndroidPackage pkg : packages) {
- ipw.println("[" + pkg.getPackageName() + "]");
+ for (PackageSetting pkgSetting : pkgSettings) {
+ if (pkgSetting.pkg == null) {
+ continue;
+ }
+ ipw.println("[" + pkgSetting.name + "]");
ipw.increaseIndent();
- mPackageDexOptimizer.dumpDexoptState(ipw, pkg,
- mDexManager.getPackageUseInfoOrDefault(pkg.getPackageName()));
+ mPackageDexOptimizer.dumpDexoptState(ipw, pkgSetting.pkg, pkgSetting,
+ mDexManager.getPackageUseInfoOrDefault(pkgSetting.pkg.getPackageName()));
ipw.decreaseIndent();
}
}
@@ -21715,10 +21778,11 @@
final int appId = UserHandle.getAppId(pkg.getUid());
- Preconditions.checkNotNull(pkg.getSeInfo());
+ String pkgSeInfo = AndroidPackageUtils.getSeInfo(pkg, ps);
- final String seInfo =
- pkg.getSeInfo() + (pkg.getSeInfoUser() != null ? pkg.getSeInfoUser() : "");
+ Preconditions.checkNotNull(pkgSeInfo);
+
+ final String seInfo = pkgSeInfo + (pkg.getSeInfoUser() != null ? pkg.getSeInfoUser() : "");
long ceDataInode = -1;
try {
ceDataInode = mInstaller.createAppData(volumeUuid, packageName, userId, flags,
@@ -21769,18 +21833,20 @@
}
}
- prepareAppDataContentsLeafLIF(pkg, userId, flags);
+ prepareAppDataContentsLeafLIF(pkg, ps, userId, flags);
}
- private void prepareAppDataContentsLIF(AndroidPackage pkg, int userId, int flags) {
+ private void prepareAppDataContentsLIF(AndroidPackage pkg, @Nullable PackageSetting pkgSetting,
+ int userId, int flags) {
if (pkg == null) {
Slog.wtf(TAG, "Package was null!", new Throwable());
return;
}
- prepareAppDataContentsLeafLIF(pkg, userId, flags);
+ prepareAppDataContentsLeafLIF(pkg, pkgSetting, userId, flags);
}
- private void prepareAppDataContentsLeafLIF(AndroidPackage pkg, int userId, int flags) {
+ private void prepareAppDataContentsLeafLIF(AndroidPackage pkg,
+ @Nullable PackageSetting pkgSetting, int userId, int flags) {
final String volumeUuid = pkg.getVolumeUuid();
final String packageName = pkg.getPackageName();
@@ -21788,7 +21854,8 @@
// Create a native library symlink only if we have native libraries
// and if the native libraries are 32 bit libraries. We do not provide
// this symlink for 64 bit libraries.
- if (pkg.getPrimaryCpuAbi() != null && !VMRuntime.is64BitAbi(pkg.getPrimaryCpuAbi())) {
+ String primaryCpuAbi = AndroidPackageUtils.getPrimaryCpuAbi(pkg, pkgSetting);
+ if (primaryCpuAbi != null && !VMRuntime.is64BitAbi(primaryCpuAbi)) {
final String nativeLibPath = pkg.getNativeLibraryDir();
try {
mInstaller.linkNativeLibraryDirectory(volumeUuid, packageName,
@@ -22018,7 +22085,7 @@
installSource = ps.installSource;
packageAbiOverride = ps.cpuAbiOverrideString;
appId = UserHandle.getAppId(pkg.getUid());
- seinfo = pkg.getSeInfo();
+ seinfo = AndroidPackageUtils.getSeInfo(pkg, ps);
label = String.valueOf(pm.getApplicationLabel(pkg.toAppInfoWithoutState()));
targetSdkVersion = pkg.getTargetSdkVersion();
freezer = freezePackage(packageName, "movePackageInternal");
@@ -22925,7 +22992,7 @@
}
@Override
- public Object getDisabledSystemPackage(@NonNull String packageName) {
+ public PackageSetting getDisabledSystemPackage(@NonNull String packageName) {
synchronized (mLock) {
return mSettings.getDisabledSystemPkgLPr(packageName);
}
@@ -23598,6 +23665,15 @@
}
@Override
+ public void forEachPackageSetting(Consumer<PackageSetting> actionLocked) {
+ synchronized (mLock) {
+ for (int index = 0; index < mSettings.mPackages.size(); index++) {
+ actionLocked.accept(mSettings.mPackages.valueAt(index));
+ }
+ }
+ }
+
+ @Override
public void forEachInstalledPackage(@NonNull Consumer<AndroidPackage> actionLocked,
@UserIdInt int userId) {
PackageManagerService.this.forEachInstalledPackage(actionLocked, userId);
@@ -24093,15 +24169,18 @@
boolean canHaveOatDir(String packageName) {
synchronized (mLock) {
AndroidPackage p = mPackages.get(packageName);
- if (p == null) {
+ PackageSetting pkgSetting = mSettings.getPackageLPr(packageName);
+ if (p == null || pkgSetting == null) {
return false;
}
- return AndroidPackageUtils.canHaveOatDir(p, p.isUpdatedSystemApp());
+ return AndroidPackageUtils.canHaveOatDir(p,
+ pkgSetting.getPkgState().isUpdatedSystemApp());
}
}
- private String getOatDir(AndroidPackage pkg) {
- if (!AndroidPackageUtils.canHaveOatDir(pkg, pkg.isUpdatedSystemApp())) {
+ private String getOatDir(AndroidPackage pkg, @NonNull PackageSetting pkgSetting) {
+ if (!AndroidPackageUtils.canHaveOatDir(pkg,
+ pkgSetting.getPkgState().isUpdatedSystemApp())) {
return null;
}
File codePath = new File(pkg.getCodePath());
@@ -24116,13 +24195,16 @@
final List<String> codePaths;
final String oatDir;
final AndroidPackage pkg;
+ final PackageSetting pkgSetting;
synchronized (mLock) {
pkg = mPackages.get(packageName);
+ pkgSetting = mSettings.getPackageLPr(packageName);
}
- instructionSets = getAppDexInstructionSets(pkg.getPrimaryCpuAbi(),
- pkg.getSecondaryCpuAbi());
+ instructionSets = getAppDexInstructionSets(
+ AndroidPackageUtils.getPrimaryCpuAbi(pkg, pkgSetting),
+ AndroidPackageUtils.getSecondaryCpuAbi(pkg, pkgSetting));
codePaths = AndroidPackageUtils.getAllCodePaths(pkg);
- oatDir = getOatDir(pkg);
+ oatDir = getOatDir(pkg, pkgSetting);
for (String codePath : codePaths) {
for (String isa : instructionSets) {
@@ -24149,8 +24231,8 @@
if (PackageManagerServiceUtils
.isUnusedSinceTimeInMillis(ps.firstInstallTime, currentTimeInMillis,
downgradeTimeThresholdMillis, packageUseInfo,
- pkg.getLatestPackageUseTimeInMills(),
- pkg.getLatestForegroundPackageUseTimeInMills())) {
+ ps.getPkgState().getLatestPackageUseTimeInMills(),
+ ps.getPkgState().getLatestForegroundPackageUseTimeInMills())) {
unusedPackages.add(pkg.getPackageName());
}
}
diff --git a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java
index ac4e2b7..91afd84 100644
--- a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java
+++ b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java
@@ -94,6 +94,8 @@
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
+import java.util.Map;
+import java.util.Set;
import java.util.function.Predicate;
import java.util.zip.GZIPInputStream;
@@ -105,6 +107,9 @@
public class PackageManagerServiceUtils {
private final static long SEVEN_DAYS_IN_MILLISECONDS = 7 * 24 * 60 * 60 * 1000;
+ public final static Predicate<PackageSetting> REMOVE_IF_NULL_PKG =
+ pkgSetting -> pkgSetting.pkg == null;
+
private static ArraySet<String> getPackageNamesForIntent(Intent intent, int userId) {
List<ResolveInfo> ris = null;
try {
@@ -124,40 +129,43 @@
// Sort a list of apps by their last usage, most recently used apps first. The order of
// packages without usage data is undefined (but they will be sorted after the packages
// that do have usage data).
- public static void sortPackagesByUsageDate(List<AndroidPackage> pkgs,
+ public static void sortPackagesByUsageDate(List<PackageSetting> pkgSettings,
PackageManagerService packageManagerService) {
if (!packageManagerService.isHistoricalPackageUsageAvailable()) {
return;
}
- Collections.sort(pkgs, (pkg1, pkg2) ->
- Long.compare(pkg2.getLatestForegroundPackageUseTimeInMills(),
- pkg1.getLatestForegroundPackageUseTimeInMills()));
+ Collections.sort(pkgSettings, (pkgSetting1, pkgSetting2) ->
+ Long.compare(
+ pkgSetting2.getPkgState().getLatestForegroundPackageUseTimeInMills(),
+ pkgSetting1.getPkgState().getLatestForegroundPackageUseTimeInMills())
+ );
}
// Apply the given {@code filter} to all packages in {@code packages}. If tested positive, the
// package will be removed from {@code packages} and added to {@code result} with its
// dependencies. If usage data is available, the positive packages will be sorted by usage
// data (with {@code sortTemp} as temporary storage).
- private static void applyPackageFilter(Predicate<AndroidPackage> filter,
- Collection<AndroidPackage> result,
- Collection<AndroidPackage> packages,
- @NonNull List<AndroidPackage> sortTemp,
+ private static void applyPackageFilter(
+ Predicate<PackageSetting> filter,
+ Collection<PackageSetting> result,
+ Collection<PackageSetting> packages,
+ @NonNull List<PackageSetting> sortTemp,
PackageManagerService packageManagerService) {
- for (AndroidPackage pkg : packages) {
- if (filter.test(pkg)) {
- sortTemp.add(pkg);
+ for (PackageSetting pkgSetting : packages) {
+ if (filter.test(pkgSetting)) {
+ sortTemp.add(pkgSetting);
}
}
sortPackagesByUsageDate(sortTemp, packageManagerService);
packages.removeAll(sortTemp);
- for (AndroidPackage pkg : sortTemp) {
- result.add(pkg);
+ for (PackageSetting pkgSetting : sortTemp) {
+ result.add(pkgSetting);
- Collection<AndroidPackage> deps =
- packageManagerService.findSharedNonSystemLibraries(pkg);
+ List<PackageSetting> deps =
+ packageManagerService.findSharedNonSystemLibraries(pkgSetting);
if (!deps.isEmpty()) {
deps.removeAll(result);
result.addAll(deps);
@@ -170,74 +178,79 @@
// Sort apps by importance for dexopt ordering. Important apps are given
// more priority in case the device runs out of space.
- public static List<AndroidPackage> getPackagesForDexopt(
- Collection<AndroidPackage> packages,
+ public static List<PackageSetting> getPackagesForDexopt(
+ Collection<PackageSetting> packages,
PackageManagerService packageManagerService) {
return getPackagesForDexopt(packages, packageManagerService, DEBUG_DEXOPT);
}
- public static List<AndroidPackage> getPackagesForDexopt(
- Collection<AndroidPackage> packages,
+ public static List<PackageSetting> getPackagesForDexopt(
+ Collection<PackageSetting> pkgSettings,
PackageManagerService packageManagerService,
boolean debug) {
- ArrayList<AndroidPackage> remainingPkgs = new ArrayList<>(packages);
- LinkedList<AndroidPackage> result = new LinkedList<>();
- ArrayList<AndroidPackage> sortTemp = new ArrayList<>(remainingPkgs.size());
+ List<PackageSetting> result = new LinkedList<>();
+ ArrayList<PackageSetting> remainingPkgSettings = new ArrayList<>(pkgSettings);
+
+ // First, remove all settings without available packages
+ remainingPkgSettings.removeIf(REMOVE_IF_NULL_PKG);
+
+ ArrayList<PackageSetting> sortTemp = new ArrayList<>(remainingPkgSettings.size());
// Give priority to core apps.
- applyPackageFilter((pkg) -> pkg.isCoreApp(), result, remainingPkgs, sortTemp,
+ applyPackageFilter(pkgSetting -> pkgSetting.pkg.isCoreApp(), result, remainingPkgSettings, sortTemp,
packageManagerService);
// Give priority to system apps that listen for pre boot complete.
Intent intent = new Intent(Intent.ACTION_PRE_BOOT_COMPLETED);
final ArraySet<String> pkgNames = getPackageNamesForIntent(intent, UserHandle.USER_SYSTEM);
- applyPackageFilter((pkg) -> pkgNames.contains(pkg.getPackageName()), result, remainingPkgs,
- sortTemp, packageManagerService);
+ applyPackageFilter(pkgSetting -> pkgNames.contains(pkgSetting.name), result,
+ remainingPkgSettings, sortTemp, packageManagerService);
// Give priority to apps used by other apps.
DexManager dexManager = packageManagerService.getDexManager();
- applyPackageFilter((pkg) ->
- dexManager.getPackageUseInfoOrDefault(pkg.getPackageName())
+ applyPackageFilter(pkgSetting ->
+ dexManager.getPackageUseInfoOrDefault(pkgSetting.name)
.isAnyCodePathUsedByOtherApps(),
- result, remainingPkgs, sortTemp, packageManagerService);
+ result, remainingPkgSettings, sortTemp, packageManagerService);
// Filter out packages that aren't recently used, add all remaining apps.
// TODO: add a property to control this?
- Predicate<AndroidPackage> remainingPredicate;
- if (!remainingPkgs.isEmpty() && packageManagerService.isHistoricalPackageUsageAvailable()) {
+ Predicate<PackageSetting> remainingPredicate;
+ if (!remainingPkgSettings.isEmpty() && packageManagerService.isHistoricalPackageUsageAvailable()) {
if (debug) {
Log.i(TAG, "Looking at historical package use");
}
// Get the package that was used last.
- AndroidPackage lastUsed = Collections.max(remainingPkgs, (pkg1, pkg2) ->
- Long.compare(pkg1.getLatestForegroundPackageUseTimeInMills(),
- pkg2.getLatestForegroundPackageUseTimeInMills()));
+ PackageSetting lastUsed = Collections.max(remainingPkgSettings,
+ (pkgSetting1, pkgSetting2) -> Long.compare(
+ pkgSetting1.getPkgState().getLatestForegroundPackageUseTimeInMills(),
+ pkgSetting2.getPkgState().getLatestForegroundPackageUseTimeInMills()));
if (debug) {
- Log.i(TAG, "Taking package " + lastUsed.getPackageName()
+ Log.i(TAG, "Taking package " + lastUsed.name
+ " as reference in time use");
}
- long estimatedPreviousSystemUseTime =
- lastUsed.getLatestForegroundPackageUseTimeInMills();
+ long estimatedPreviousSystemUseTime = lastUsed.getPkgState()
+ .getLatestForegroundPackageUseTimeInMills();
// Be defensive if for some reason package usage has bogus data.
if (estimatedPreviousSystemUseTime != 0) {
final long cutoffTime = estimatedPreviousSystemUseTime - SEVEN_DAYS_IN_MILLISECONDS;
- remainingPredicate =
- (pkg) -> pkg.getLatestForegroundPackageUseTimeInMills() >= cutoffTime;
+ remainingPredicate = pkgSetting -> pkgSetting.getPkgState()
+ .getLatestForegroundPackageUseTimeInMills() >= cutoffTime;
} else {
// No meaningful historical info. Take all.
- remainingPredicate = (pkg) -> true;
+ remainingPredicate = pkgSetting -> true;
}
- sortPackagesByUsageDate(remainingPkgs, packageManagerService);
+ sortPackagesByUsageDate(remainingPkgSettings, packageManagerService);
} else {
// No historical info. Take all.
- remainingPredicate = (pkg) -> true;
+ remainingPredicate = pkgSetting -> true;
}
- applyPackageFilter(remainingPredicate, result, remainingPkgs, sortTemp,
+ applyPackageFilter(remainingPredicate, result, remainingPkgSettings, sortTemp,
packageManagerService);
if (debug) {
Log.i(TAG, "Packages to be dexopted: " + packagesToString(result));
- Log.i(TAG, "Packages skipped from dexopt: " + packagesToString(remainingPkgs));
+ Log.i(TAG, "Packages skipped from dexopt: " + packagesToString(remainingPkgSettings));
}
return result;
@@ -290,13 +303,13 @@
}
}
- public static String packagesToString(Collection<AndroidPackage> c) {
+ public static String packagesToString(List<PackageSetting> pkgSettings) {
StringBuilder sb = new StringBuilder();
- for (AndroidPackage pkg : c) {
+ for (int index = 0; index < pkgSettings.size(); index++) {
if (sb.length() > 0) {
sb.append(", ");
}
- sb.append(pkg.getPackageName());
+ sb.append(pkgSettings.get(index).name);
}
return sb.toString();
}
@@ -543,24 +556,16 @@
*/
private static boolean matchSignatureInSystem(PackageSetting pkgSetting,
PackageSetting disabledPkgSetting) {
- try {
- disabledPkgSetting.pkg.mutate().setSigningDetails(
- ParsingPackageUtils.collectCertificates(disabledPkgSetting.pkg, true /* skipVerify */));
- if (pkgSetting.signatures.mSigningDetails.checkCapability(
- disabledPkgSetting.signatures.mSigningDetails,
- PackageParser.SigningDetails.CertCapabilities.INSTALLED_DATA)
- || disabledPkgSetting.signatures.mSigningDetails.checkCapability(
- pkgSetting.signatures.mSigningDetails,
- PackageParser.SigningDetails.CertCapabilities.ROLLBACK)) {
- return true;
- } else {
- logCriticalInfo(Log.ERROR, "Updated system app mismatches cert on /system: " +
- pkgSetting.name);
- return false;
- }
- } catch (PackageParserException e) {
- logCriticalInfo(Log.ERROR, "Failed to collect cert for " + pkgSetting.name + ": " +
- e.getMessage());
+ if (pkgSetting.signatures.mSigningDetails.checkCapability(
+ disabledPkgSetting.signatures.mSigningDetails,
+ PackageParser.SigningDetails.CertCapabilities.INSTALLED_DATA)
+ || disabledPkgSetting.signatures.mSigningDetails.checkCapability(
+ pkgSetting.signatures.mSigningDetails,
+ PackageParser.SigningDetails.CertCapabilities.ROLLBACK)) {
+ return true;
+ } else {
+ logCriticalInfo(Log.ERROR, "Updated system app mismatches cert on /system: " +
+ pkgSetting.name);
return false;
}
}
@@ -643,8 +648,8 @@
}
}
// Check for shared user signatures
- if (pkgSetting.sharedUser != null
- && pkgSetting.sharedUser.signatures.mSigningDetails
+ if (pkgSetting.getSharedUser() != null
+ && pkgSetting.getSharedUser().signatures.mSigningDetails
!= PackageParser.SigningDetails.UNKNOWN) {
// Already existing package. Make sure signatures match. In case of signing certificate
@@ -654,24 +659,24 @@
// with being sharedUser with the existing signing cert.
boolean match =
parsedSignatures.checkCapability(
- pkgSetting.sharedUser.signatures.mSigningDetails,
+ pkgSetting.getSharedUser().signatures.mSigningDetails,
PackageParser.SigningDetails.CertCapabilities.SHARED_USER_ID)
- || pkgSetting.sharedUser.signatures.mSigningDetails.checkCapability(
+ || pkgSetting.getSharedUser().signatures.mSigningDetails.checkCapability(
parsedSignatures,
PackageParser.SigningDetails.CertCapabilities.SHARED_USER_ID);
if (!match && compareCompat) {
match = matchSignaturesCompat(
- packageName, pkgSetting.sharedUser.signatures, parsedSignatures);
+ packageName, pkgSetting.getSharedUser().signatures, parsedSignatures);
}
if (!match && compareRecover) {
match =
matchSignaturesRecover(packageName,
- pkgSetting.sharedUser.signatures.mSigningDetails,
+ pkgSetting.getSharedUser().signatures.mSigningDetails,
parsedSignatures,
PackageParser.SigningDetails.CertCapabilities.SHARED_USER_ID)
|| matchSignaturesRecover(packageName,
parsedSignatures,
- pkgSetting.sharedUser.signatures.mSigningDetails,
+ pkgSetting.getSharedUser().signatures.mSigningDetails,
PackageParser.SigningDetails.CertCapabilities.SHARED_USER_ID);
compatMatch |= match;
}
@@ -679,7 +684,7 @@
throw new PackageManagerException(INSTALL_FAILED_SHARED_USER_INCOMPATIBLE,
"Package " + packageName
+ " has no signatures that match those in shared user "
- + pkgSetting.sharedUser.name + "; ignoring!");
+ + pkgSetting.getSharedUser().name + "; ignoring!");
}
}
return compatMatch;
@@ -914,8 +919,8 @@
*/
public static PermissionsState getPermissionsState(
PackageManagerInternal packageManagerInternal, AndroidPackage pkg) {
- final PackageSetting packageSetting =
- (PackageSetting) packageManagerInternal.getPackageSetting(pkg.getPackageName());
+ final PackageSetting packageSetting = packageManagerInternal.getPackageSetting(
+ pkg.getPackageName());
if (packageSetting == null) {
return null;
}
diff --git a/services/core/java/com/android/server/pm/PackageSetting.java b/services/core/java/com/android/server/pm/PackageSetting.java
index 97342c0..2bd1a26 100644
--- a/services/core/java/com/android/server/pm/PackageSetting.java
+++ b/services/core/java/com/android/server/pm/PackageSetting.java
@@ -16,6 +16,7 @@
package com.android.server.pm;
+import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
@@ -27,6 +28,7 @@
import com.android.server.pm.parsing.pkg.AndroidPackage;
import com.android.server.pm.permission.PermissionsState;
+import com.android.server.pm.pkg.PackageStateUnserialized;
import java.io.File;
import java.util.ArrayList;
@@ -38,7 +40,7 @@
/**
* Settings data for a particular package we know about.
*/
-public final class PackageSetting extends PackageSettingBase {
+public class PackageSetting extends PackageSettingBase {
int appId;
public AndroidPackage pkg;
@@ -63,6 +65,9 @@
@Nullable
Map<String, ArraySet<String>> mimeGroups;
+ @NonNull
+ private PackageStateUnserialized pkgState = new PackageStateUnserialized();
+
PackageSetting(String name, String realName, File codePath, File resourcePath,
String legacyNativeLibraryPathString, String primaryCpuAbiString,
String secondaryCpuAbiString, String cpuAbiOverrideString,
@@ -221,10 +226,6 @@
return (pkgFlags & ApplicationInfo.FLAG_SYSTEM) != 0;
}
- public boolean isUpdatedSystem() {
- return (pkgFlags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0;
- }
-
@Override
public boolean isSharedUser() {
return sharedUser != null;
@@ -321,4 +322,9 @@
Set<String> mimeGroupNames = other.mimeGroups != null ? other.mimeGroups.keySet() : null;
updateMimeGroups(mimeGroupNames);
}
+
+ @NonNull
+ public PackageStateUnserialized getPkgState() {
+ return pkgState;
+ }
}
diff --git a/services/core/java/com/android/server/pm/PackageSettingBase.java b/services/core/java/com/android/server/pm/PackageSettingBase.java
index 7d95b19..18bc879 100644
--- a/services/core/java/com/android/server/pm/PackageSettingBase.java
+++ b/services/core/java/com/android/server/pm/PackageSettingBase.java
@@ -78,12 +78,12 @@
/**
* The primary CPU abi for this package.
*/
- String primaryCpuAbiString;
+ public String primaryCpuAbiString;
/**
* The secondary CPU abi for this package.
*/
- String secondaryCpuAbiString;
+ public String secondaryCpuAbiString;
/**
* The install time CPU override, if any. This value is written at install time
diff --git a/services/core/java/com/android/server/pm/PackageUsage.java b/services/core/java/com/android/server/pm/PackageUsage.java
index 5d3a10c..ef37a20 100644
--- a/services/core/java/com/android/server/pm/PackageUsage.java
+++ b/services/core/java/com/android/server/pm/PackageUsage.java
@@ -37,7 +37,7 @@
import java.nio.charset.StandardCharsets;
import java.util.Map;
-class PackageUsage extends AbstractStatsBase<Map<String, AndroidPackage>> {
+class PackageUsage extends AbstractStatsBase<Map<String, PackageSetting>> {
private static final String USAGE_FILE_MAGIC = "PACKAGE_USAGE__VERSION_";
private static final String USAGE_FILE_MAGIC_VERSION_1 = USAGE_FILE_MAGIC + "1";
@@ -53,7 +53,7 @@
}
@Override
- protected void writeInternal(Map<String, AndroidPackage> packages) {
+ protected void writeInternal(Map<String, PackageSetting> pkgSettings) {
AtomicFile file = getFile();
FileOutputStream f = null;
try {
@@ -67,13 +67,14 @@
sb.append('\n');
out.write(sb.toString().getBytes(StandardCharsets.US_ASCII));
- for (AndroidPackage pkg : packages.values()) {
- if (pkg.getLatestPackageUseTimeInMills() == 0L) {
+ for (PackageSetting pkgSetting : pkgSettings.values()) {
+ if (pkgSetting.getPkgState().getLatestPackageUseTimeInMills() == 0L) {
continue;
}
sb.setLength(0);
- sb.append(pkg.getPackageName());
- for (long usageTimeInMillis : pkg.getLastPackageUsageTimeInMills()) {
+ sb.append(pkgSetting.name);
+ for (long usageTimeInMillis : pkgSetting.getPkgState()
+ .getLastPackageUsageTimeInMills()) {
sb.append(' ');
sb.append(usageTimeInMillis);
}
@@ -91,7 +92,7 @@
}
@Override
- protected void readInternal(Map<String, AndroidPackage> packages) {
+ protected void readInternal(Map<String, PackageSetting> pkgSettings) {
AtomicFile file = getFile();
BufferedInputStream in = null;
try {
@@ -102,9 +103,9 @@
if (firstLine == null) {
// Empty file. Do nothing.
} else if (USAGE_FILE_MAGIC_VERSION_1.equals(firstLine)) {
- readVersion1LP(packages, in, sb);
+ readVersion1LP(pkgSettings, in, sb);
} else {
- readVersion0LP(packages, in, sb, firstLine);
+ readVersion0LP(pkgSettings, in, sb, firstLine);
}
} catch (FileNotFoundException expected) {
mIsHistoricalPackageUsageAvailable = false;
@@ -115,7 +116,7 @@
}
}
- private void readVersion0LP(Map<String, AndroidPackage> packages, InputStream in,
+ private void readVersion0LP(Map<String, PackageSetting> pkgSettings, InputStream in,
StringBuffer sb, String firstLine)
throws IOException {
// Initial version of the file had no version number and stored one
@@ -129,8 +130,8 @@
}
String packageName = tokens[0];
- AndroidPackage pkg = packages.get(packageName);
- if (pkg == null) {
+ PackageSetting pkgSetting = pkgSettings.get(packageName);
+ if (pkgSetting == null) {
continue;
}
@@ -138,12 +139,12 @@
for (int reason = 0;
reason < PackageManager.NOTIFY_PACKAGE_USE_REASONS_COUNT;
reason++) {
- pkg.mutate().setLastPackageUsageTimeInMills(reason, timestamp);
+ pkgSetting.getPkgState().setLastPackageUsageTimeInMills(reason, timestamp);
}
}
}
- private void readVersion1LP(Map<String, AndroidPackage> packages, InputStream in,
+ private void readVersion1LP(Map<String, PackageSetting> pkgSettings, InputStream in,
StringBuffer sb) throws IOException {
// Version 1 of the file started with the corresponding version
// number and then stored a package name and eight timestamps per line.
@@ -155,15 +156,15 @@
}
String packageName = tokens[0];
- AndroidPackage pkg = packages.get(packageName);
- if (pkg == null) {
+ PackageSetting pkgSetting = pkgSettings.get(packageName);
+ if (pkgSetting == null) {
continue;
}
for (int reason = 0;
reason < PackageManager.NOTIFY_PACKAGE_USE_REASONS_COUNT;
reason++) {
- pkg.mutate().setLastPackageUsageTimeInMills(reason,
+ pkgSetting.getPkgState().setLastPackageUsageTimeInMills(reason,
parseAsLong(tokens[reason + 1]));
}
}
diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java
index b06d7a9..6c2ace8 100644
--- a/services/core/java/com/android/server/pm/Settings.java
+++ b/services/core/java/com/android/server/pm/Settings.java
@@ -101,6 +101,7 @@
import com.android.server.pm.Installer.InstallerException;
import com.android.server.pm.parsing.PackageInfoUtils;
import com.android.server.pm.parsing.pkg.AndroidPackage;
+import com.android.server.pm.parsing.pkg.AndroidPackageUtils;
import com.android.server.pm.permission.BasePermission;
import com.android.server.pm.permission.PermissionSettings;
import com.android.server.pm.permission.PermissionsState;
@@ -484,10 +485,9 @@
}
final PackageSetting dp = mDisabledSysPackages.get(name);
// always make sure the system package code and resource paths dont change
- if (dp == null && p.pkg != null && p.pkg.isSystem() && !p.pkg.isUpdatedSystemApp()) {
- if(p.pkg != null) {
- p.pkg.mutate().setUpdatedSystemApp(true);
- }
+ if (dp == null && p.pkg != null && p.pkg.isSystem()
+ && !p.getPkgState().isUpdatedSystemApp()) {
+ p.getPkgState().setUpdatedSystemApp(true);
final PackageSetting disabled;
if (replaced) {
// a little trick... when we install the new package, we don't
@@ -511,10 +511,7 @@
Log.w(PackageManagerService.TAG, "Package " + name + " is not disabled");
return null;
}
- // Reset flag in ApplicationInfo object
- if(p.pkg != null) {
- p.pkg.mutate().setUpdatedSystemApp(false);
- }
+ p.getPkgState().setUpdatedSystemApp(false);
PackageSetting ret = addPackageLPw(name, p.realName, p.codePath, p.resourcePath,
p.legacyNativeLibraryPathString, p.primaryCpuAbiString,
p.secondaryCpuAbiString, p.cpuAbiOverrideString,
@@ -2721,7 +2718,7 @@
sb.append(isDebug ? " 1 " : " 0 ");
sb.append(dataPath);
sb.append(" ");
- sb.append(pkg.pkg.getSeInfo());
+ sb.append(AndroidPackageUtils.getSeInfo(pkg.pkg, pkg));
sb.append(" ");
if (gids != null && gids.length > 0) {
sb.append(gids[0]);
@@ -4138,7 +4135,7 @@
final boolean shouldInstall = ps.isSystem() &&
(skipPackageWhitelist || installablePackages.contains(ps.name)) &&
!ArrayUtils.contains(disallowedPackages, ps.name) &&
- !ps.pkg.isHiddenUntilInstalled();
+ !ps.getPkgState().isHiddenUntilInstalled();
// Only system apps are initially installed.
ps.setInstalled(shouldInstall, userHandle);
if (!shouldInstall) {
@@ -4149,7 +4146,7 @@
volumeUuids[i] = ps.volumeUuid;
names[i] = ps.name;
appIds[i] = ps.appId;
- seinfos[i] = ps.pkg.getSeInfo();
+ seinfos[i] = AndroidPackageUtils.getSeInfo(ps.pkg, ps);
targetSdkVersions[i] = ps.pkg.getTargetSdkVersion();
}
}
@@ -4708,12 +4705,11 @@
}
}
- final String[] usesLibraryFiles = pkg.getUsesLibraryFiles();
- if (usesLibraryFiles != null
- && usesLibraryFiles.length > 0) {
+ List<String> usesLibraryFiles = ps.getPkgState().getUsesLibraryFiles();
+ if (usesLibraryFiles.size() > 0) {
pw.print(prefix); pw.println(" usesLibraryFiles:");
- for (int i=0; i< usesLibraryFiles.length; i++) {
- pw.print(prefix); pw.print(" "); pw.println(usesLibraryFiles[i]);
+ for (int i=0; i< usesLibraryFiles.size(); i++) {
+ pw.print(prefix); pw.print(" "); pw.println(usesLibraryFiles.get(i));
}
}
final Map<String, ParsedProcess> procs = pkg.getProcesses();
diff --git a/services/core/java/com/android/server/pm/SharedUserSetting.java b/services/core/java/com/android/server/pm/SharedUserSetting.java
index 952c2bf..6103f558 100644
--- a/services/core/java/com/android/server/pm/SharedUserSetting.java
+++ b/services/core/java/com/android/server/pm/SharedUserSetting.java
@@ -160,19 +160,24 @@
* restrictive selinux domain.
*/
public void fixSeInfoLocked() {
- final List<AndroidPackage> pkgList = getPackages();
- if (pkgList == null || pkgList.size() == 0) {
+ if (packages == null || packages.size() == 0) {
return;
}
-
- for (AndroidPackage pkg : pkgList) {
- if (pkg.getTargetSdkVersion() < seInfoTargetSdkVersion) {
- seInfoTargetSdkVersion = pkg.getTargetSdkVersion();
+ for (PackageSetting ps : packages) {
+ if ((ps == null) || (ps.pkg == null)) {
+ continue;
+ }
+ if (ps.pkg.getTargetSdkVersion() < seInfoTargetSdkVersion) {
+ seInfoTargetSdkVersion = ps.pkg.getTargetSdkVersion();
}
}
- for (AndroidPackage pkg : pkgList) {
- final boolean isPrivileged = isPrivileged() | pkg.isPrivileged();
- pkg.mutate().setSeInfo(SELinuxMMAC.getSeInfo(pkg, isPrivileged,
+
+ for (PackageSetting ps : packages) {
+ if ((ps == null) || (ps.pkg == null)) {
+ continue;
+ }
+ final boolean isPrivileged = isPrivileged() | ps.pkg.isPrivileged();
+ ps.getPkgState().setOverrideSeInfo(SELinuxMMAC.getSeInfo(ps.pkg, isPrivileged,
seInfoTargetSdkVersion));
}
}
diff --git a/services/core/java/com/android/server/pm/StagingManager.java b/services/core/java/com/android/server/pm/StagingManager.java
index 42fce5a..fe99229 100644
--- a/services/core/java/com/android/server/pm/StagingManager.java
+++ b/services/core/java/com/android/server/pm/StagingManager.java
@@ -69,6 +69,7 @@
import com.android.internal.os.BackgroundThread;
import com.android.server.LocalServices;
import com.android.server.pm.parsing.pkg.AndroidPackage;
+import com.android.server.pm.parsing.pkg.AndroidPackageUtils;
import com.android.server.rollback.WatchdogRollbackLogger;
import java.io.File;
@@ -429,11 +430,10 @@
+ "for snapshotting/restoring user data.");
return;
}
- final String seInfo = pkg.getSeInfo();
int appId = -1;
long ceDataInode = -1;
- final PackageSetting ps = (PackageSetting) mPmi.getPackageSetting(packageName);
+ final PackageSetting ps = mPmi.getPackageSetting(packageName);
if (ps != null) {
appId = ps.appId;
ceDataInode = ps.getCeDataInode(UserHandle.USER_SYSTEM);
@@ -441,6 +441,7 @@
// an update, and hence need to restore data for all installed users.
final int[] installedUsers = ps.queryInstalledUsers(allUsers, true);
+ final String seInfo = AndroidPackageUtils.getSeInfo(pkg, ps);
try {
rm.snapshotAndRestoreUserData(packageName, installedUsers, appId, ceDataInode,
seInfo, 0 /*token*/);
diff --git a/services/core/java/com/android/server/pm/UserSystemPackageInstaller.java b/services/core/java/com/android/server/pm/UserSystemPackageInstaller.java
index a9cf12b..d6480d3 100644
--- a/services/core/java/com/android/server/pm/UserSystemPackageInstaller.java
+++ b/services/core/java/com/android/server/pm/UserSystemPackageInstaller.java
@@ -190,13 +190,14 @@
// Install/uninstall system packages per user.
for (int userId : mUm.getUserIds()) {
final Set<String> userWhitelist = getInstallablePackagesForUserId(userId);
- pmInt.forEachPackage(pkg -> {
- if (!pkg.isSystem()) {
+ pmInt.forEachPackageSetting(pkgSetting -> {
+ AndroidPackage pkg = pkgSetting.pkg;
+ if (pkg == null || !pkg.isSystem()) {
return;
}
final boolean install =
(userWhitelist == null || userWhitelist.contains(pkg.getPackageName()))
- && !pkg.isHiddenUntilInstalled();
+ && !pkgSetting.getPkgState().isHiddenUntilInstalled();
if (isConsideredUpgrade && !isFirstBoot && !install) {
return; // To be careful, we don’t uninstall apps during OTAs
}
diff --git a/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java b/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java
index 8640859..23bdf5f 100644
--- a/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java
+++ b/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java
@@ -54,37 +54,56 @@
import com.android.server.pm.PackageSetting;
import com.android.server.pm.parsing.pkg.AndroidPackage;
import com.android.server.pm.parsing.pkg.AndroidPackageUtils;
+import com.android.server.pm.pkg.PackageStateUnserialized;
import libcore.util.EmptyArray;
import java.util.Collections;
+import java.util.List;
import java.util.Map;
import java.util.Set;
-/** @hide **/
+
+/**
+ * Methods that use a {@link PackageSetting} use it to override information provided from the raw
+ * package, or to provide information that would otherwise be missing. Null can be passed if none
+ * of the state values should be applied.
+ *
+ * @hide
+ **/
public class PackageInfoUtils {
+ /**
+ * @param pkgSetting See {@link PackageInfoUtils} for description of pkgSetting usage.
+ */
@Nullable
public static PackageInfo generate(AndroidPackage pkg, int[] gids,
@PackageManager.PackageInfoFlags int flags, long firstInstallTime, long lastUpdateTime,
- Set<String> grantedPermissions, PackageUserState state, int userId) {
- PackageSetting pkgSetting = null;
+ Set<String> grantedPermissions, PackageUserState state, int userId,
+ @Nullable PackageSetting pkgSetting) {
return generateWithComponents(pkg, gids, flags, firstInstallTime, lastUpdateTime,
grantedPermissions, state, userId, null, pkgSetting);
}
+ /**
+ * @param pkgSetting See {@link PackageInfoUtils} for description of pkgSetting usage.
+ */
@Nullable
public static PackageInfo generate(AndroidPackage pkg, ApexInfo apexInfo, int flags,
- PackageSetting pkgSetting) {
+ @Nullable PackageSetting pkgSetting) {
return generateWithComponents(pkg, EmptyArray.INT, flags, 0, 0, Collections.emptySet(),
new PackageUserState(), UserHandle.getCallingUserId(), apexInfo, pkgSetting);
}
+ /**
+ * @param pkgSetting See {@link PackageInfoUtils} for description of pkgSetting usage.
+ */
private static PackageInfo generateWithComponents(AndroidPackage pkg, int[] gids,
@PackageManager.PackageInfoFlags int flags, long firstInstallTime, long lastUpdateTime,
Set<String> grantedPermissions, PackageUserState state, int userId,
@Nullable ApexInfo apexInfo, @Nullable PackageSetting pkgSetting) {
- ApplicationInfo applicationInfo = generateApplicationInfo(pkg, flags, state, userId);
+ ApplicationInfo applicationInfo = generateApplicationInfo(pkg, flags, state, userId,
+ pkgSetting);
if (applicationInfo == null) {
return null;
}
@@ -174,7 +193,7 @@
info.instrumentation = new InstrumentationInfo[N];
for (int i = 0; i < N; i++) {
info.instrumentation[i] = generateInstrumentationInfo(
- pkg.getInstrumentations().get(i), pkg, flags, userId);
+ pkg.getInstrumentations().get(i), pkg, flags, userId, pkgSetting);
}
}
}
@@ -182,10 +201,13 @@
return info;
}
+ /**
+ * @param pkgSetting See {@link PackageInfoUtils} for description of pkgSetting usage.
+ */
@Nullable
public static ApplicationInfo generateApplicationInfo(AndroidPackage pkg,
- @PackageManager.ApplicationInfoFlags int flags, PackageUserState state, int userId) {
- PackageSetting pkgSetting = null;
+ @PackageManager.ApplicationInfoFlags int flags, PackageUserState state, int userId,
+ @Nullable PackageSetting pkgSetting) {
// TODO(b/135203078): Consider cases where we don't have a PkgSetting
if (pkg == null) {
return null;
@@ -202,18 +224,35 @@
return null;
}
+ if (pkgSetting != null) {
+ // TODO(b/135203078): Remove PackageParser1/toAppInfoWithoutState and clean all this up
+ PackageStateUnserialized pkgState = pkgSetting.getPkgState();
+ info.hiddenUntilInstalled = pkgState.isHiddenUntilInstalled();
+ List<String> usesLibraryFiles = pkgState.getUsesLibraryFiles();
+ List<SharedLibraryInfo> usesLibraryInfos = pkgState.getUsesLibraryInfos();
+ info.sharedLibraryFiles = usesLibraryFiles.isEmpty()
+ ? null : usesLibraryFiles.toArray(new String[0]);
+ info.sharedLibraryInfos = usesLibraryInfos.isEmpty() ? null : usesLibraryInfos;
+ }
+
info.flags |= appInfoFlags(pkg, pkgSetting);
info.privateFlags |= appInfoPrivateFlags(pkg, pkgSetting);
return info;
}
+ /**
+ * @param pkgSetting See {@link PackageInfoUtils} for description of pkgSetting usage.
+ */
@Nullable
public static ActivityInfo generateActivityInfo(AndroidPackage pkg, ParsedActivity a,
- @PackageManager.ComponentInfoFlags int flags, PackageUserState state, int userId) {
- PackageSetting pkgSetting = null;
+ @PackageManager.ComponentInfoFlags int flags, PackageUserState state, int userId,
+ @Nullable PackageSetting pkgSetting) {
return generateActivityInfo(pkg, a, flags, state, null, userId, pkgSetting);
}
+ /**
+ * @param pkgSetting See {@link PackageInfoUtils} for description of pkgSetting usage.
+ */
@Nullable
private static ActivityInfo generateActivityInfo(AndroidPackage pkg, ParsedActivity a,
@PackageManager.ComponentInfoFlags int flags, PackageUserState state,
@@ -224,7 +263,7 @@
return null;
}
if (applicationInfo == null) {
- applicationInfo = generateApplicationInfo(pkg, flags, state, userId);
+ applicationInfo = generateApplicationInfo(pkg, flags, state, userId, pkgSetting);
}
ActivityInfo info = PackageInfoWithoutStateUtils.generateActivityInfo(pkg, a, flags, state,
applicationInfo, userId);
@@ -236,13 +275,19 @@
return info;
}
+ /**
+ * @param pkgSetting See {@link PackageInfoUtils} for description of pkgSetting usage.
+ */
@Nullable
public static ServiceInfo generateServiceInfo(AndroidPackage pkg, ParsedService s,
- @PackageManager.ComponentInfoFlags int flags, PackageUserState state, int userId) {
- PackageSetting pkgSetting = null;
+ @PackageManager.ComponentInfoFlags int flags, PackageUserState state, int userId,
+ @Nullable PackageSetting pkgSetting) {
return generateServiceInfo(pkg, s, flags, state, null, userId, pkgSetting);
}
+ /**
+ * @param pkgSetting See {@link PackageInfoUtils} for description of pkgSetting usage.
+ */
@Nullable
private static ServiceInfo generateServiceInfo(AndroidPackage pkg, ParsedService s,
@PackageManager.ComponentInfoFlags int flags, PackageUserState state,
@@ -253,7 +298,7 @@
return null;
}
if (applicationInfo == null) {
- applicationInfo = generateApplicationInfo(pkg, flags, state, userId);
+ applicationInfo = generateApplicationInfo(pkg, flags, state, userId, pkgSetting);
}
ServiceInfo info = PackageInfoWithoutStateUtils.generateServiceInfo(pkg, s, flags, state,
applicationInfo, userId);
@@ -265,13 +310,19 @@
return info;
}
+ /**
+ * @param pkgSetting See {@link PackageInfoUtils} for description of pkgSetting usage.
+ */
@Nullable
public static ProviderInfo generateProviderInfo(AndroidPackage pkg, ParsedProvider p,
- @PackageManager.ComponentInfoFlags int flags, PackageUserState state, int userId) {
- PackageSetting pkgSetting = null;
+ @PackageManager.ComponentInfoFlags int flags, PackageUserState state, int userId,
+ @Nullable PackageSetting pkgSetting) {
return generateProviderInfo(pkg, p, flags, state, null, userId, pkgSetting);
}
+ /**
+ * @param pkgSetting See {@link PackageInfoUtils} for description of pkgSetting usage.
+ */
@Nullable
private static ProviderInfo generateProviderInfo(AndroidPackage pkg, ParsedProvider p,
@PackageManager.ComponentInfoFlags int flags, PackageUserState state,
@@ -282,7 +333,7 @@
return null;
}
if (applicationInfo == null) {
- applicationInfo = generateApplicationInfo(pkg, flags, state, userId);
+ applicationInfo = generateApplicationInfo(pkg, flags, state, userId, pkgSetting);
}
ProviderInfo info = PackageInfoWithoutStateUtils.generateProviderInfo(pkg, p, flags, state,
applicationInfo, userId);
@@ -294,10 +345,13 @@
return info;
}
+ /**
+ * @param pkgSetting See {@link PackageInfoUtils} for description of pkgSetting usage.
+ */
@Nullable
public static InstrumentationInfo generateInstrumentationInfo(ParsedInstrumentation i,
- AndroidPackage pkg, @PackageManager.ComponentInfoFlags int flags, int userId) {
- PackageSetting pkgSetting = null;
+ AndroidPackage pkg, @PackageManager.ComponentInfoFlags int flags, int userId,
+ @Nullable PackageSetting pkgSetting) {
if (i == null) return null;
InstrumentationInfo info =
@@ -307,8 +361,8 @@
}
// TODO(b/135203078): Add setting related state
- info.primaryCpuAbi = pkg.getPrimaryCpuAbi();
- info.secondaryCpuAbi = pkg.getSecondaryCpuAbi();
+ info.primaryCpuAbi = AndroidPackageUtils.getPrimaryCpuAbi(pkg, pkgSetting);
+ info.secondaryCpuAbi = AndroidPackageUtils.getSecondaryCpuAbi(pkg, pkgSetting);
info.nativeLibraryDir = pkg.getNativeLibraryDir();
info.secondaryNativeLibraryDir = pkg.getSecondaryNativeLibraryDir();
@@ -365,7 +419,8 @@
// Returns false if the package is hidden system app until installed.
if ((flags & PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS) == 0
&& !state.installed
- && pkg.isHiddenUntilInstalled()) {
+ && pkgSetting != null
+ && pkgSetting.getPkgState().isHiddenUntilInstalled()) {
return false;
}
@@ -401,10 +456,13 @@
public static int appInfoFlags(AndroidPackage pkg, @Nullable PackageSetting pkgSetting) {
// TODO(b/135203078): Add setting related state
// @formatter:off
- return PackageInfoWithoutStateUtils.appInfoFlags(pkg)
+ int flags = PackageInfoWithoutStateUtils.appInfoFlags(pkg)
| flag(pkg.isSystem(), ApplicationInfo.FLAG_SYSTEM)
- | flag(pkg.isFactoryTest(), ApplicationInfo.FLAG_FACTORY_TEST)
- | flag(pkg.isUpdatedSystemApp(), ApplicationInfo.FLAG_UPDATED_SYSTEM_APP);
+ | flag(pkg.isFactoryTest(), ApplicationInfo.FLAG_FACTORY_TEST);
+ if (pkgSetting != null) {
+ flags |= flag(pkgSetting.getPkgState().isUpdatedSystemApp(), ApplicationInfo.FLAG_UPDATED_SYSTEM_APP);
+ }
+ return flags;
// @formatter:on
}
diff --git a/services/core/java/com/android/server/pm/parsing/library/AndroidHidlUpdater.java b/services/core/java/com/android/server/pm/parsing/library/AndroidHidlUpdater.java
index 3f7fa92..ebb96bb 100644
--- a/services/core/java/com/android/server/pm/parsing/library/AndroidHidlUpdater.java
+++ b/services/core/java/com/android/server/pm/parsing/library/AndroidHidlUpdater.java
@@ -27,17 +27,19 @@
* Updates a package to ensure that if it targets <= P that the android.hidl.base-V1.0-java
* and android.hidl.manager-V1.0-java libraries are included by default.
*
+ * TODO(b/135203078): See if this class can be removed, thus removing the isUpdatedSystemApp param
+ *
* @hide
*/
@VisibleForTesting
public class AndroidHidlUpdater extends PackageSharedLibraryUpdater {
@Override
- public void updatePackage(ParsedPackage parsedPackage) {
+ public void updatePackage(ParsedPackage parsedPackage, boolean isUpdatedSystemApp) {
// This was the default <= P and is maintained for backwards compatibility.
boolean isLegacy = parsedPackage.getTargetSdkVersion() <= Build.VERSION_CODES.P;
// Only system apps use these libraries
- boolean isSystem = parsedPackage.isSystem() || parsedPackage.isUpdatedSystemApp();
+ boolean isSystem = parsedPackage.isSystem() || isUpdatedSystemApp;
if (isLegacy && isSystem) {
prefixRequiredLibrary(parsedPackage, ANDROID_HIDL_BASE);
diff --git a/services/core/java/com/android/server/pm/parsing/library/AndroidTestBaseUpdater.java b/services/core/java/com/android/server/pm/parsing/library/AndroidTestBaseUpdater.java
index 4958ae1..432394a 100644
--- a/services/core/java/com/android/server/pm/parsing/library/AndroidTestBaseUpdater.java
+++ b/services/core/java/com/android/server/pm/parsing/library/AndroidTestBaseUpdater.java
@@ -73,7 +73,7 @@
}
@Override
- public void updatePackage(ParsedPackage pkg) {
+ public void updatePackage(ParsedPackage pkg, boolean isUpdatedSystemApp) {
// Packages targeted at <= Q expect the classes in the android.test.base library
// to be accessible so this maintains backward compatibility by adding the
// android.test.base library to those packages.
diff --git a/services/core/java/com/android/server/pm/parsing/library/OrgApacheHttpLegacyUpdater.java b/services/core/java/com/android/server/pm/parsing/library/OrgApacheHttpLegacyUpdater.java
index d153d9e..7de457e 100644
--- a/services/core/java/com/android/server/pm/parsing/library/OrgApacheHttpLegacyUpdater.java
+++ b/services/core/java/com/android/server/pm/parsing/library/OrgApacheHttpLegacyUpdater.java
@@ -37,7 +37,7 @@
}
@Override
- public void updatePackage(ParsedPackage parsedPackage) {
+ public void updatePackage(ParsedPackage parsedPackage, boolean isUpdatedSystemApp) {
// Packages targeted at <= O_MR1 expect the classes in the org.apache.http.legacy library
// to be accessible so this maintains backward compatibility by adding the
// org.apache.http.legacy library to those packages.
diff --git a/services/core/java/com/android/server/pm/parsing/library/PackageBackwardCompatibility.java b/services/core/java/com/android/server/pm/parsing/library/PackageBackwardCompatibility.java
index 64f8c3a..1d018c4 100644
--- a/services/core/java/com/android/server/pm/parsing/library/PackageBackwardCompatibility.java
+++ b/services/core/java/com/android/server/pm/parsing/library/PackageBackwardCompatibility.java
@@ -113,14 +113,15 @@
* @param parsedPackage the {@link ParsedPackage} to modify.
*/
@VisibleForTesting
- public static void modifySharedLibraries(ParsedPackage parsedPackage) {
- INSTANCE.updatePackage(parsedPackage);
+ public static void modifySharedLibraries(ParsedPackage parsedPackage,
+ boolean isUpdatedSystemApp) {
+ INSTANCE.updatePackage(parsedPackage, isUpdatedSystemApp);
}
@Override
- public void updatePackage(ParsedPackage parsedPackage) {
+ public void updatePackage(ParsedPackage parsedPackage, boolean isUpdatedSystemApp) {
for (PackageSharedLibraryUpdater packageUpdater : mPackageUpdaters) {
- packageUpdater.updatePackage(parsedPackage);
+ packageUpdater.updatePackage(parsedPackage, isUpdatedSystemApp);
}
}
@@ -145,7 +146,7 @@
public static class AndroidTestRunnerSplitUpdater extends PackageSharedLibraryUpdater {
@Override
- public void updatePackage(ParsedPackage parsedPackage) {
+ public void updatePackage(ParsedPackage parsedPackage, boolean isUpdatedSystemApp) {
// android.test.runner has a dependency on android.test.mock so if android.test.runner
// is present but android.test.mock is not then add android.test.mock.
prefixImplicitDependency(parsedPackage, ANDROID_TEST_RUNNER, ANDROID_TEST_MOCK);
@@ -161,7 +162,7 @@
extends PackageSharedLibraryUpdater {
@Override
- public void updatePackage(ParsedPackage parsedPackage) {
+ public void updatePackage(ParsedPackage parsedPackage, boolean isUpdatedSystemApp) {
removeLibrary(parsedPackage, ORG_APACHE_HTTP_LEGACY);
}
@@ -176,7 +177,7 @@
extends PackageSharedLibraryUpdater {
@Override
- public void updatePackage(ParsedPackage parsedPackage) {
+ public void updatePackage(ParsedPackage parsedPackage, boolean isUpdatedSystemApp) {
removeLibrary(parsedPackage, ANDROID_TEST_BASE);
}
}
diff --git a/services/core/java/com/android/server/pm/parsing/library/PackageSharedLibraryUpdater.java b/services/core/java/com/android/server/pm/parsing/library/PackageSharedLibraryUpdater.java
index d84ee36..123b808 100644
--- a/services/core/java/com/android/server/pm/parsing/library/PackageSharedLibraryUpdater.java
+++ b/services/core/java/com/android/server/pm/parsing/library/PackageSharedLibraryUpdater.java
@@ -38,7 +38,7 @@
*
* @param parsedPackage the package to update.
*/
- public abstract void updatePackage(ParsedPackage parsedPackage);
+ public abstract void updatePackage(ParsedPackage parsedPackage, boolean isUpdatedSystemApp);
static void removeLibrary(ParsedPackage parsedPackage, String libraryName) {
parsedPackage.removeUsesLibrary(libraryName)
diff --git a/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackage.java b/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackage.java
index 8db6c3f..7929579 100644
--- a/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackage.java
+++ b/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackage.java
@@ -55,21 +55,6 @@
*/
public interface AndroidPackage extends PkgAppInfo, PkgPackageInfo, ParsingPackageRead, Parcelable {
- //TODO(b/135203078): Move to PackageSetting
- @Deprecated
- @Nullable
- String[] getUsesLibraryFiles();
-
- //TODO(b/135203078): Move to PackageSetting
- @Deprecated
- List<SharedLibraryInfo> getUsesLibraryInfos();
-
- /**
- * This will eventually be removed. Avoid calling this at all costs.
- */
- @Deprecated
- AndroidPackageWrite mutate();
-
/**
* The names of packages to adopt ownership of permissions from, parsed under
* {@link PackageParser#TAG_ADOPT_PERMISSIONS}.
@@ -94,15 +79,6 @@
String getCodePath();
/**
- * The install time abi override for this package, if any.
- *
- * TODO(b/135203078): This seems like a horrible place to put the abiOverride because
- * this isn't something the packageParser parsers.
- */
- @Nullable
- String getCpuAbiOverride();
-
- /**
* Permissions requested but not in the manifest. These may have been split or migrated from
* previous versions/definitions.
*/
@@ -299,7 +275,6 @@
/**
* The install time abi override to choose 32bit abi's when multiple abi's
* are present. This is only meaningfull for multiarch applications.
- * The use32bitAbi attribute is ignored if cpuAbiOverride is also set.
*/
boolean isUse32BitAbi();
@@ -333,19 +308,4 @@
@Deprecated
@NonNull
String toAppInfoToString();
-
- @Deprecated
- boolean isUpdatedSystemApp();
-
- @Deprecated
- boolean isHiddenUntilInstalled();
-
- @Deprecated
- long[] getLastPackageUsageTimeInMills();
-
- @Deprecated
- long getLatestForegroundPackageUseTimeInMills();
-
- @Deprecated
- long getLatestPackageUseTimeInMills();
}
diff --git a/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackageUtils.java b/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackageUtils.java
index c84e372..780b234 100644
--- a/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackageUtils.java
+++ b/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackageUtils.java
@@ -16,6 +16,8 @@
package com.android.server.pm.parsing.pkg;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
@@ -29,10 +31,12 @@
import android.content.pm.parsing.component.ParsedInstrumentation;
import android.content.pm.parsing.component.ParsedProvider;
import android.content.pm.parsing.component.ParsedService;
+import android.text.TextUtils;
import com.android.internal.content.NativeLibraryHelper;
import com.android.internal.util.ArrayUtils;
import com.android.server.SystemConfig;
+import com.android.server.pm.PackageSetting;
import java.io.IOException;
import java.util.ArrayList;
@@ -194,11 +198,12 @@
return pkg.getStaticSharedLibName() != null || !pkg.getLibraryNames().isEmpty();
}
- public static int getHiddenApiEnforcementPolicy(AndroidPackage pkg) {
+ public static int getHiddenApiEnforcementPolicy(AndroidPackage pkg,
+ @NonNull PackageSetting pkgSetting) {
boolean isAllowedToUseHiddenApis;
if (pkg.isSignedWithPlatformKey()) {
isAllowedToUseHiddenApis = true;
- } else if (pkg.isSystem() || pkg.isUpdatedSystemApp()) {
+ } else if (pkg.isSystem() || pkgSetting.getPkgState().isUpdatedSystemApp()) {
isAllowedToUseHiddenApis = pkg.isUsesNonSdkApi()
|| SystemConfig.getInstance().getHiddenApiWhitelistedApps().contains(
pkg.getPackageName());
@@ -234,4 +239,53 @@
}
return true;
}
+
+ public static String getPrimaryCpuAbi(AndroidPackage pkg, @Nullable PackageSetting pkgSetting) {
+ if (pkgSetting == null || TextUtils.isEmpty(pkgSetting.primaryCpuAbiString)) {
+ return pkg.getPrimaryCpuAbi();
+ }
+
+ return pkgSetting.primaryCpuAbiString;
+ }
+
+ public static String getSecondaryCpuAbi(AndroidPackage pkg,
+ @Nullable PackageSetting pkgSetting) {
+ if (pkgSetting == null || TextUtils.isEmpty(pkgSetting.secondaryCpuAbiString)) {
+ return pkg.getSecondaryCpuAbi();
+ }
+
+ return pkgSetting.secondaryCpuAbiString;
+ }
+
+ /**
+ * Returns the primary ABI as parsed from the package. Used only during parsing and derivation.
+ * Otherwise prefer {@link #getPrimaryCpuAbi(AndroidPackage, PackageSetting)}.
+ *
+ * TODO(b/135203078): Actually hide the method
+ * Placed in the utility to hide the method on the interface.
+ */
+ public static String getRawPrimaryCpuAbi(AndroidPackage pkg) {
+ return pkg.getPrimaryCpuAbi();
+ }
+
+ /**
+ * Returns the secondary ABI as parsed from the package. Used only during parsing and
+ * derivation. Otherwise prefer {@link #getSecondaryCpuAbi(AndroidPackage, PackageSetting)}.
+ *
+ * TODO(b/135203078): Actually hide the method
+ * Placed in the utility to hide the method on the interface.
+ */
+ public static String getRawSecondaryCpuAbi(AndroidPackage pkg) {
+ return pkg.getSecondaryCpuAbi();
+ }
+
+ public static String getSeInfo(AndroidPackage pkg, @Nullable PackageSetting pkgSetting) {
+ if (pkgSetting != null) {
+ String overrideSeInfo = pkgSetting.getPkgState().getOverrideSeInfo();
+ if (!TextUtils.isEmpty(overrideSeInfo)) {
+ return overrideSeInfo;
+ }
+ }
+ return pkg.getSeInfo();
+ }
}
diff --git a/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackageWrite.java b/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackageWrite.java
deleted file mode 100644
index 08bd1e7..0000000
--- a/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackageWrite.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.pm.parsing.pkg;
-
-import android.annotation.Nullable;
-import android.content.pm.PackageParser;
-import android.content.pm.SharedLibraryInfo;
-
-import java.util.List;
-
-/**
- * Contains remaining mutable fields after package parsing has completed.
- *
- * Most are state that can probably be tracked outside of the AndroidPackage object. New methods
- * should never be added to this interface.
- *
- * TODO(b/135203078): Remove entirely
- *
- * @deprecated the eventual goal is that the object returned from parsing represents exactly what
- * was parsed from the APK, and so further mutation should be disallowed,
- * with any state being stored in another class
- *
- * @hide
- */
-@Deprecated
-public interface AndroidPackageWrite extends AndroidPackage {
-
- AndroidPackageWrite setUsesLibraryFiles(@Nullable String[] usesLibraryFiles);
-
- // TODO(b/135203078): Remove or use a non-system wide representation of the shared libraries;
- // this doesn't represent what was parsed from the APK
- AndroidPackageWrite setUsesLibraryInfos(@Nullable List<SharedLibraryInfo> usesLibraryInfos);
-
- AndroidPackageWrite setHiddenUntilInstalled(boolean hidden);
-
- AndroidPackageWrite setUpdatedSystemApp(boolean updatedSystemApp);
-
- AndroidPackageWrite setLastPackageUsageTimeInMills(int reason, long time);
-
- AndroidPackageWrite setPrimaryCpuAbi(String primaryCpuAbi);
-
- AndroidPackageWrite setSeInfo(String seInfo);
-
- AndroidPackageWrite setSigningDetails(PackageParser.SigningDetails signingDetails);
-}
diff --git a/services/core/java/com/android/server/pm/parsing/pkg/PackageImpl.java b/services/core/java/com/android/server/pm/parsing/pkg/PackageImpl.java
index d636eb6..2b508ea 100644
--- a/services/core/java/com/android/server/pm/parsing/pkg/PackageImpl.java
+++ b/services/core/java/com/android/server/pm/parsing/pkg/PackageImpl.java
@@ -57,8 +57,7 @@
*
* @hide
*/
-public final class PackageImpl extends ParsingPackageImpl implements ParsedPackage,
- AndroidPackageWrite, AndroidPackage {
+public final class PackageImpl extends ParsingPackageImpl implements ParsedPackage, AndroidPackage {
public static PackageImpl forParsing(@NonNull String packageName, @NonNull String baseCodePath,
@NonNull String codePath, @NonNull TypedArray manifestArray, boolean isCoreApp) {
@@ -93,19 +92,9 @@
}
@NonNull
- private long[] lastPackageUsageTimeInMills =
- new long[PackageManager.NOTIFY_PACKAGE_USE_REASONS_COUNT];
-
- @NonNull
@DataClass.ParcelWith(ForInternedString.class)
private final String manifestPackageName;
- private boolean updatedSystemApp;
-
- @Nullable
- @DataClass.ParcelWith(ForInternedString.class)
- protected String cpuAbiOverride;
-
private boolean stub;
@Nullable
@@ -149,21 +138,11 @@
private boolean signedWithPlatformKey;
- @Deprecated
- private boolean hiddenUntilInstalled;
-
/**
* This is an appId, the uid if the userId is == USER_SYSTEM
*/
private int uid = -1;
- @Deprecated
- @Nullable
- private String[] usesLibraryFiles;
- @Deprecated
- @Nullable
- private List<SharedLibraryInfo> usesLibraryInfos;
-
@VisibleForTesting
public PackageImpl(@NonNull String packageName, @NonNull String baseCodePath,
@NonNull String codePath, @Nullable TypedArray manifestArray, boolean isCoreApp) {
@@ -184,11 +163,6 @@
}
@Override
- public AndroidPackageWrite mutate() {
- return this;
- }
-
- @Override
public long getLongVersionCode() {
return PackageInfo.composeLongVersionCode(versionCodeMajor, versionCode);
}
@@ -361,12 +335,6 @@
}
@Override
- public PackageImpl setCpuAbiOverride(@Nullable String cpuAbiOverride) {
- this.cpuAbiOverride = TextUtils.safeIntern(cpuAbiOverride);
- return this;
- }
-
- @Override
public PackageImpl setNativeLibraryDir(@Nullable String nativeLibraryDir) {
this.nativeLibraryDir = TextUtils.safeIntern(nativeLibraryDir);
return this;
@@ -476,53 +444,6 @@
}
@Override
- public PackageImpl setLastPackageUsageTimeInMills(int reason, long time) {
- lastPackageUsageTimeInMills[reason] = time;
- return this;
- }
-
- @Override
- public long getLatestPackageUseTimeInMills() {
- long latestUse = 0L;
- for (long use : lastPackageUsageTimeInMills) {
- latestUse = Math.max(latestUse, use);
- }
- return latestUse;
- }
-
- @Override
- public long getLatestForegroundPackageUseTimeInMills() {
- int[] foregroundReasons = {
- PackageManager.NOTIFY_PACKAGE_USE_ACTIVITY,
- PackageManager.NOTIFY_PACKAGE_USE_FOREGROUND_SERVICE
- };
-
- long latestUse = 0L;
- for (int reason : foregroundReasons) {
- latestUse = Math.max(latestUse, lastPackageUsageTimeInMills[reason]);
- }
- return latestUse;
- }
-
- @Override
- public long[] getLastPackageUsageTimeInMills() {
- return lastPackageUsageTimeInMills;
- }
-
- @Override
- public PackageImpl setUsesLibraryInfos(
- @Nullable List<SharedLibraryInfo> usesLibraryInfos) {
- this.usesLibraryInfos = usesLibraryInfos;
- return this;
- }
-
- @Override
- public PackageImpl setUsesLibraryFiles(@Nullable String[] usesLibraryFiles) {
- this.usesLibraryFiles = usesLibraryFiles;
- return this;
- }
-
- @Override
public ParsedPackage setCoreApp(boolean coreApp) {
this.coreApp = coreApp;
return this;
@@ -545,7 +466,6 @@
ApplicationInfo appInfo = super.toAppInfoWithoutState();
appInfo.flags = PackageInfoUtils.appInfoFlags(this, null);
appInfo.privateFlags = PackageInfoUtils.appInfoPrivateFlags(this, null);
- appInfo.hiddenUntilInstalled = hiddenUntilInstalled;
appInfo.nativeLibraryDir = nativeLibraryDir;
appInfo.nativeLibraryRootDir = nativeLibraryRootDir;
appInfo.nativeLibraryRootRequiresIsa = nativeLibraryRootRequiresIsa;
@@ -555,8 +475,6 @@
appInfo.seInfo = seInfo;
appInfo.seInfoUser = seInfoUser;
appInfo.uid = uid;
- appInfo.sharedLibraryFiles = usesLibraryFiles;
- appInfo.sharedLibraryInfos = usesLibraryInfos;
return appInfo;
}
@@ -568,9 +486,7 @@
@Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
- dest.writeBoolean(this.updatedSystemApp);
sForString.parcel(this.manifestPackageName, dest, flags);
- sForString.parcel(this.cpuAbiOverride, dest, flags);
dest.writeBoolean(this.stub);
sForString.parcel(this.nativeLibraryDir, dest, flags);
sForString.parcel(this.nativeLibraryRootDir, dest, flags);
@@ -591,17 +507,11 @@
dest.writeBoolean(this.product);
dest.writeBoolean(this.odm);
dest.writeBoolean(this.signedWithPlatformKey);
- dest.writeBoolean(this.hiddenUntilInstalled);;
- dest.writeLongArray(this.lastPackageUsageTimeInMills);
- dest.writeStringArray(this.usesLibraryFiles);
- dest.writeTypedList(this.usesLibraryInfos);
}
public PackageImpl(Parcel in) {
super(in);
- this.updatedSystemApp = in.readBoolean();
this.manifestPackageName = sForString.unparcel(in);
- this.cpuAbiOverride = sForString.unparcel(in);
this.stub = in.readBoolean();
this.nativeLibraryDir = sForString.unparcel(in);
this.nativeLibraryRootDir = sForString.unparcel(in);
@@ -622,10 +532,6 @@
this.product = in.readBoolean();
this.odm = in.readBoolean();
this.signedWithPlatformKey = in.readBoolean();
- this.hiddenUntilInstalled = in.readBoolean();
- this.lastPackageUsageTimeInMills = in.createLongArray();
- this.usesLibraryFiles = in.createStringArray();
- this.usesLibraryInfos = in.createTypedArrayList(SharedLibraryInfo.CREATOR);
}
public static final Creator<PackageImpl> CREATOR = new Creator<PackageImpl>() {
@@ -646,17 +552,6 @@
return manifestPackageName;
}
- @Override
- public boolean isUpdatedSystemApp() {
- return updatedSystemApp;
- }
-
- @Nullable
- @Override
- public String getCpuAbiOverride() {
- return cpuAbiOverride;
- }
-
@DataClass.Generated.Member
public boolean isStub() {
return stub;
@@ -759,12 +654,6 @@
return signedWithPlatformKey;
}
- @Deprecated
- @Override
- public boolean isHiddenUntilInstalled() {
- return hiddenUntilInstalled;
- }
-
/**
* This is an appId, the uid if the userId is == USER_SYSTEM
*/
@@ -773,26 +662,6 @@
return uid;
}
- @Deprecated
- @Nullable
- @Override
- public String[] getUsesLibraryFiles() {
- return usesLibraryFiles;
- }
-
- @Deprecated
- @Nullable
- @Override
- public List<SharedLibraryInfo> getUsesLibraryInfos() {
- return usesLibraryInfos;
- }
-
- @Override
- public PackageImpl setUpdatedSystemApp(boolean value) {
- updatedSystemApp = value;
- return this;
- }
-
@DataClass.Generated.Member
public PackageImpl setStub(boolean value) {
stub = value;
@@ -859,12 +728,6 @@
return this;
}
- @DataClass.Generated.Member
- public PackageImpl setHiddenUntilInstalled(@Deprecated boolean value) {
- hiddenUntilInstalled = value;
- return this;
- }
-
/**
* This is an appId, the uid if the userId is == USER_SYSTEM
*/
@@ -875,10 +738,10 @@
}
@DataClass.Generated(
- time = 1579914619453L,
+ time = 1580517688900L,
codegenVersion = "1.0.14",
sourceFile = "frameworks/base/services/core/java/com/android/server/pm/parsing/pkg/PackageImpl.java",
- inputSignatures = "private final @android.annotation.NonNull @com.android.internal.util.DataClass.ParcelWith(com.android.internal.util.Parcelling.BuiltIn.ForInternedString.class) java.lang.String manifestPackageName\nprivate boolean updatedSystemApp\nprotected @android.annotation.Nullable @com.android.internal.util.DataClass.ParcelWith(com.android.internal.util.Parcelling.BuiltIn.ForInternedString.class) java.lang.String cpuAbiOverride\nprivate boolean stub\nprotected @android.annotation.Nullable @com.android.internal.util.DataClass.ParcelWith(com.android.internal.util.Parcelling.BuiltIn.ForInternedString.class) java.lang.String nativeLibraryDir\nprotected @android.annotation.Nullable @com.android.internal.util.DataClass.ParcelWith(com.android.internal.util.Parcelling.BuiltIn.ForInternedString.class) java.lang.String nativeLibraryRootDir\nprivate boolean nativeLibraryRootRequiresIsa\nprotected @android.annotation.Nullable @com.android.internal.util.DataClass.ParcelWith(com.android.internal.util.Parcelling.BuiltIn.ForInternedString.class) java.lang.String primaryCpuAbi\nprotected @android.annotation.Nullable @com.android.internal.util.DataClass.ParcelWith(com.android.internal.util.Parcelling.BuiltIn.ForInternedString.class) java.lang.String secondaryCpuAbi\nprotected @android.annotation.Nullable @com.android.internal.util.DataClass.ParcelWith(com.android.internal.util.Parcelling.BuiltIn.ForInternedString.class) java.lang.String secondaryNativeLibraryDir\nprotected @android.annotation.Nullable @com.android.internal.util.DataClass.ParcelWith(com.android.internal.util.Parcelling.BuiltIn.ForInternedString.class) java.lang.String seInfo\nprotected @android.annotation.Nullable @com.android.internal.util.DataClass.ParcelWith(com.android.internal.util.Parcelling.BuiltIn.ForInternedString.class) java.lang.String seInfoUser\nprivate boolean system\nprivate boolean factoryTest\nprivate boolean systemExt\nprivate boolean privileged\nprivate boolean oem\nprivate boolean vendor\nprivate boolean product\nprivate boolean odm\nprivate boolean signedWithPlatformKey\nprivate int uid\npublic static final com.android.server.pm.parsing.pkg.Creator<com.android.server.pm.parsing.pkg.PackageImpl> CREATOR\npublic static com.android.server.pm.parsing.pkg.PackageImpl forParsing(java.lang.String,java.lang.String,java.lang.String,android.content.res.TypedArray,boolean)\npublic static com.android.server.pm.parsing.pkg.AndroidPackage buildFakeForDeletion(java.lang.String,java.lang.String)\npublic static @com.android.internal.annotations.VisibleForTesting android.content.pm.parsing.ParsingPackage forTesting(java.lang.String)\npublic static @com.android.internal.annotations.VisibleForTesting android.content.pm.parsing.ParsingPackage forTesting(java.lang.String,java.lang.String)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.ParsedPackage hideAsParsed()\npublic @java.lang.Override com.android.server.pm.parsing.pkg.AndroidPackage hideAsFinal()\npublic @java.lang.Override int getFlags()\npublic @java.lang.Override int getPrivateFlags()\npublic @java.lang.Override long getLongVersionCode()\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl removePermission(int)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl addUsesOptionalLibrary(int,java.lang.String)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl addUsesLibrary(int,java.lang.String)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl removeUsesLibrary(java.lang.String)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl removeUsesOptionalLibrary(java.lang.String)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl setSigningDetails(android.content.pm.PackageParser.SigningDetails)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl setRestrictUpdateHash(byte)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl setRealPackage(java.lang.String)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl setPersistent(boolean)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl setDefaultToDeviceProtectedStorage(boolean)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl setDirectBootAware(boolean)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl clearProtectedBroadcasts()\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl clearOriginalPackages()\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl clearAdoptPermissions()\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl setCodePath(java.lang.String)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl setPackageName(java.lang.String)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl setAllComponentsDirectBootAware(boolean)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl setBaseCodePath(java.lang.String)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl setCpuAbiOverride(java.lang.String)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl setNativeLibraryDir(java.lang.String)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl setNativeLibraryRootDir(java.lang.String)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl setPrimaryCpuAbi(java.lang.String)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl setSecondaryCpuAbi(java.lang.String)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl setSecondaryNativeLibraryDir(java.lang.String)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl setSeInfo(java.lang.String)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl setSeInfoUser(java.lang.String)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl setSplitCodePaths(java.lang.String[])\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl capPermissionPriorities()\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl markNotActivitiesAsNotExportedIfSingleUser()\npublic @java.lang.Override java.util.UUID getStorageUuid()\npublic @java.lang.Deprecated @java.lang.Override java.lang.String toAppInfoToString()\npublic @java.lang.Override com.android.server.pm.parsing.pkg.ParsedPackage setCoreApp(boolean)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.ParsedPackage setVersionCode(int)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.ParsedPackage setVersionCodeMajor(int)\npublic @java.lang.Override android.content.pm.ApplicationInfo toAppInfoWithoutState()\npublic @java.lang.Override int describeContents()\npublic @java.lang.Override void writeToParcel(android.os.Parcel,int)\nclass PackageImpl extends android.content.pm.parsing.ParsingPackageImpl implements [com.android.server.pm.parsing.pkg.ParsedPackage, com.android.server.pm.parsing.pkg.AndroidPackage]\n@com.android.internal.util.DataClass(genConstructor=false, genParcelable=false, genAidl=false, genBuilder=false, genHiddenConstructor=false, genCopyConstructor=false)")
+ inputSignatures = "private final @android.annotation.NonNull @com.android.internal.util.DataClass.ParcelWith(com.android.internal.util.Parcelling.BuiltIn.ForInternedString.class) java.lang.String manifestPackageName\nprivate boolean stub\nprotected @android.annotation.Nullable @com.android.internal.util.DataClass.ParcelWith(com.android.internal.util.Parcelling.BuiltIn.ForInternedString.class) java.lang.String nativeLibraryDir\nprotected @android.annotation.Nullable @com.android.internal.util.DataClass.ParcelWith(com.android.internal.util.Parcelling.BuiltIn.ForInternedString.class) java.lang.String nativeLibraryRootDir\nprivate boolean nativeLibraryRootRequiresIsa\nprotected @android.annotation.Nullable @com.android.internal.util.DataClass.ParcelWith(com.android.internal.util.Parcelling.BuiltIn.ForInternedString.class) java.lang.String primaryCpuAbi\nprotected @android.annotation.Nullable @com.android.internal.util.DataClass.ParcelWith(com.android.internal.util.Parcelling.BuiltIn.ForInternedString.class) java.lang.String secondaryCpuAbi\nprotected @android.annotation.Nullable @com.android.internal.util.DataClass.ParcelWith(com.android.internal.util.Parcelling.BuiltIn.ForInternedString.class) java.lang.String secondaryNativeLibraryDir\nprotected @android.annotation.Nullable @com.android.internal.util.DataClass.ParcelWith(com.android.internal.util.Parcelling.BuiltIn.ForInternedString.class) java.lang.String seInfo\nprotected @android.annotation.Nullable @com.android.internal.util.DataClass.ParcelWith(com.android.internal.util.Parcelling.BuiltIn.ForInternedString.class) java.lang.String seInfoUser\nprivate boolean system\nprivate boolean factoryTest\nprivate boolean systemExt\nprivate boolean privileged\nprivate boolean oem\nprivate boolean vendor\nprivate boolean product\nprivate boolean odm\nprivate boolean signedWithPlatformKey\nprivate int uid\npublic static final com.android.server.pm.parsing.pkg.Creator<com.android.server.pm.parsing.pkg.PackageImpl> CREATOR\npublic static com.android.server.pm.parsing.pkg.PackageImpl forParsing(java.lang.String,java.lang.String,java.lang.String,android.content.res.TypedArray,boolean)\npublic static com.android.server.pm.parsing.pkg.AndroidPackage buildFakeForDeletion(java.lang.String,java.lang.String)\npublic static @com.android.internal.annotations.VisibleForTesting android.content.pm.parsing.ParsingPackage forTesting(java.lang.String)\npublic static @com.android.internal.annotations.VisibleForTesting android.content.pm.parsing.ParsingPackage forTesting(java.lang.String,java.lang.String)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.ParsedPackage hideAsParsed()\npublic @java.lang.Override com.android.server.pm.parsing.pkg.AndroidPackage hideAsFinal()\npublic @java.lang.Override long getLongVersionCode()\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl removePermission(int)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl addUsesOptionalLibrary(int,java.lang.String)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl addUsesLibrary(int,java.lang.String)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl removeUsesLibrary(java.lang.String)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl removeUsesOptionalLibrary(java.lang.String)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl setSigningDetails(android.content.pm.PackageParser.SigningDetails)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl setRestrictUpdateHash(byte)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl setRealPackage(java.lang.String)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl setPersistent(boolean)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl setDefaultToDeviceProtectedStorage(boolean)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl setDirectBootAware(boolean)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl clearProtectedBroadcasts()\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl clearOriginalPackages()\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl clearAdoptPermissions()\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl setCodePath(java.lang.String)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl setPackageName(java.lang.String)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl setAllComponentsDirectBootAware(boolean)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl setBaseCodePath(java.lang.String)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl setNativeLibraryDir(java.lang.String)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl setNativeLibraryRootDir(java.lang.String)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl setPrimaryCpuAbi(java.lang.String)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl setSecondaryCpuAbi(java.lang.String)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl setSecondaryNativeLibraryDir(java.lang.String)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl setSeInfo(java.lang.String)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl setSeInfoUser(java.lang.String)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl setSplitCodePaths(java.lang.String[])\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl capPermissionPriorities()\npublic @java.lang.Override com.android.server.pm.parsing.pkg.PackageImpl markNotActivitiesAsNotExportedIfSingleUser()\npublic @java.lang.Override java.util.UUID getStorageUuid()\npublic @java.lang.Deprecated @java.lang.Override java.lang.String toAppInfoToString()\npublic @java.lang.Override com.android.server.pm.parsing.pkg.ParsedPackage setCoreApp(boolean)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.ParsedPackage setVersionCode(int)\npublic @java.lang.Override com.android.server.pm.parsing.pkg.ParsedPackage setVersionCodeMajor(int)\npublic @java.lang.Override android.content.pm.ApplicationInfo toAppInfoWithoutState()\npublic @java.lang.Override int describeContents()\npublic @java.lang.Override void writeToParcel(android.os.Parcel,int)\nclass PackageImpl extends android.content.pm.parsing.ParsingPackageImpl implements [com.android.server.pm.parsing.pkg.ParsedPackage, com.android.server.pm.parsing.pkg.AndroidPackage]\n@com.android.internal.util.DataClass(genConstructor=false, genParcelable=false, genAidl=false, genBuilder=false, genHiddenConstructor=false, genCopyConstructor=false)")
@Deprecated
private void __metadata() {}
diff --git a/services/core/java/com/android/server/pm/parsing/pkg/ParsedPackage.java b/services/core/java/com/android/server/pm/parsing/pkg/ParsedPackage.java
index b413560..2660f2b 100644
--- a/services/core/java/com/android/server/pm/parsing/pkg/ParsedPackage.java
+++ b/services/core/java/com/android/server/pm/parsing/pkg/ParsedPackage.java
@@ -47,8 +47,6 @@
ParsedPackage setCodePath(String codePath);
- ParsedPackage setCpuAbiOverride(String cpuAbiOverride);
-
ParsedPackage setNativeLibraryDir(String nativeLibraryDir);
ParsedPackage setNativeLibraryRootDir(String nativeLibraryRootDir);
@@ -119,7 +117,4 @@
ParsedPackage setDirectBootAware(boolean directBootAware);
ParsedPackage setPersistent(boolean persistent);
-
- @Deprecated
- ParsedPackage setUpdatedSystemApp(boolean updatedSystemApp);
}
diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
index da8b2fd..980aaed 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
@@ -2453,7 +2453,7 @@
}
} else if (bp.isSignature()) {
// For all apps signature permissions are install time ones.
- allowedSig = grantSignaturePermission(perm, pkg, bp, origPermissions);
+ allowedSig = grantSignaturePermission(perm, pkg, ps, bp, origPermissions);
if (allowedSig) {
grant = GRANT_INSTALL;
}
@@ -2789,7 +2789,7 @@
}
if ((changedInstallPermission || replace) && !ps.areInstallPermissionsFixed() &&
- !ps.isSystem() || ps.isUpdatedSystem()) {
+ !ps.isSystem() || !ps.getPkgState().isUpdatedSystemApp()) {
// This is the first that we have heard about this package, so the
// permissions we have now selected are fixed until explicitly
// changed.
@@ -3132,7 +3132,7 @@
}
private boolean grantSignaturePermission(String perm, AndroidPackage pkg,
- BasePermission bp, PermissionsState origPermissions) {
+ PackageSetting pkgSetting, BasePermission bp, PermissionsState origPermissions) {
boolean oemPermission = bp.isOEM();
boolean vendorPrivilegedPermission = bp.isVendorPrivileged();
boolean privilegedPermission = bp.isPrivileged() || bp.isVendorPrivileged();
@@ -3144,7 +3144,7 @@
&& !platformPackage && platformPermission) {
if (!hasPrivappWhitelistEntry(perm, pkg)) {
// Only report violations for apps on system image
- if (!mSystemReady && !pkg.isUpdatedSystemApp()) {
+ if (!mSystemReady && !pkgSetting.getPkgState().isUpdatedSystemApp()) {
// it's only a reportable violation if the permission isn't explicitly denied
ArraySet<String> deniedPermissions = null;
if (pkg.isVendor()) {
@@ -3210,8 +3210,8 @@
if (pkg.isSystem()) {
// For updated system applications, a privileged/oem permission
// is granted only if it had been defined by the original application.
- if (pkg.isUpdatedSystemApp()) {
- final PackageSetting disabledPs = (PackageSetting) mPackageManagerInt
+ if (pkgSetting.getPkgState().isUpdatedSystemApp()) {
+ final PackageSetting disabledPs = mPackageManagerInt
.getDisabledSystemPackage(pkg.getPackageName());
final AndroidPackage disabledPkg = disabledPs == null ? null : disabledPs.pkg;
if (disabledPs != null
diff --git a/services/core/java/com/android/server/pm/pkg/PackageStateUnserialized.java b/services/core/java/com/android/server/pm/pkg/PackageStateUnserialized.java
new file mode 100644
index 0000000..c008d93
--- /dev/null
+++ b/services/core/java/com/android/server/pm/pkg/PackageStateUnserialized.java
@@ -0,0 +1,196 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.pm.pkg;
+
+import static java.util.Collections.emptyList;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageParser;
+import android.content.pm.SharedLibraryInfo;
+
+import com.android.internal.util.DataClass;
+import com.android.server.pm.PackageSetting;
+
+import java.util.List;
+
+/**
+ * For use by {@link PackageSetting} to maintain functionality that used to exist in
+ * {@link PackageParser.Package}.
+ *
+ * It is assumed that anything inside the package was not cached or written to disk, so none of
+ * these fields are either. They must be set on every boot from other state on the device.
+ */
+@DataClass(genSetters = true, genConstructor = false, genBuilder = false)
+public class PackageStateUnserialized {
+
+ private boolean hiddenUntilInstalled;
+
+ @NonNull
+ private List<SharedLibraryInfo> usesLibraryInfos = emptyList();
+
+ @NonNull
+ private List<String> usesLibraryFiles = emptyList();
+
+ private boolean updatedSystemApp;
+
+ @NonNull
+ private volatile long[] lastPackageUsageTimeInMills;
+
+ @Nullable
+ private String overrideSeInfo;
+
+ private long[] lazyInitLastPackageUsageTimeInMills() {
+ return new long[PackageManager.NOTIFY_PACKAGE_USE_REASONS_COUNT];
+ }
+
+ public PackageStateUnserialized setLastPackageUsageTimeInMills(int reason, long time) {
+ getLastPackageUsageTimeInMills()[reason] = time;
+ return this;
+ }
+
+ public long getLatestPackageUseTimeInMills() {
+ long latestUse = 0L;
+ for (long use : getLastPackageUsageTimeInMills()) {
+ latestUse = Math.max(latestUse, use);
+ }
+ return latestUse;
+ }
+
+ public long getLatestForegroundPackageUseTimeInMills() {
+ int[] foregroundReasons = {
+ PackageManager.NOTIFY_PACKAGE_USE_ACTIVITY,
+ PackageManager.NOTIFY_PACKAGE_USE_FOREGROUND_SERVICE
+ };
+
+ long latestUse = 0L;
+ for (int reason : foregroundReasons) {
+ latestUse = Math.max(latestUse, getLastPackageUsageTimeInMills()[reason]);
+ }
+ return latestUse;
+ }
+
+
+
+ // Code below generated by codegen v1.0.14.
+ //
+ // DO NOT MODIFY!
+ // CHECKSTYLE:OFF Generated code
+ //
+ // To regenerate run:
+ // $ codegen $ANDROID_BUILD_TOP/frameworks/base/services/core/java/com/android/server/pm/pkg/PackageStateUnserialized.java
+ //
+ // To exclude the generated code from IntelliJ auto-formatting enable (one-time):
+ // Settings > Editor > Code Style > Formatter Control
+ //@formatter:off
+
+
+ @DataClass.Generated.Member
+ public boolean isHiddenUntilInstalled() {
+ return hiddenUntilInstalled;
+ }
+
+ @DataClass.Generated.Member
+ public @NonNull List<SharedLibraryInfo> getUsesLibraryInfos() {
+ return usesLibraryInfos;
+ }
+
+ @DataClass.Generated.Member
+ public @NonNull List<String> getUsesLibraryFiles() {
+ return usesLibraryFiles;
+ }
+
+ @DataClass.Generated.Member
+ public boolean isUpdatedSystemApp() {
+ return updatedSystemApp;
+ }
+
+ @DataClass.Generated.Member
+ public @NonNull long[] getLastPackageUsageTimeInMills() {
+ long[] _lastPackageUsageTimeInMills = lastPackageUsageTimeInMills;
+ if (_lastPackageUsageTimeInMills == null) {
+ synchronized(this) {
+ _lastPackageUsageTimeInMills = lastPackageUsageTimeInMills;
+ if (_lastPackageUsageTimeInMills == null) {
+ _lastPackageUsageTimeInMills = lastPackageUsageTimeInMills = lazyInitLastPackageUsageTimeInMills();
+ }
+ }
+ }
+ return _lastPackageUsageTimeInMills;
+ }
+
+ @DataClass.Generated.Member
+ public @Nullable String getOverrideSeInfo() {
+ return overrideSeInfo;
+ }
+
+ @DataClass.Generated.Member
+ public PackageStateUnserialized setHiddenUntilInstalled(boolean value) {
+ hiddenUntilInstalled = value;
+ return this;
+ }
+
+ @DataClass.Generated.Member
+ public PackageStateUnserialized setUsesLibraryInfos(@NonNull List<SharedLibraryInfo> value) {
+ usesLibraryInfos = value;
+ com.android.internal.util.AnnotationValidations.validate(
+ NonNull.class, null, usesLibraryInfos);
+ return this;
+ }
+
+ @DataClass.Generated.Member
+ public PackageStateUnserialized setUsesLibraryFiles(@NonNull List<String> value) {
+ usesLibraryFiles = value;
+ com.android.internal.util.AnnotationValidations.validate(
+ NonNull.class, null, usesLibraryFiles);
+ return this;
+ }
+
+ @DataClass.Generated.Member
+ public PackageStateUnserialized setUpdatedSystemApp(boolean value) {
+ updatedSystemApp = value;
+ return this;
+ }
+
+ @DataClass.Generated.Member
+ public PackageStateUnserialized setLastPackageUsageTimeInMills(@NonNull long... value) {
+ lastPackageUsageTimeInMills = value;
+ com.android.internal.util.AnnotationValidations.validate(
+ NonNull.class, null, lastPackageUsageTimeInMills);
+ return this;
+ }
+
+ @DataClass.Generated.Member
+ public PackageStateUnserialized setOverrideSeInfo(@Nullable String value) {
+ overrideSeInfo = value;
+ return this;
+ }
+
+ @DataClass.Generated(
+ time = 1580422870209L,
+ codegenVersion = "1.0.14",
+ sourceFile = "frameworks/base/services/core/java/com/android/server/pm/pkg/PackageStateUnserialized.java",
+ inputSignatures = "private boolean hiddenUntilInstalled\nprivate @android.annotation.NonNull java.util.List<android.content.pm.SharedLibraryInfo> usesLibraryInfos\nprivate @android.annotation.NonNull java.util.List<java.lang.String> usesLibraryFiles\nprivate boolean updatedSystemApp\nprivate volatile @android.annotation.NonNull long[] lastPackageUsageTimeInMills\n @android.annotation.Nullable java.lang.String overrideSeInfo\nprivate long[] lazyInitLastPackageUsageTimeInMills()\npublic com.android.server.pm.pkg.PackageStateUnserialized setLastPackageUsageTimeInMills(int,long)\npublic long getLatestPackageUseTimeInMills()\npublic long getLatestForegroundPackageUseTimeInMills()\nclass PackageStateUnserialized extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genSetters=true, genConstructor=false, genBuilder=false)")
+ @Deprecated
+ private void __metadata() {}
+
+
+ //@formatter:on
+ // End of generated code
+
+}
diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java b/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java
index 825712b..d2ec500 100644
--- a/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java
@@ -245,7 +245,7 @@
return new PackageSetting(pkg.getPackageName(), pkg.getRealPackage(),
new File(pkg.getCodePath()), new File(pkg.getCodePath()), null,
pkg.getPrimaryCpuAbi(), pkg.getSecondaryCpuAbi(),
- pkg.getCpuAbiOverride(), pkg.getVersionCode(),
+ null, pkg.getVersionCode(),
PackageInfoUtils.appInfoFlags(pkg, null),
PackageInfoUtils.appInfoPrivateFlags(pkg, null),
pkg.getSharedUserLabel(), null, null, null);
@@ -274,9 +274,9 @@
assertArrayEquals(a.getSplitFlags(), b.getSplitFlags());
PackageInfo aInfo = PackageInfoUtils.generate(a, new int[]{}, 0, 0, 0,
- Collections.emptySet(), new PackageUserState(), 0);
+ Collections.emptySet(), new PackageUserState(), 0, mockPkgSetting(a));
PackageInfo bInfo = PackageInfoUtils.generate(b, new int[]{}, 0, 0, 0,
- Collections.emptySet(), new PackageUserState(), 0);
+ Collections.emptySet(), new PackageUserState(), 0, mockPkgSetting(b));
assertApplicationInfoEqual(aInfo.applicationInfo, bInfo.applicationInfo);
assertEquals(ArrayUtils.size(a.getPermissions()), ArrayUtils.size(b.getPermissions()));
@@ -340,7 +340,6 @@
assertEquals(a.getSigningDetails().publicKeys, b.getSigningDetails().publicKeys);
assertEquals(a.getUpgradeKeySets(), b.getUpgradeKeySets());
assertEquals(a.getKeySetMapping(), b.getKeySetMapping());
- assertEquals(a.getCpuAbiOverride(), b.getCpuAbiOverride());
assertArrayEquals(a.getRestrictUpdateHash(), b.getRestrictUpdateHash());
}
@@ -416,10 +415,10 @@
assertComponentsEqual(a, b);
// Sanity check for ServiceInfo.
- ServiceInfo aInfo = PackageInfoUtils.generateServiceInfo(aPkg, a, 0, new PackageUserState(),
- 0);
- ServiceInfo bInfo = PackageInfoUtils.generateServiceInfo(bPkg, b, 0, new PackageUserState(),
- 0);
+ ServiceInfo aInfo = PackageInfoUtils.generateServiceInfo(aPkg, a, 0,
+ new PackageUserState(), 0, mockPkgSetting(aPkg));
+ ServiceInfo bInfo = PackageInfoUtils.generateServiceInfo(bPkg, b, 0,
+ new PackageUserState(), 0, mockPkgSetting(bPkg));
assertApplicationInfoEqual(aInfo.applicationInfo, bInfo.applicationInfo);
assertEquals(a.getName(), b.getName());
}
@@ -434,9 +433,9 @@
// Sanity check for ProviderInfo
ProviderInfo aInfo = PackageInfoUtils.generateProviderInfo(aPkg, a, 0,
- new PackageUserState(), 0);
+ new PackageUserState(), 0, mockPkgSetting(aPkg));
ProviderInfo bInfo = PackageInfoUtils.generateProviderInfo(bPkg, b, 0,
- new PackageUserState(), 0);
+ new PackageUserState(), 0, mockPkgSetting(bPkg));
assertApplicationInfoEqual(aInfo.applicationInfo, bInfo.applicationInfo);
assertEquals(a.getName(), b.getName());
}
@@ -451,9 +450,9 @@
// Sanity check for ActivityInfo.
ActivityInfo aInfo = PackageInfoUtils.generateActivityInfo(aPkg, a, 0,
- new PackageUserState(), 0);
+ new PackageUserState(), 0, mockPkgSetting(aPkg));
ActivityInfo bInfo = PackageInfoUtils.generateActivityInfo(bPkg, b, 0,
- new PackageUserState(), 0);
+ new PackageUserState(), 0, mockPkgSetting(bPkg));
assertApplicationInfoEqual(aInfo.applicationInfo, bInfo.applicationInfo);
assertEquals(a.getName(), b.getName());
}
@@ -583,7 +582,6 @@
.setBaseCodePath("foo5")
.setCodePath("foo4")
.setVersionCode(100)
- .setCpuAbiOverride("foo22")
.setRestrictUpdateHash(new byte[16])
.setVersionCodeMajor(100)
.setCoreApp(true)
diff --git a/services/tests/servicestests/src/com/android/server/pm/ScanRequestBuilder.java b/services/tests/servicestests/src/com/android/server/pm/ScanRequestBuilder.java
index 29ce2d0..12fb400 100644
--- a/services/tests/servicestests/src/com/android/server/pm/ScanRequestBuilder.java
+++ b/services/tests/servicestests/src/com/android/server/pm/ScanRequestBuilder.java
@@ -16,6 +16,8 @@
package com.android.server.pm;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.os.UserHandle;
import com.android.server.pm.parsing.pkg.AndroidPackage;
@@ -33,6 +35,8 @@
private int mScanFlags;
private UserHandle mUser;
private boolean mIsPlatformPackage;
+ @Nullable
+ private String mCpuAbiOverride;
ScanRequestBuilder(ParsedPackage pkg) {
this.mPkg = pkg;
@@ -98,10 +102,16 @@
return this;
}
+ @NonNull
+ public ScanRequestBuilder setCpuAbiOverride(@Nullable String cpuAbiOverride) {
+ this.mCpuAbiOverride = cpuAbiOverride;
+ return this;
+ }
+
PackageManagerService.ScanRequest build() {
return new PackageManagerService.ScanRequest(
mPkg, mSharedUserSetting, mOldPkg, mPkgSetting, mDisabledPkgSetting,
mOriginalPkgSetting, mRealPkgName, mParseFlags, mScanFlags, mIsPlatformPackage,
- mUser);
+ mUser, mCpuAbiOverride);
}
}
diff --git a/services/tests/servicestests/src/com/android/server/pm/ScanTests.java b/services/tests/servicestests/src/com/android/server/pm/ScanTests.java
index d230052..09f946d 100644
--- a/services/tests/servicestests/src/com/android/server/pm/ScanTests.java
+++ b/services/tests/servicestests/src/com/android/server/pm/ScanTests.java
@@ -102,13 +102,13 @@
@Before
public void setupDefaultAbiBehavior() throws Exception {
when(mMockPackageAbiHelper.derivePackageAbi(
- any(AndroidPackage.class), nullable(String.class), anyBoolean()))
+ any(AndroidPackage.class), anyBoolean(), nullable(String.class), anyBoolean()))
.thenReturn(new Pair<>(
new PackageAbiHelper.Abis("derivedPrimary", "derivedSecondary"),
new PackageAbiHelper.NativeLibraryPaths(
"derivedRootDir", true, "derivedNativeDir", "derivedNativeDir2")));
when(mMockPackageAbiHelper.getNativeLibraryPaths(
- any(AndroidPackage.class), any(File.class)))
+ any(AndroidPackage.class), any(PackageSetting.class), any(File.class)))
.thenReturn(new PackageAbiHelper.NativeLibraryPaths(
"getRootDir", true, "getNativeDir", "getNativeDir2"
));
@@ -324,8 +324,7 @@
final ParsedPackage basicPackage =
((ParsedPackage) createBasicPackage(DUMMY_PACKAGE_NAME)
- .hideAsParsed())
- .setCpuAbiOverride("testOverride");
+ .hideAsParsed());
final PackageManagerService.ScanResult scanResult = executeScan(new ScanRequestBuilder(
@@ -523,7 +522,7 @@
assertBasicPackageSetting(scanResult, packageName, isInstant, pkgSetting);
final ApplicationInfo applicationInfo = PackageInfoUtils.generateApplicationInfo(
- pkgSetting.pkg, 0, pkgSetting.readUserState(0), 0);
+ pkgSetting.pkg, 0, pkgSetting.readUserState(0), 0, pkgSetting);
assertBasicApplicationInfo(scanResult, applicationInfo);
}
@@ -558,7 +557,7 @@
private static void assertAbiAndPathssDerived(PackageManagerService.ScanResult scanResult) {
PackageSetting pkgSetting = scanResult.pkgSetting;
final ApplicationInfo applicationInfo = PackageInfoUtils.generateApplicationInfo(
- pkgSetting.pkg, 0, pkgSetting.readUserState(0), 0);
+ pkgSetting.pkg, 0, pkgSetting.readUserState(0), 0, pkgSetting);
assertThat(applicationInfo.primaryCpuAbi, is("derivedPrimary"));
assertThat(applicationInfo.secondaryCpuAbi, is("derivedSecondary"));
@@ -572,7 +571,7 @@
private static void assertPathsNotDerived(PackageManagerService.ScanResult scanResult) {
PackageSetting pkgSetting = scanResult.pkgSetting;
final ApplicationInfo applicationInfo = PackageInfoUtils.generateApplicationInfo(
- pkgSetting.pkg, 0, pkgSetting.readUserState(0), 0);
+ pkgSetting.pkg, 0, pkgSetting.readUserState(0), 0, pkgSetting);
assertThat(applicationInfo.nativeLibraryRootDir, is("getRootDir"));
assertThat(pkgSetting.legacyNativeLibraryPathString, is("getRootDir"));
assertThat(applicationInfo.nativeLibraryRootRequiresIsa, is(true));
diff --git a/services/tests/servicestests/src/com/android/server/pm/parsing/AndroidPackageParsingTestBase.kt b/services/tests/servicestests/src/com/android/server/pm/parsing/AndroidPackageParsingTestBase.kt
index 5b9fbd8..ca6b296 100644
--- a/services/tests/servicestests/src/com/android/server/pm/parsing/AndroidPackageParsingTestBase.kt
+++ b/services/tests/servicestests/src/com/android/server/pm/parsing/AndroidPackageParsingTestBase.kt
@@ -31,10 +31,16 @@
import android.os.Environment
import android.util.SparseArray
import androidx.test.platform.app.InstrumentationRegistry
+import com.android.server.om.mockThrowOnUnmocked
+import com.android.server.om.whenever
import com.android.server.pm.PackageManagerService
+import com.android.server.pm.PackageSetting
import com.android.server.pm.parsing.pkg.AndroidPackage
+import com.android.server.pm.pkg.PackageStateUnserialized
import org.junit.BeforeClass
import org.mockito.Mockito
+import org.mockito.Mockito.anyInt
+import org.mockito.Mockito.mock
import java.io.File
open class AndroidPackageParsingTestBase {
@@ -80,9 +86,9 @@
.toList()
}
- private val dummyState = Mockito.mock(PackageUserState::class.java).apply {
+ private val dummyUserState = mock(PackageUserState::class.java).apply {
installed = true
- Mockito.`when`(isAvailable(Mockito.anyInt())).thenReturn(true)
+ Mockito.`when`(isAvailable(anyInt())).thenReturn(true)
}
lateinit var oldPackages: List<PackageParser.Package>
@@ -111,19 +117,27 @@
}
fun oldAppInfo(pkg: PackageParser.Package, flags: Int = 0): ApplicationInfo? {
- return PackageParser.generateApplicationInfo(pkg, flags, dummyState, 0)
+ return PackageParser.generateApplicationInfo(pkg, flags, dummyUserState, 0)
}
fun newAppInfo(pkg: AndroidPackage, flags: Int = 0): ApplicationInfo? {
- return PackageInfoUtils.generateApplicationInfo(pkg, flags, dummyState, 0)
+ return PackageInfoUtils.generateApplicationInfo(pkg, flags, dummyUserState, 0,
+ mockPkgSetting(pkg))
}
fun oldPackageInfo(pkg: PackageParser.Package, flags: Int = 0): PackageInfo? {
- return PackageParser.generatePackageInfo(pkg, intArrayOf(), flags, 5, 6, emptySet(), dummyState)
+ return PackageParser.generatePackageInfo(pkg, intArrayOf(), flags, 5, 6, emptySet(),
+ dummyUserState)
}
fun newPackageInfo(pkg: AndroidPackage, flags: Int = 0): PackageInfo? {
- return PackageInfoUtils.generate(pkg, intArrayOf(), flags, 5, 6, emptySet(), dummyState, 0)
+ return PackageInfoUtils.generate(pkg, intArrayOf(), flags, 5, 6, emptySet(),
+ dummyUserState, 0, mockPkgSetting(pkg))
+ }
+
+ private fun mockPkgSetting(aPkg: AndroidPackage) = mockThrowOnUnmocked<PackageSetting> {
+ this.pkg = aPkg
+ whenever(pkgState) { PackageStateUnserialized() }
}
}
diff --git a/services/tests/servicestests/src/com/android/server/pm/parsing/library/AndroidTestBaseUpdaterTest.java b/services/tests/servicestests/src/com/android/server/pm/parsing/library/AndroidTestBaseUpdaterTest.java
index 083d4ac..f536052 100644
--- a/services/tests/servicestests/src/com/android/server/pm/parsing/library/AndroidTestBaseUpdaterTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/parsing/library/AndroidTestBaseUpdaterTest.java
@@ -36,7 +36,7 @@
@Presubmit
@SmallTest
@RunWith(OptionalClassRunner.class)
-@OptionalClassRunner.OptionalClass("android.content.pm.parsing.library.AndroidTestBaseUpdater")
+@OptionalClassRunner.OptionalClass("com.android.server.pm.parsing.library.AndroidTestBaseUpdater")
public class AndroidTestBaseUpdaterTest extends PackageSharedLibraryUpdaterTest {
private static final String OTHER_LIBRARY = "other.library";
diff --git a/services/tests/servicestests/src/com/android/server/pm/parsing/library/OrgApacheHttpLegacyUpdaterTest.java b/services/tests/servicestests/src/com/android/server/pm/parsing/library/OrgApacheHttpLegacyUpdaterTest.java
index dd80f26..95b8d3f 100644
--- a/services/tests/servicestests/src/com/android/server/pm/parsing/library/OrgApacheHttpLegacyUpdaterTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/parsing/library/OrgApacheHttpLegacyUpdaterTest.java
@@ -36,7 +36,7 @@
@Presubmit
@SmallTest
@RunWith(OptionalClassRunner.class)
-@OptionalClassRunner.OptionalClass("android.content.pm.parsing.library.OrgApacheHttpLegacyUpdater")
+@OptionalClassRunner.OptionalClass("com.android.server.pm.parsing.library.OrgApacheHttpLegacyUpdater")
public class OrgApacheHttpLegacyUpdaterTest extends PackageSharedLibraryUpdaterTest {
private static final String OTHER_LIBRARY = "other.library";
diff --git a/services/tests/servicestests/src/com/android/server/pm/parsing/library/PackageSharedLibraryUpdaterTest.java b/services/tests/servicestests/src/com/android/server/pm/parsing/library/PackageSharedLibraryUpdaterTest.java
index 1d0a75a..a71572f 100644
--- a/services/tests/servicestests/src/com/android/server/pm/parsing/library/PackageSharedLibraryUpdaterTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/parsing/library/PackageSharedLibraryUpdaterTest.java
@@ -32,7 +32,7 @@
static void checkBackwardsCompatibility(ParsedPackage before, AndroidPackage after,
Supplier<PackageSharedLibraryUpdater> updaterSupplier) {
- updaterSupplier.get().updatePackage(before);
+ updaterSupplier.get().updatePackage(before, false);
check(before.hideAsFinal(), after);
}