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
This commit is contained in:
JW Wang
2022-03-24 15:55:23 +08:00
committed by Chun-Wei Wang
parent 2444f9f27d
commit 1be3c76eba
6 changed files with 20 additions and 14 deletions

View File

@@ -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();
}
}

View File

@@ -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++) {

View File

@@ -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);

View File

@@ -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();

View File

@@ -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

View File

@@ -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");
}
}