summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author JW Wang <wangchun@google.com> 2022-07-04 14:40:58 +0800
committer JW Wang <wangchun@google.com> 2022-07-05 10:32:32 +0800
commitb59f12d74a33061f0c4a916b12bd539290bb9f06 (patch)
treeb6fccf78a19bcad628eb5055d5b4b20e2ce60a36
parent8bc7ad63d3e531da23e3cd1d54696fa7249c676a (diff)
Fix scan flags
SCAN_AS_VENDOR is not set for APEX files on /vendor and results in wrong values of ApplicationInfo#isVendor. Bug: 225756739 Bug: 237946084 Test: atest StagedInstallInternalTest#testVendorApex_Staged Test: atest StagedInstallInternalTest#testVendorApex_NonStaged Change-Id: Ic5bb06190b3e7cd8c028726d9e58799175dabe8f
-rw-r--r--services/core/java/com/android/server/pm/InstallPackageHelper.java3
-rw-r--r--tests/StagedInstallTest/app/src/com/android/tests/stagedinstallinternal/StagedInstallInternalTest.java23
-rw-r--r--tests/StagedInstallTest/src/com/android/tests/stagedinstallinternal/host/StagedInstallInternalTest.java36
3 files changed, 60 insertions, 2 deletions
diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java
index e2bf4a46653b..d68cecb41190 100644
--- a/services/core/java/com/android/server/pm/InstallPackageHelper.java
+++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java
@@ -3476,7 +3476,8 @@ final class InstallPackageHelper {
Throwable throwable = parseResult.throwable;
ApexInfo ai = parsingApexInfo.get(parseResult.scanFile);
int newParseFlags = parseFlags;
- int newScanFlags = scanFlags | SCAN_AS_APEX;
+ int newScanFlags = scanFlags | SCAN_AS_APEX
+ | mPm.getSystemPackageScanFlags(parseResult.scanFile);
if (!ai.isFactory) {
newParseFlags &= ~ParsingPackageUtils.PARSE_IS_SYSTEM_DIR;
newScanFlags |= SCAN_NEW_INSTALL;
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 ab83997c67fc..0375f66069c3 100644
--- a/tests/StagedInstallTest/app/src/com/android/tests/stagedinstallinternal/StagedInstallInternalTest.java
+++ b/tests/StagedInstallTest/app/src/com/android/tests/stagedinstallinternal/StagedInstallInternalTest.java
@@ -66,6 +66,7 @@ import java.util.function.Consumer;
@RunWith(JUnit4.class)
public class StagedInstallInternalTest {
private static final String APK_IN_APEX_TESTAPEX_NAME = "com.android.apex.apkrollback.test";
+ private static final String REBOOTLESS_APEX_PACKAGE_NAME = "test.apex.rebootless";
private static final TestApp TEST_APEX_WITH_APK_V2 = new TestApp("TestApexWithApkV2",
APK_IN_APEX_TESTAPEX_NAME, 2, /*isApex*/true, APK_IN_APEX_TESTAPEX_NAME + "_v2.apex");
private static final TestApp APEX_WRONG_SHA_V2 = new TestApp(
@@ -594,6 +595,28 @@ public class StagedInstallInternalTest {
assertThat(InstallUtils.getInstalledVersion(packageName)).isEqualTo(1);
}
+ @Test
+ public void testVendorApex_VerifyFactory() throws Exception {
+ final PackageManager pm =
+ InstrumentationRegistry.getInstrumentation().getContext().getPackageManager();
+ PackageInfo pi = pm.getPackageInfo(REBOOTLESS_APEX_PACKAGE_NAME, PackageManager.MATCH_APEX);
+ assertThat(pi.getLongVersionCode()).isEqualTo(1);
+ assertThat(pi.applicationInfo.privateFlags & ApplicationInfo.PRIVATE_FLAG_VENDOR)
+ .isEqualTo(ApplicationInfo.PRIVATE_FLAG_VENDOR);
+ assertThat(pi.applicationInfo.sourceDir).startsWith("/vendor/apex");
+ }
+
+ @Test
+ public void testVendorApex_VerifyData() throws Exception {
+ final PackageManager pm =
+ InstrumentationRegistry.getInstrumentation().getContext().getPackageManager();
+ PackageInfo pi = pm.getPackageInfo(REBOOTLESS_APEX_PACKAGE_NAME, PackageManager.MATCH_APEX);
+ assertThat(pi.getLongVersionCode()).isEqualTo(2);
+ assertThat(pi.applicationInfo.privateFlags & ApplicationInfo.PRIVATE_FLAG_VENDOR)
+ .isEqualTo(ApplicationInfo.PRIVATE_FLAG_VENDOR);
+ assertThat(pi.applicationInfo.sourceDir).startsWith("/data/apex");
+ }
+
private IPackageManagerNative getPackageManagerNative() {
IBinder binder = ServiceManager.waitForService("package_native");
assertThat(binder).isNotNull();
diff --git a/tests/StagedInstallTest/src/com/android/tests/stagedinstallinternal/host/StagedInstallInternalTest.java b/tests/StagedInstallTest/src/com/android/tests/stagedinstallinternal/host/StagedInstallInternalTest.java
index 7e0a55ff3f3e..7b17778730eb 100644
--- a/tests/StagedInstallTest/src/com/android/tests/stagedinstallinternal/host/StagedInstallInternalTest.java
+++ b/tests/StagedInstallTest/src/com/android/tests/stagedinstallinternal/host/StagedInstallInternalTest.java
@@ -63,6 +63,8 @@ public class StagedInstallInternalTest extends BaseHostJUnit4Test {
private static final String APK_IN_APEX_TESTAPEX_NAME = "com.android.apex.apkrollback.test";
private static final String APEXD_TEST_APEX = "apex.apexd_test.apex";
private static final String FAKE_APEX_SYSTEM_SERVER_APEX = "test_com.android.server.apex";
+ private static final String REBOOTLESS_V1 = "test.rebootless_apex_v1.apex";
+ private static final String REBOOTLESS_V2 = "test.rebootless_apex_v2.apex";
private static final String TEST_VENDOR_APEX_ALLOW_LIST =
"/vendor/etc/sysconfig/test-vendor-apex-allow-list.xml";
@@ -94,6 +96,7 @@ public class StagedInstallInternalTest extends BaseHostJUnit4Test {
"/data/apex/active/" + APK_IN_APEX_TESTAPEX_NAME + "*.apex",
"/data/apex/active/" + SHIM_APEX_PACKAGE_NAME + "*.apex",
"/system/apex/test.rebootless_apex_v*.apex",
+ "/vendor/apex/test.rebootless_apex_v*.apex",
"/data/apex/active/test.apex.rebootless*.apex",
"/system/app/TestApp/TestAppAv1.apk",
TEST_VENDOR_APEX_ALLOW_LIST);
@@ -137,13 +140,17 @@ public class StagedInstallInternalTest extends BaseHostJUnit4Test {
}
private void pushTestApex(String fileName) throws Exception {
+ pushTestApex(fileName, "system");
+ }
+
+ private void pushTestApex(String fileName, String partition) throws Exception {
CompatibilityBuildHelper buildHelper = new CompatibilityBuildHelper(getBuild());
final File apex = buildHelper.getTestFile(fileName);
if (!getDevice().isAdbRoot()) {
getDevice().enableAdbRoot();
}
getDevice().remountSystemWritable();
- assertTrue(getDevice().pushFile(apex, "/system/apex/" + fileName));
+ assertTrue(getDevice().pushFile(apex, "/" + partition + "/apex/" + fileName));
}
private void pushTestVendorApexAllowList(String installerPackageName) throws Exception {
@@ -497,6 +504,33 @@ public class StagedInstallInternalTest extends BaseHostJUnit4Test {
runPhase("testVendorApexCorrectInstaller_nonStaged");
}
+ /**
+ * Tests correctness of {@link android.content.pm.ApplicationInfo} for APEXes on /vendor.
+ */
+ @Test
+ @LargeTest
+ public void testVendorApex_Staged() throws Exception {
+ pushTestApex(REBOOTLESS_V1, "vendor");
+ getDevice().reboot();
+ runPhase("testVendorApex_VerifyFactory");
+ installPackage(REBOOTLESS_V2, "--staged");
+ getDevice().reboot();
+ runPhase("testVendorApex_VerifyData");
+ }
+
+ /**
+ * Tests correctness of {@link android.content.pm.ApplicationInfo} for APEXes on /vendor.
+ */
+ @Test
+ @LargeTest
+ public void testVendorApex_NonStaged() throws Exception {
+ pushTestApex(REBOOTLESS_V1, "vendor");
+ getDevice().reboot();
+ runPhase("testVendorApex_VerifyFactory");
+ installPackage(REBOOTLESS_V2, "--force-non-staged");
+ runPhase("testVendorApex_VerifyData");
+ }
+
@Test
public void testRebootlessUpdates() throws Exception {
pushTestApex("test.rebootless_apex_v1.apex");