summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/pm/ApexPackageInfo.java205
-rw-r--r--services/core/java/com/android/server/pm/ComputerEngine.java70
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java4
-rw-r--r--services/core/java/com/android/server/pm/ScanPackageUtils.java4
-rw-r--r--services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java8
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/ApexManagerTest.java68
6 files changed, 192 insertions, 167 deletions
diff --git a/services/core/java/com/android/server/pm/ApexPackageInfo.java b/services/core/java/com/android/server/pm/ApexPackageInfo.java
index f959a52f0374..73cb0ada6b87 100644
--- a/services/core/java/com/android/server/pm/ApexPackageInfo.java
+++ b/services/core/java/com/android/server/pm/ApexPackageInfo.java
@@ -22,10 +22,9 @@ import static com.android.server.pm.ApexManager.MATCH_FACTORY_PACKAGE;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.apex.ApexInfo;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.util.ArrayMap;
+import android.util.Pair;
import android.util.PrintWriterPrinter;
import com.android.internal.annotations.GuardedBy;
@@ -33,8 +32,9 @@ import com.android.internal.util.IndentingPrintWriter;
import com.android.internal.util.Preconditions;
import com.android.server.pm.parsing.PackageParser2;
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 com.android.server.pm.pkg.parsing.PackageInfoWithoutStateUtils;
+import com.android.server.pm.pkg.PackageStateInternal;
import com.android.server.pm.pkg.parsing.ParsingPackageUtils;
import java.io.File;
@@ -59,16 +59,17 @@ class ApexPackageInfo {
private final Object mLock = new Object();
@GuardedBy("mLock")
- private List<PackageInfo> mAllPackagesCache;
+ private List<Pair<ApexInfo, AndroidPackage>> mAllPackagesCache;
- /**
- * Whether an APEX package is active or not.
- *
- * @param packageInfo the package to check
- * @return {@code true} if this package is active, {@code false} otherwise.
- */
- private static boolean isActive(PackageInfo packageInfo) {
- return packageInfo.isActiveApex;
+ @Nullable
+ private final PackageManagerService mPackageManager;
+
+ ApexPackageInfo() {
+ mPackageManager = null;
+ }
+
+ ApexPackageInfo(@NonNull PackageManagerService pms) {
+ mPackageManager = pms;
}
/**
@@ -105,20 +106,23 @@ class ApexPackageInfo {
* is not found.
*/
@Nullable
- PackageInfo getPackageInfo(String packageName, @ApexManager.PackageInfoFlags int flags) {
+ Pair<ApexInfo, AndroidPackage> getPackageInfo(String packageName,
+ @ApexManager.PackageInfoFlags int flags) {
synchronized (mLock) {
Preconditions.checkState(mAllPackagesCache != null,
"APEX packages have not been scanned");
boolean matchActive = (flags & MATCH_ACTIVE_PACKAGE) != 0;
boolean matchFactory = (flags & MATCH_FACTORY_PACKAGE) != 0;
for (int i = 0, size = mAllPackagesCache.size(); i < size; i++) {
- final PackageInfo packageInfo = mAllPackagesCache.get(i);
- if (!packageInfo.packageName.equals(packageName)) {
+ final Pair<ApexInfo, AndroidPackage> pair = mAllPackagesCache.get(i);
+ var apexInfo = pair.first;
+ var pkg = pair.second;
+ if (!pkg.getPackageName().equals(packageName)) {
continue;
}
- if ((matchActive && isActive(packageInfo))
- || (matchFactory && isFactory(packageInfo))) {
- return packageInfo;
+ if ((matchActive && apexInfo.isActive)
+ || (matchFactory && apexInfo.isFactory)) {
+ return pair;
}
}
return null;
@@ -128,18 +132,18 @@ class ApexPackageInfo {
/**
* Retrieves information about all active APEX packages.
*
- * @return a List of PackageInfo object, each one containing information about a different
- * active package.
+ * @return list containing information about different active packages.
*/
- List<PackageInfo> getActivePackages() {
+ @NonNull
+ List<Pair<ApexInfo, AndroidPackage>> getActivePackages() {
synchronized (mLock) {
Preconditions.checkState(mAllPackagesCache != null,
"APEX packages have not been scanned");
- final List<PackageInfo> activePackages = new ArrayList<>();
+ final List<Pair<ApexInfo, AndroidPackage>> activePackages = new ArrayList<>();
for (int i = 0; i < mAllPackagesCache.size(); i++) {
- final PackageInfo packageInfo = mAllPackagesCache.get(i);
- if (isActive(packageInfo)) {
- activePackages.add(packageInfo);
+ final var pair = mAllPackagesCache.get(i);
+ if (pair.first.isActive) {
+ activePackages.add(pair);
}
}
return activePackages;
@@ -147,20 +151,20 @@ class ApexPackageInfo {
}
/**
- * Retrieves information about all active pre-installed APEX packages.
+ * Retrieves information about all pre-installed APEX packages.
*
- * @return a List of PackageInfo object, each one containing information about a different
- * active pre-installed package.
+ * @return list containing information about different pre-installed packages.
*/
- List<PackageInfo> getFactoryPackages() {
+ @NonNull
+ List<Pair<ApexInfo, AndroidPackage>> getFactoryPackages() {
synchronized (mLock) {
Preconditions.checkState(mAllPackagesCache != null,
"APEX packages have not been scanned");
- final List<PackageInfo> factoryPackages = new ArrayList<>();
+ final List<Pair<ApexInfo, AndroidPackage>> factoryPackages = new ArrayList<>();
for (int i = 0; i < mAllPackagesCache.size(); i++) {
- final PackageInfo packageInfo = mAllPackagesCache.get(i);
- if (isFactory(packageInfo)) {
- factoryPackages.add(packageInfo);
+ final var pair = mAllPackagesCache.get(i);
+ if (pair.first.isFactory) {
+ factoryPackages.add(pair);
}
}
return factoryPackages;
@@ -170,18 +174,18 @@ class ApexPackageInfo {
/**
* Retrieves information about all inactive APEX packages.
*
- * @return a List of PackageInfo object, each one containing information about a different
- * inactive package.
+ * @return list containing information about different inactive packages.
*/
- List<PackageInfo> getInactivePackages() {
+ @NonNull
+ List<Pair<ApexInfo, AndroidPackage>> getInactivePackages() {
synchronized (mLock) {
Preconditions.checkState(mAllPackagesCache != null,
"APEX packages have not been scanned");
- final List<PackageInfo> inactivePackages = new ArrayList<>();
+ final List<Pair<ApexInfo, AndroidPackage>> inactivePackages = new ArrayList<>();
for (int i = 0; i < mAllPackagesCache.size(); i++) {
- final PackageInfo packageInfo = mAllPackagesCache.get(i);
- if (!isActive(packageInfo)) {
- inactivePackages.add(packageInfo);
+ final var pair = mAllPackagesCache.get(i);
+ if (!pair.first.isActive) {
+ inactivePackages.add(pair);
}
}
return inactivePackages;
@@ -199,8 +203,8 @@ class ApexPackageInfo {
Preconditions.checkState(mAllPackagesCache != null,
"APEX packages have not been scanned");
for (int i = 0, size = mAllPackagesCache.size(); i < size; i++) {
- final PackageInfo packageInfo = mAllPackagesCache.get(i);
- if (packageInfo.packageName.equals(packageName)) {
+ final var pair = mAllPackagesCache.get(i);
+ if (pair.second.getPackageName().equals(packageName)) {
return true;
}
}
@@ -222,21 +226,18 @@ class ApexPackageInfo {
}
void notifyPackageInstalled(ApexInfo apexInfo, AndroidPackage pkg) {
- final int flags = PackageManager.GET_META_DATA
- | PackageManager.GET_SIGNING_CERTIFICATES
- | PackageManager.GET_SIGNATURES;
- final PackageInfo newApexPkg = PackageInfoWithoutStateUtils.generate(
- pkg, apexInfo, flags);
- final String packageName = newApexPkg.packageName;
+ final String packageName = pkg.getPackageName();
synchronized (mLock) {
for (int i = 0, size = mAllPackagesCache.size(); i < size; i++) {
- PackageInfo oldApexPkg = mAllPackagesCache.get(i);
- if (oldApexPkg.isActiveApex && oldApexPkg.packageName.equals(packageName)) {
- if (isFactory(oldApexPkg)) {
- oldApexPkg.isActiveApex = false;
- mAllPackagesCache.add(newApexPkg);
+ var pair = mAllPackagesCache.get(i);
+ var oldApexInfo = pair.first;
+ var oldApexPkg = pair.second;
+ if (oldApexInfo.isActive && oldApexPkg.getPackageName().equals(packageName)) {
+ if (oldApexInfo.isFactory) {
+ oldApexInfo.isActive = false;
+ mAllPackagesCache.add(Pair.create(apexInfo, pkg));
} else {
- mAllPackagesCache.set(i, newApexPkg);
+ mAllPackagesCache.set(i, Pair.create(apexInfo, pkg));
}
break;
}
@@ -245,16 +246,6 @@ class ApexPackageInfo {
}
/**
- * Whether the APEX package is pre-installed or not.
- *
- * @param packageInfo the package to check
- * @return {@code true} if this package is pre-installed, {@code false} otherwise.
- */
- private static boolean isFactory(@NonNull PackageInfo packageInfo) {
- return (packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) == 0;
- }
-
- /**
* Dumps various state information to the provided {@link PrintWriter} object.
*
* @param pw the {@link PrintWriter} object to send information to.
@@ -288,33 +279,25 @@ class ApexPackageInfo {
HashSet<String> factoryPackagesSet = new HashSet<>();
for (ApexManager.ScanResult result : scanResults) {
ApexInfo ai = result.apexInfo;
-
- final PackageInfo packageInfo = PackageInfoWithoutStateUtils.generate(
- result.pkg, ai, flags);
- if (packageInfo == null) {
- throw new IllegalStateException("Unable to generate package info: "
- + ai.modulePath);
- }
- if (!packageInfo.packageName.equals(result.packageName)) {
+ String packageName = result.pkg.getPackageName();
+ if (!packageName.equals(result.packageName)) {
throw new IllegalStateException("Unmatched package name: "
- + result.packageName + " != " + packageInfo.packageName
+ + result.packageName + " != " + packageName
+ ", path=" + ai.modulePath);
}
- mAllPackagesCache.add(packageInfo);
+ mAllPackagesCache.add(Pair.create(ai, result.pkg));
if (ai.isActive) {
- if (!activePackagesSet.add(packageInfo.packageName)) {
+ if (!activePackagesSet.add(packageName)) {
throw new IllegalStateException(
- "Two active packages have the same name: "
- + packageInfo.packageName);
+ "Two active packages have the same name: " + packageName);
}
}
if (ai.isFactory) {
// Don't throw when the duplicating APEX is VNDK APEX
- if (!factoryPackagesSet.add(packageInfo.packageName)
+ if (!factoryPackagesSet.add(packageName)
&& !ai.moduleName.startsWith(VNDK_APEX_MODULE_NAME_PREFIX)) {
throw new IllegalStateException(
- "Two factory packages have the same name: "
- + packageInfo.packageName);
+ "Two factory packages have the same name: " + packageName);
}
}
}
@@ -348,6 +331,13 @@ class ApexPackageInfo {
if (throwable == null) {
// Calling hideAsFinal to assign derived fields for the app info flags.
parseResult.parsedPackage.hideAsFinal();
+
+ // TODO: When ENABLE_FEATURE_SCAN_APEX is finalized, remove this and the entire
+ // calling path code
+ ScanPackageUtils.applyPolicy(parseResult.parsedPackage,
+ PackageManagerService.SCAN_AS_SYSTEM,
+ mPackageManager == null ? null : mPackageManager.getPlatformPackage(),
+ false);
results.add(new ApexManager.ScanResult(
ai, parseResult.parsedPackage, parseResult.parsedPackage.getPackageName()));
} else if (throwable instanceof PackageManagerException) {
@@ -363,34 +353,69 @@ class ApexPackageInfo {
}
/**
+ * @see #dumpPackages(List, String, IndentingPrintWriter)
+ */
+ static void dumpPackageStates(List<PackageStateInternal> packageStates, boolean isActive,
+ @Nullable String packageName, IndentingPrintWriter ipw) {
+ ipw.println();
+ ipw.increaseIndent();
+ for (int i = 0, size = packageStates.size(); i < size; i++) {
+ final var packageState = packageStates.get(i);
+ var pkg = packageState.getPkg();
+ if (packageName != null && !packageName.equals(pkg.getPackageName())) {
+ continue;
+ }
+ ipw.println(pkg.getPackageName());
+ ipw.increaseIndent();
+ ipw.println("Version: " + pkg.getLongVersionCode());
+ ipw.println("Path: " + pkg.getBaseApkPath());
+ ipw.println("IsActive: " + isActive);
+ ipw.println("IsFactory: " + !packageState.isUpdatedSystemApp());
+ ipw.println("ApplicationInfo: ");
+ ipw.increaseIndent();
+ // TODO: Dump the package manually
+ AndroidPackageUtils.generateAppInfoWithoutState(pkg)
+ .dump(new PrintWriterPrinter(ipw), "");
+ ipw.decreaseIndent();
+ ipw.decreaseIndent();
+ }
+ ipw.decreaseIndent();
+ ipw.println();
+ }
+
+ /**
* Dump information about the packages contained in a particular cache
* @param packagesCache the cache to print information about.
* @param packageName a {@link String} containing a package name, or {@code null}. If set,
* only information about that specific package will be dumped.
* @param ipw the {@link IndentingPrintWriter} object to send information to.
*/
- static void dumpPackages(List<PackageInfo> packagesCache,
+ static void dumpPackages(List<Pair<ApexInfo, AndroidPackage>> packagesCache,
@Nullable String packageName, IndentingPrintWriter ipw) {
ipw.println();
ipw.increaseIndent();
for (int i = 0, size = packagesCache.size(); i < size; i++) {
- final PackageInfo pi = packagesCache.get(i);
- if (packageName != null && !packageName.equals(pi.packageName)) {
+ final var pair = packagesCache.get(i);
+ var apexInfo = pair.first;
+ var pkg = pair.second;
+ if (packageName != null && !packageName.equals(pkg.getPackageName())) {
continue;
}
- ipw.println(pi.packageName);
+ ipw.println(pkg.getPackageName());
ipw.increaseIndent();
- ipw.println("Version: " + pi.versionCode);
- ipw.println("Path: " + pi.applicationInfo.sourceDir);
- ipw.println("IsActive: " + isActive(pi));
- ipw.println("IsFactory: " + isFactory(pi));
+ ipw.println("Version: " + pkg.getLongVersionCode());
+ ipw.println("Path: " + pkg.getBaseApkPath());
+ ipw.println("IsActive: " + apexInfo.isActive);
+ ipw.println("IsFactory: " + apexInfo.isFactory);
ipw.println("ApplicationInfo: ");
ipw.increaseIndent();
- pi.applicationInfo.dump(new PrintWriterPrinter(ipw), "");
+ // TODO: Dump the package manually
+ AndroidPackageUtils.generateAppInfoWithoutState(pkg)
+ .dump(new PrintWriterPrinter(ipw), "");
ipw.decreaseIndent();
ipw.decreaseIndent();
}
ipw.decreaseIndent();
ipw.println();
}
-}
+} \ No newline at end of file
diff --git a/services/core/java/com/android/server/pm/ComputerEngine.java b/services/core/java/com/android/server/pm/ComputerEngine.java
index 63c25ea520f7..8ec3d2bc74ca 100644
--- a/services/core/java/com/android/server/pm/ComputerEngine.java
+++ b/services/core/java/com/android/server/pm/ComputerEngine.java
@@ -65,6 +65,7 @@ import android.Manifest;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UserIdInt;
+import android.apex.ApexInfo;
import android.app.ActivityManager;
import android.content.ComponentName;
import android.content.Context;
@@ -1018,11 +1019,12 @@ public class ComputerEngine implements Computer {
if ((flags & PackageManager.MATCH_SYSTEM_ONLY) != 0) {
apexFlags = ApexManager.MATCH_FACTORY_PACKAGE;
}
- final PackageInfo pi = mApexPackageInfo.getPackageInfo(packageName, apexFlags);
- if (pi == null) {
+ final var pair = mApexPackageInfo.getPackageInfo(packageName, apexFlags);
+ if (pair == null) {
return null;
}
- return pi.applicationInfo;
+ return PackageInfoUtils.generateApplicationInfo(pair.second, flags,
+ PackageUserStateInternal.DEFAULT, userId, null);
}
}
if ("android".equals(packageName) || "system".equals(packageName)) {
@@ -1718,8 +1720,12 @@ public class ComputerEngine implements Computer {
// Instant app filtering for APEX modules is ignored
if (!ApexPackageInfo.ENABLE_FEATURE_SCAN_APEX) {
if (matchApex) {
- return mApexPackageInfo.getPackageInfo(packageName,
+ final var pair = mApexPackageInfo.getPackageInfo(packageName,
ApexManager.MATCH_FACTORY_PACKAGE);
+ if (pair == null) {
+ return null;
+ }
+ return PackageInfoUtils.generate(pair.second, pair.first, flags, null, userId);
}
}
final PackageStateInternal ps = mSettings.getDisabledSystemPkg(packageName);
@@ -1775,8 +1781,12 @@ public class ComputerEngine implements Computer {
}
if (!ApexPackageInfo.ENABLE_FEATURE_SCAN_APEX) {
if (matchApex) {
- return mApexPackageInfo.getPackageInfo(packageName,
+ final var pair = mApexPackageInfo.getPackageInfo(packageName,
ApexManager.MATCH_ACTIVE_PACKAGE);
+ if (pair == null) {
+ return null;
+ }
+ return PackageInfoUtils.generate(pair.second, pair.first, flags, null, userId);
}
}
return null;
@@ -1883,10 +1893,17 @@ public class ComputerEngine implements Computer {
}
if (!ApexPackageInfo.ENABLE_FEATURE_SCAN_APEX) {
if (listApex) {
+ List<Pair<ApexInfo, AndroidPackage>> pairs;
if (listFactory) {
- list.addAll(mApexPackageInfo.getFactoryPackages());
+ pairs = mApexPackageInfo.getFactoryPackages();
} else {
- list.addAll(mApexPackageInfo.getActivePackages());
+ pairs = mApexPackageInfo.getActivePackages();
+ }
+
+ for (int index = 0; index < pairs.size(); index++) {
+ var pair = pairs.get(index);
+ list.add(PackageInfoUtils.generate(pair.second, pair.first, flags, null,
+ userId));
}
}
}
@@ -3404,29 +3421,23 @@ public class ComputerEngine implements Computer {
} // switch
}
- private void generateApexPackageInfo(List<PackageInfo> activePackages,
- List<PackageInfo> inactivePackages, List<PackageInfo> factoryPackages) {
+ private void generateApexPackageInfo(@NonNull List<PackageStateInternal> activePackages,
+ @NonNull List<PackageStateInternal> inactivePackages,
+ @NonNull List<PackageStateInternal> factoryActivePackages,
+ @NonNull List<PackageStateInternal> factoryInactivePackages) {
for (AndroidPackage p : mPackages.values()) {
final String packageName = p.getPackageName();
PackageStateInternal ps = mSettings.getPackage(packageName);
if (!p.isApex() || ps == null) {
continue;
}
- PackageInfo pi = generatePackageInfo(ps, 0, 0);
- if (pi == null) {
- continue;
- }
- pi.isActiveApex = true;
- activePackages.add(pi);
+ activePackages.add(ps);
if (!ps.isUpdatedSystemApp()) {
- factoryPackages.add(pi);
+ factoryActivePackages.add(ps);
} else {
PackageStateInternal psDisabled = mSettings.getDisabledSystemPkg(packageName);
- pi = generatePackageInfo(psDisabled, 0, 0);
- if (pi != null) {
- factoryPackages.add(pi);
- inactivePackages.add(pi);
- }
+ factoryInactivePackages.add(psDisabled);
+ inactivePackages.add(psDisabled);
}
}
}
@@ -3434,16 +3445,19 @@ public class ComputerEngine implements Computer {
private void dumpApex(PrintWriter pw, String packageName) {
if (ApexPackageInfo.ENABLE_FEATURE_SCAN_APEX) {
final IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " ", 120);
- List<PackageInfo> activePackages = new ArrayList<>();
- List<PackageInfo> inactivePackages = new ArrayList<>();
- List<PackageInfo> factoryPackages = new ArrayList<>();
- generateApexPackageInfo(activePackages, inactivePackages, factoryPackages);
+ List<PackageStateInternal> activePackages = new ArrayList<>();
+ List<PackageStateInternal> inactivePackages = new ArrayList<>();
+ List<PackageStateInternal> factoryActivePackages = new ArrayList<>();
+ List<PackageStateInternal> factoryInactivePackages = new ArrayList<>();
+ generateApexPackageInfo(activePackages, inactivePackages, factoryActivePackages,
+ factoryInactivePackages);
ipw.println("Active APEX packages:");
- ApexPackageInfo.dumpPackages(activePackages, packageName, ipw);
+ ApexPackageInfo.dumpPackageStates(activePackages, true, packageName, ipw);
ipw.println("Inactive APEX packages:");
- ApexPackageInfo.dumpPackages(inactivePackages, packageName, ipw);
+ ApexPackageInfo.dumpPackageStates(inactivePackages, false, packageName, ipw);
ipw.println("Factory APEX packages:");
- ApexPackageInfo.dumpPackages(factoryPackages, packageName, ipw);
+ ApexPackageInfo.dumpPackageStates(factoryActivePackages, true, packageName, ipw);
+ ApexPackageInfo.dumpPackageStates(factoryInactivePackages, false, packageName, ipw);
} else {
mApexPackageInfo.dump(pw, packageName);
}
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 3f052c039f9c..be644143f67b 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -1611,7 +1611,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
mSharedLibraries = injector.getSharedLibrariesImpl();
mApexManager = testParams.apexManager;
- mApexPackageInfo = new ApexPackageInfo();
+ mApexPackageInfo = new ApexPackageInfo(this);
mArtManagerService = testParams.artManagerService;
mAvailableFeatures = testParams.availableFeatures;
mBackgroundDexOptService = testParams.backgroundDexOptService;
@@ -1811,7 +1811,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
mProtectedPackages = new ProtectedPackages(mContext);
mApexManager = injector.getApexManager();
- mApexPackageInfo = new ApexPackageInfo();
+ mApexPackageInfo = new ApexPackageInfo(this);
mAppsFilter = mInjector.getAppsFilter();
mInstantAppRegistry = new InstantAppRegistry(mContext, mPermissionManager,
diff --git a/services/core/java/com/android/server/pm/ScanPackageUtils.java b/services/core/java/com/android/server/pm/ScanPackageUtils.java
index 0e57c917a72b..86affdd75481 100644
--- a/services/core/java/com/android/server/pm/ScanPackageUtils.java
+++ b/services/core/java/com/android/server/pm/ScanPackageUtils.java
@@ -823,8 +823,8 @@ final class ScanPackageUtils {
* ideally be static, but, it requires locks to read system state.
*/
public static void applyPolicy(ParsedPackage parsedPackage,
- final @PackageManagerService.ScanFlags int scanFlags, AndroidPackage platformPkg,
- boolean isUpdatedSystemApp) {
+ final @PackageManagerService.ScanFlags int scanFlags,
+ @Nullable 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
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 9c620c4ff3ab..a44def8f772a 100644
--- a/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java
+++ b/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java
@@ -93,12 +93,14 @@ public class PackageInfoUtils {
/**
* @param pkgSetting See {@link PackageInfoUtils} for description of pkgSetting usage.
+ * @deprecated Once ENABLE_FEATURE_SCAN_APEX is removed, this should also be removed.
*/
+ @Deprecated
@Nullable
- public static PackageInfo generate(AndroidPackage pkg, ApexInfo apexInfo, int flags,
- @Nullable PackageStateInternal pkgSetting) {
+ public static PackageInfo generate(AndroidPackage pkg, ApexInfo apexInfo, long flags,
+ @Nullable PackageStateInternal pkgSetting, @UserIdInt int userId) {
return generateWithComponents(pkg, EmptyArray.INT, flags, 0, 0, Collections.emptySet(),
- PackageUserStateInternal.DEFAULT, UserHandle.getCallingUserId(), apexInfo, pkgSetting);
+ PackageUserStateInternal.DEFAULT, userId, apexInfo, pkgSetting);
}
/**
diff --git a/services/tests/servicestests/src/com/android/server/pm/ApexManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/ApexManagerTest.java
index 20482afd53ac..503ca69a627f 100644
--- a/services/tests/servicestests/src/com/android/server/pm/ApexManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/ApexManagerTest.java
@@ -36,8 +36,6 @@ import android.apex.ApexSessionInfo;
import android.apex.ApexSessionParams;
import android.apex.IApexService;
import android.content.Context;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageInfo;
import android.os.Environment;
import android.os.RemoteException;
import android.os.ServiceSpecificException;
@@ -93,16 +91,16 @@ public class ApexManagerTest {
ApexPackageInfo apexPackageInfo = new ApexPackageInfo();
apexPackageInfo.scanApexPackages(
apexInfo, mPackageParser2, ParallelPackageParser.makeExecutorService());
- final PackageInfo activePkgPi = apexPackageInfo.getPackageInfo(TEST_APEX_PKG,
+ final var activePair = apexPackageInfo.getPackageInfo(TEST_APEX_PKG,
ApexManager.MATCH_ACTIVE_PACKAGE);
- assertThat(activePkgPi).isNotNull();
- assertThat(activePkgPi.packageName).contains(TEST_APEX_PKG);
+ assertThat(activePair).isNotNull();
+ assertThat(activePair.second.getPackageName()).contains(TEST_APEX_PKG);
- final PackageInfo factoryPkgPi = apexPackageInfo.getPackageInfo(TEST_APEX_PKG,
+ final var factoryPair = apexPackageInfo.getPackageInfo(TEST_APEX_PKG,
ApexManager.MATCH_FACTORY_PACKAGE);
- assertThat(factoryPkgPi).isNull();
+ assertThat(factoryPair).isNull();
}
@Test
@@ -111,16 +109,16 @@ public class ApexManagerTest {
ApexPackageInfo apexPackageInfo = new ApexPackageInfo();
apexPackageInfo.scanApexPackages(
apexInfo, mPackageParser2, ParallelPackageParser.makeExecutorService());
- PackageInfo factoryPkgPi = apexPackageInfo.getPackageInfo(TEST_APEX_PKG,
+ var factoryPair = apexPackageInfo.getPackageInfo(TEST_APEX_PKG,
ApexManager.MATCH_FACTORY_PACKAGE);
- assertThat(factoryPkgPi).isNotNull();
- assertThat(factoryPkgPi.packageName).contains(TEST_APEX_PKG);
+ assertThat(factoryPair).isNotNull();
+ assertThat(factoryPair.second.getPackageName()).contains(TEST_APEX_PKG);
- final PackageInfo activePkgPi = apexPackageInfo.getPackageInfo(TEST_APEX_PKG,
+ final var activePair = apexPackageInfo.getPackageInfo(TEST_APEX_PKG,
ApexManager.MATCH_ACTIVE_PACKAGE);
- assertThat(activePkgPi).isNull();
+ assertThat(activePair).isNull();
}
@Test
@@ -388,23 +386,16 @@ public class ApexManagerTest {
newApexInfo = mApexManager.installPackage(installedApex);
apexPackageInfo.notifyPackageInstalled(newApexInfo, mPackageParser2);
- PackageInfo newInfo = apexPackageInfo.getPackageInfo("test.apex.rebootless",
+ var newInfo = apexPackageInfo.getPackageInfo("test.apex.rebootless",
ApexManager.MATCH_ACTIVE_PACKAGE);
- assertThat(newInfo.applicationInfo.sourceDir).isEqualTo(finalApex.getAbsolutePath());
- assertThat(newInfo.applicationInfo.longVersionCode).isEqualTo(2);
- assertThat(newInfo.applicationInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP)
- .isEqualTo(ApplicationInfo.FLAG_UPDATED_SYSTEM_APP);
- assertThat(newInfo.applicationInfo.flags & ApplicationInfo.FLAG_INSTALLED)
- .isEqualTo(ApplicationInfo.FLAG_INSTALLED);
-
- PackageInfo factoryInfo = apexPackageInfo.getPackageInfo("test.apex.rebootless",
+ assertThat(newInfo.second.getBaseApkPath()).isEqualTo(finalApex.getAbsolutePath());
+ assertThat(newInfo.second.getLongVersionCode()).isEqualTo(2);
+
+ var factoryInfo = apexPackageInfo.getPackageInfo("test.apex.rebootless",
ApexManager.MATCH_FACTORY_PACKAGE);
- assertThat(factoryInfo.applicationInfo.sourceDir).isEqualTo(activeApexInfo.modulePath);
- assertThat(factoryInfo.applicationInfo.longVersionCode).isEqualTo(1);
- assertThat(factoryInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM)
- .isEqualTo(ApplicationInfo.FLAG_SYSTEM);
- assertThat(factoryInfo.applicationInfo.flags & ApplicationInfo.FLAG_INSTALLED)
- .isEqualTo(ApplicationInfo.FLAG_INSTALLED);
+ assertThat(factoryInfo.second.getBaseApkPath()).isEqualTo(activeApexInfo.modulePath);
+ assertThat(factoryInfo.second.getLongVersionCode()).isEqualTo(1);
+ assertThat(factoryInfo.second.isSystem()).isTrue();
}
@Test
@@ -429,23 +420,16 @@ public class ApexManagerTest {
newApexInfo = mApexManager.installPackage(installedApex);
apexPackageInfo.notifyPackageInstalled(newApexInfo, mPackageParser2);
- PackageInfo newInfo = apexPackageInfo.getPackageInfo("test.apex.rebootless",
+ var newInfo = apexPackageInfo.getPackageInfo("test.apex.rebootless",
ApexManager.MATCH_ACTIVE_PACKAGE);
- assertThat(newInfo.applicationInfo.sourceDir).isEqualTo(finalApex.getAbsolutePath());
- assertThat(newInfo.applicationInfo.longVersionCode).isEqualTo(2);
- assertThat(newInfo.applicationInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP)
- .isEqualTo(ApplicationInfo.FLAG_UPDATED_SYSTEM_APP);
- assertThat(newInfo.applicationInfo.flags & ApplicationInfo.FLAG_INSTALLED)
- .isEqualTo(ApplicationInfo.FLAG_INSTALLED);
-
- PackageInfo factoryInfo = apexPackageInfo.getPackageInfo("test.apex.rebootless",
+ assertThat(newInfo.second.getBaseApkPath()).isEqualTo(finalApex.getAbsolutePath());
+ assertThat(newInfo.second.getLongVersionCode()).isEqualTo(2);
+
+ var factoryInfo = apexPackageInfo.getPackageInfo("test.apex.rebootless",
ApexManager.MATCH_FACTORY_PACKAGE);
- assertThat(factoryInfo.applicationInfo.sourceDir).isEqualTo(factoryApexInfo.modulePath);
- assertThat(factoryInfo.applicationInfo.longVersionCode).isEqualTo(1);
- assertThat(factoryInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM)
- .isEqualTo(ApplicationInfo.FLAG_SYSTEM);
- assertThat(factoryInfo.applicationInfo.flags & ApplicationInfo.FLAG_INSTALLED)
- .isEqualTo(ApplicationInfo.FLAG_INSTALLED);
+ assertThat(factoryInfo.second.getBaseApkPath()).isEqualTo(factoryApexInfo.modulePath);
+ assertThat(factoryInfo.second.getLongVersionCode()).isEqualTo(1);
+ assertThat(factoryInfo.second.isSystem()).isTrue();
}
@Test