From 1be3c76ebaf47f117505800e90e79cece13c6b35 Mon Sep 17 00:00:00 2001 From: JW Wang Date: Thu, 24 Mar 2022 15:55:23 +0800 Subject: [PATCH] Fix the FLAG_INSTALLED for factory APEXes To be consistent with the behavior of system apks. APEX is always preloaded and can never be fully uninsalled. Fix PackageManager#getInstalledPackages for there is no more uninstalled APEX. Inactive APEX is still considered installed. Bug: 226514467 Bug: 225756739 Test: atest com.android.server.pm.ApexManagerTest Change-Id: I784071caee2366f984bd5a1f98a0a575e4c9baf6 --- core/java/android/content/pm/PackageInfo.java | 8 ++++++++ services/core/java/com/android/server/pm/ApexManager.java | 4 ++-- .../core/java/com/android/server/pm/ComputerEngine.java | 3 --- .../pm/pkg/parsing/PackageInfoWithoutStateUtils.java | 7 ++----- .../src/com/android/server/pm/ApexManagerTest.java | 6 ++++-- .../stagedinstallinternal/StagedInstallInternalTest.java | 6 ++++-- 6 files changed, 20 insertions(+), 14 deletions(-) diff --git a/core/java/android/content/pm/PackageInfo.java b/core/java/android/content/pm/PackageInfo.java index f4de829462530..970849373fb4a 100644 --- a/core/java/android/content/pm/PackageInfo.java +++ b/core/java/android/content/pm/PackageInfo.java @@ -448,6 +448,12 @@ public class PackageInfo implements Parcelable { */ public boolean isApex; + /** + * Whether this is an active APEX package. + * @hide + */ + public boolean isActiveApex; + public PackageInfo() { } @@ -534,6 +540,7 @@ public class PackageInfo implements Parcelable { dest.writeInt(0); } dest.writeBoolean(isApex); + dest.writeBoolean(isActiveApex); dest.restoreAllowSquashing(prevAllowSquashing); } @@ -598,5 +605,6 @@ public class PackageInfo implements Parcelable { signingInfo = SigningInfo.CREATOR.createFromParcel(source); } isApex = source.readBoolean(); + isActiveApex = source.readBoolean(); } } diff --git a/services/core/java/com/android/server/pm/ApexManager.java b/services/core/java/com/android/server/pm/ApexManager.java index 44a21b74f4493..e07e3c103f5f5 100644 --- a/services/core/java/com/android/server/pm/ApexManager.java +++ b/services/core/java/com/android/server/pm/ApexManager.java @@ -506,7 +506,7 @@ public abstract class ApexManager { * @return {@code true} if this package is active, {@code false} otherwise. */ private static boolean isActive(PackageInfo packageInfo) { - return (packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_INSTALLED) != 0; + return packageInfo.isActiveApex; } /** @@ -1153,7 +1153,7 @@ public abstract class ApexManager { // Installation was successful, time to update mAllPackagesCache synchronized (mLock) { if (isFactory(existingApexPkg)) { - existingApexPkg.applicationInfo.flags &= ~ApplicationInfo.FLAG_INSTALLED; + existingApexPkg.isActiveApex = false; mAllPackagesCache.add(finalApexPkg); } else { for (int i = 0, size = mAllPackagesCache.size(); i < size; i++) { diff --git a/services/core/java/com/android/server/pm/ComputerEngine.java b/services/core/java/com/android/server/pm/ComputerEngine.java index 8ee1379462f7a..4ea7de34b695b 100644 --- a/services/core/java/com/android/server/pm/ComputerEngine.java +++ b/services/core/java/com/android/server/pm/ComputerEngine.java @@ -1830,9 +1830,6 @@ public class ComputerEngine implements Computer { list.addAll(mApexManager.getFactoryPackages()); } else { list.addAll(mApexManager.getActivePackages()); - if (listUninstalled) { - list.addAll(mApexManager.getInactivePackages()); - } } } return new ParceledListSlice<>(list); diff --git a/services/core/java/com/android/server/pm/pkg/parsing/PackageInfoWithoutStateUtils.java b/services/core/java/com/android/server/pm/pkg/parsing/PackageInfoWithoutStateUtils.java index 03f3b3859821a..8a64884ad6a53 100644 --- a/services/core/java/com/android/server/pm/pkg/parsing/PackageInfoWithoutStateUtils.java +++ b/services/core/java/com/android/server/pm/pkg/parsing/PackageInfoWithoutStateUtils.java @@ -322,17 +322,14 @@ public class PackageInfoWithoutStateUtils { pi.applicationInfo.sourceDir = apexFile.getPath(); pi.applicationInfo.publicSourceDir = apexFile.getPath(); pi.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM; + pi.applicationInfo.flags |= ApplicationInfo.FLAG_INSTALLED; if (apexInfo.isFactory) { pi.applicationInfo.flags &= ~ApplicationInfo.FLAG_UPDATED_SYSTEM_APP; } else { pi.applicationInfo.flags |= ApplicationInfo.FLAG_UPDATED_SYSTEM_APP; } - if (apexInfo.isActive) { - pi.applicationInfo.flags |= ApplicationInfo.FLAG_INSTALLED; - } else { - pi.applicationInfo.flags &= ~ApplicationInfo.FLAG_INSTALLED; - } pi.isApex = true; + pi.isActiveApex = apexInfo.isActive; } final SigningDetails signingDetails = pkg.getSigningDetails(); 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 ef51c976f003f..11acfb7af32a5 100644 --- a/services/tests/servicestests/src/com/android/server/pm/ApexManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/ApexManagerTest.java @@ -397,7 +397,8 @@ public class ApexManagerTest { 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(0); + assertThat(factoryInfo.applicationInfo.flags & ApplicationInfo.FLAG_INSTALLED) + .isEqualTo(ApplicationInfo.FLAG_INSTALLED); } @Test @@ -436,7 +437,8 @@ public class ApexManagerTest { 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(0); + assertThat(factoryInfo.applicationInfo.flags & ApplicationInfo.FLAG_INSTALLED) + .isEqualTo(ApplicationInfo.FLAG_INSTALLED); } @Test diff --git a/tests/StagedInstallTest/app/src/com/android/tests/stagedinstallinternal/StagedInstallInternalTest.java b/tests/StagedInstallTest/app/src/com/android/tests/stagedinstallinternal/StagedInstallInternalTest.java index 28c8793b363e0..ab83997c67fc3 100644 --- a/tests/StagedInstallTest/app/src/com/android/tests/stagedinstallinternal/StagedInstallInternalTest.java +++ b/tests/StagedInstallTest/app/src/com/android/tests/stagedinstallinternal/StagedInstallInternalTest.java @@ -472,7 +472,8 @@ public class StagedInstallInternalTest { assertThat(apex.getLongVersionCode()).isEqualTo(1); assertThat(apex.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) .isEqualTo(ApplicationInfo.FLAG_SYSTEM); - assertThat(apex.applicationInfo.flags & ApplicationInfo.FLAG_INSTALLED).isEqualTo(0); + assertThat(apex.applicationInfo.flags & ApplicationInfo.FLAG_INSTALLED) + .isEqualTo(ApplicationInfo.FLAG_INSTALLED); assertThat(apex.applicationInfo.sourceDir).startsWith("/system/apex"); } @@ -495,7 +496,8 @@ public class StagedInstallInternalTest { assertThat(apex.getLongVersionCode()).isEqualTo(1); assertThat(apex.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) .isEqualTo(ApplicationInfo.FLAG_SYSTEM); - assertThat(apex.applicationInfo.flags & ApplicationInfo.FLAG_INSTALLED).isEqualTo(0); + assertThat(apex.applicationInfo.flags & ApplicationInfo.FLAG_INSTALLED) + .isEqualTo(ApplicationInfo.FLAG_INSTALLED); assertThat(apex.applicationInfo.sourceDir).startsWith("/system/apex"); } }