Populate activeApexChanged in ActiveApexInfo

PackageManager and ART wants to know whether a different version of an
APEX was activated during this boot compared to the last boot. This
change populates this field from binder call to apexd.

In a follow up CL PackageManager will use that information to drop
apk-in-apex cache on APEX updates.

Test: atest ApexManagerTest
Bug: 225435110
Change-Id: I0ecdf758567fb8677a676d7c39f6b35cdc1208ac
This commit is contained in:
Nikita Ioffe
2022-05-12 00:24:28 +00:00
parent e642409a0c
commit fdef4b6afd
2 changed files with 19 additions and 3 deletions

View File

@@ -121,18 +121,21 @@ public abstract class ApexManager {
public final File preInstalledApexPath;
public final boolean isFactory;
public final File apexFile;
public final boolean activeApexChanged;
private ActiveApexInfo(File apexDirectory, File preInstalledApexPath, File apexFile) {
this(null, apexDirectory, preInstalledApexPath, true, apexFile);
this(null, apexDirectory, preInstalledApexPath, true, apexFile, false);
}
private ActiveApexInfo(@Nullable String apexModuleName, File apexDirectory,
File preInstalledApexPath, boolean isFactory, File apexFile) {
File preInstalledApexPath, boolean isFactory, File apexFile,
boolean activeApexChanged) {
this.apexModuleName = apexModuleName;
this.apexDirectory = apexDirectory;
this.preInstalledApexPath = preInstalledApexPath;
this.isFactory = isFactory;
this.apexFile = apexFile;
this.activeApexChanged = activeApexChanged;
}
private ActiveApexInfo(ApexInfo apexInfo) {
@@ -142,7 +145,8 @@ public abstract class ApexManager {
+ apexInfo.moduleName),
new File(apexInfo.preinstalledModulePath),
apexInfo.isFactory,
new File(apexInfo.modulePath));
new File(apexInfo.modulePath),
apexInfo.activeApexChanged);
}
}

View File

@@ -524,6 +524,18 @@ public class ApexManagerTest {
assertThat(backingApexFile).isNull();
}
@Test
public void testActiveApexChanged() throws RemoteException {
ApexInfo apex1 = createApexInfo(
"com.apex1", 37, true, true, new File("/data/apex/active/com.apex@37.apex"));
apex1.activeApexChanged = true;
apex1.preinstalledModulePath = apex1.modulePath;
when(mApexService.getActivePackages()).thenReturn(new ApexInfo[]{apex1});
final ApexManager.ActiveApexInfo activeApex = mApexManager.getActiveApexInfos().get(0);
assertThat(activeApex.apexModuleName).isEqualTo("com.apex1");
assertThat(activeApex.activeApexChanged).isTrue();
}
private ApexInfo createApexInfoForTestPkg(boolean isActive, boolean isFactory, int version) {
File apexFile = extractResource(TEST_APEX_PKG, TEST_APEX_FILE_NAME);
ApexInfo apexInfo = new ApexInfo();