From f012f58232ae4c7efbf336ae3bf4c9c36a38f834 Mon Sep 17 00:00:00 2001 From: Jackal Guo Date: Wed, 26 Jan 2022 12:45:43 +0800 Subject: [PATCH] Fix the dervied fileds in ApplicationInfo are missing for APEXes This is a quick fix for solving the problem of missing dervied fileds in app info for APEXes. Bug: 215198278 Test: atest StagedInstallInternalTest#testGetAppInfo_flagTestOnlyIsSet Test: Verify if the FLAG_TEST_ONLY bit is set in the ApplicationInfo of test_com.android.server via pm dump command. Change-Id: I065c3496ede3e7e3a01f8e0f1b6803b1e6341e89 --- .../java/com/android/server/pm/ApexManager.java | 2 ++ tests/StagedInstallTest/Android.bp | 1 + .../StagedInstallInternalTest.java | 13 +++++++++++++ .../host/StagedInstallInternalTest.java | 13 +++++++++++++ 4 files changed, 29 insertions(+) diff --git a/services/core/java/com/android/server/pm/ApexManager.java b/services/core/java/com/android/server/pm/ApexManager.java index 2e9ad50f23f69..b03e67b6da62c 100644 --- a/services/core/java/com/android/server/pm/ApexManager.java +++ b/services/core/java/com/android/server/pm/ApexManager.java @@ -580,6 +580,8 @@ public abstract class ApexManager { ApexInfo ai = parsingApexInfo.get(parseResult.scanFile); if (throwable == null) { + // Calling hideAsFinal to assign derived fields for the app info flags. + parseResult.parsedPackage.hideAsFinal(); final PackageInfo packageInfo = PackageInfoWithoutStateUtils.generate( parseResult.parsedPackage, ai, flags); if (packageInfo == null) { diff --git a/tests/StagedInstallTest/Android.bp b/tests/StagedInstallTest/Android.bp index 7906f0973ae0f..cce0dde9e6b96 100644 --- a/tests/StagedInstallTest/Android.bp +++ b/tests/StagedInstallTest/Android.bp @@ -62,6 +62,7 @@ java_test_host { ":TestAppAv1", ":test.rebootless_apex_v1", ":test.rebootless_apex_v2", + ":test_com.android.server", ], test_suites: ["general-tests"], test_config: "StagedInstallInternalTest.xml", 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 426f3beafd5ad..e619ca54b9f5b 100644 --- a/tests/StagedInstallTest/app/src/com/android/tests/stagedinstallinternal/StagedInstallInternalTest.java +++ b/tests/StagedInstallTest/app/src/com/android/tests/stagedinstallinternal/StagedInstallInternalTest.java @@ -35,6 +35,7 @@ import android.content.pm.IStagedApexObserver; import android.content.pm.PackageInfo; import android.content.pm.PackageInstaller; import android.content.pm.PackageManager; +import android.content.pm.PackageManager.ApplicationInfoFlags; import android.content.pm.StagedApexInfo; import android.os.IBinder; import android.os.ServiceManager; @@ -80,6 +81,8 @@ public class StagedInstallInternalTest { TEST_APEX_PACKAGE_NAME, 1, /*isApex=*/true, "apex.apexd_test_classpath.apex"); + private static final String TEST_APEX_SYSTEM_SERVER_PACKAGE_NAME = "test_com.android.server"; + private File mTestStateFile = new File( InstrumentationRegistry.getInstrumentation().getContext().getFilesDir(), "stagedinstall_state"); @@ -483,6 +486,16 @@ public class StagedInstallInternalTest { InstallUtils.openPackageInstallerSession(sessionId).abandon(); } + @Test + public void testGetAppInfo_flagTestOnlyIsSet() throws Exception { + final PackageManager pm = + InstrumentationRegistry.getInstrumentation().getContext().getPackageManager(); + final ApplicationInfo info = pm.getApplicationInfo(TEST_APEX_SYSTEM_SERVER_PACKAGE_NAME, + ApplicationInfoFlags.of(PackageManager.MATCH_APEX)); + assertThat(info).isNotNull(); + assertThat((info.flags & ApplicationInfo.FLAG_TEST_ONLY) != 0).isTrue(); + } + public static class MockStagedApexObserver extends IStagedApexObserver.Stub { @Override public void onApexStaged(ApexStagedEvent event) { 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 f06fa81e790cc..f60b4d6aad1e3 100644 --- a/tests/StagedInstallTest/src/com/android/tests/stagedinstallinternal/host/StagedInstallInternalTest.java +++ b/tests/StagedInstallTest/src/com/android/tests/stagedinstallinternal/host/StagedInstallInternalTest.java @@ -62,6 +62,7 @@ public class StagedInstallInternalTest extends BaseHostJUnit4Test { private static final String APK_A = "TestAppAv1.apk"; 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 TEST_VENDOR_APEX_ALLOW_LIST = "/vendor/etc/sysconfig/test-vendor-apex-allow-list.xml"; @@ -512,6 +513,18 @@ public class StagedInstallInternalTest extends BaseHostJUnit4Test { runPhase("testGetStagedApexInfo"); } + @Test + @LargeTest + public void testGetAppInfo_flagTestOnlyIsSet() throws Exception { + assumeTrue("Device does not support updating APEX", + mHostUtils.isApexUpdateSupported()); + + pushTestApex(FAKE_APEX_SYSTEM_SERVER_APEX); + getDevice().reboot(); + + runPhase("testGetAppInfo_flagTestOnlyIsSet"); + } + @Test public void testStagedApexObserver() throws Exception { assumeTrue("Device does not support updating APEX",