Fix the isSystemApp flag for APEX

Re-land ag/17321991 with tests fixed.

To be consistent with the behavior of system APKs. An updated
APEX (in /data) is still considered as a system app.

Fix tests by checking the FLAG_UPDATED_SYSTEM_APP flag instead
against updated APEX.

Bug: 225760014
Bug: 225756739
Test: atest CtsStagedInstallHostTestCases \
            com.android.server.pm.ApexManagerTest \
	    GtsStagedInstallHostTestCases \
	    StagedInstallInternalTest \
	    com.android.server.pm.parsing.PackageParserLegacyCoreTest
Change-Id: I4d59cc37ca388ba3c8d22c679b17ede6720d1d03
This commit is contained in:
JW Wang
2022-03-21 11:04:34 +08:00
parent 4031ad06f5
commit f274885c98
5 changed files with 11 additions and 8 deletions

View File

@@ -214,7 +214,7 @@ public abstract class ApexManager {
* @return {@code true} if this package is pre-installed, {@code false} otherwise.
*/
public static boolean isFactory(@NonNull PackageInfo packageInfo) {
return (packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
return (packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) == 0;
}
/**

View File

@@ -321,11 +321,10 @@ public class PackageInfoWithoutStateUtils {
pi.applicationInfo.sourceDir = apexFile.getPath();
pi.applicationInfo.publicSourceDir = apexFile.getPath();
pi.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
if (apexInfo.isFactory) {
pi.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
pi.applicationInfo.flags &= ~ApplicationInfo.FLAG_UPDATED_SYSTEM_APP;
} else {
pi.applicationInfo.flags &= ~ApplicationInfo.FLAG_SYSTEM;
pi.applicationInfo.flags |= ApplicationInfo.FLAG_UPDATED_SYSTEM_APP;
}
if (apexInfo.isActive) {

View File

@@ -386,7 +386,8 @@ public class ApexManagerTest {
ApexManager.MATCH_ACTIVE_PACKAGE);
assertThat(newInfo.applicationInfo.sourceDir).isEqualTo(finalApex.getAbsolutePath());
assertThat(newInfo.applicationInfo.longVersionCode).isEqualTo(2);
assertThat(newInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM).isEqualTo(0);
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);
@@ -424,7 +425,8 @@ public class ApexManagerTest {
ApexManager.MATCH_ACTIVE_PACKAGE);
assertThat(newInfo.applicationInfo.sourceDir).isEqualTo(finalApex.getAbsolutePath());
assertThat(newInfo.applicationInfo.longVersionCode).isEqualTo(2);
assertThat(newInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM).isEqualTo(0);
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);

View File

@@ -566,7 +566,7 @@ public class PackageParserLegacyCoreTest {
assertNotNull(pi.signingInfo);
assertTrue(pi.signingInfo.getApkContentsSigners().length > 0);
assertTrue(pi.isApex);
assertTrue((pi.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0);
assertTrue((pi.applicationInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0);
assertTrue((pi.applicationInfo.flags & ApplicationInfo.FLAG_INSTALLED) != 0);
}

View File

@@ -460,7 +460,8 @@ public class StagedInstallInternalTest {
{
PackageInfo apex = pm.getPackageInfo("test.apex.rebootless", PackageManager.MATCH_APEX);
assertThat(apex.getLongVersionCode()).isEqualTo(1);
assertThat(apex.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM).isEqualTo(0);
assertThat(apex.applicationInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP)
.isEqualTo(ApplicationInfo.FLAG_UPDATED_SYSTEM_APP);
assertThat(apex.applicationInfo.flags & ApplicationInfo.FLAG_INSTALLED)
.isEqualTo(ApplicationInfo.FLAG_INSTALLED);
assertThat(apex.applicationInfo.sourceDir).startsWith("/data/apex/active");
@@ -482,7 +483,8 @@ public class StagedInstallInternalTest {
{
PackageInfo apex = pm.getPackageInfo("test.apex.rebootless", PackageManager.MATCH_APEX);
assertThat(apex.getLongVersionCode()).isEqualTo(2);
assertThat(apex.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM).isEqualTo(0);
assertThat(apex.applicationInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP)
.isEqualTo(ApplicationInfo.FLAG_UPDATED_SYSTEM_APP);
assertThat(apex.applicationInfo.flags & ApplicationInfo.FLAG_INSTALLED)
.isEqualTo(ApplicationInfo.FLAG_INSTALLED);
assertThat(apex.applicationInfo.sourceDir).startsWith("/data/apex/active");