From 9a2b1b350a6db7a78c4f6ed1f8f3d6569f2b84c2 Mon Sep 17 00:00:00 2001 From: Winson Date: Fri, 28 Feb 2020 02:18:07 -0800 Subject: [PATCH] Use PackageInfoUtils with null PackageSetting to set server-only flags PackageImpl on the server side contains fields that are system server specific, such as what partition the package was found on. These fields are hidden from the core side, since they're irrelevant for APKs that are not processed by PackageManagerService. To mirror this, only the server side PackageInfoUtils sets the flags related to theses server-side fields. So when a PackageSetting is created, this server-side PackageInfoUtils must be called, not the core side PackageInfoWithoutStateUtils, with a null PackageSetting, to set the related pkg(Private)Flags. Bug: 150083410 Test: atest android.cts.backup.OtherSoundsSettingsHostSideTest Test: atest com.android.server.pm.parsing Change-Id: Ife39c83e243daf5d3583f04fce1c0f87c0e20585 --- .../android/server/pm/PackageManagerService.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 74cb93d7a101d..1b4a7804d8717 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -213,7 +213,6 @@ import android.content.pm.VersionedPackage; import android.content.pm.dex.ArtManager; import android.content.pm.dex.DexMetadataHelper; import android.content.pm.dex.IArtManager; -import android.content.pm.parsing.PackageInfoWithoutStateUtils; import android.content.pm.parsing.ParsingPackageUtils; import android.content.pm.parsing.component.ParsedActivity; import android.content.pm.parsing.component.ParsedInstrumentation; @@ -10951,17 +10950,22 @@ public class PackageManagerService extends IPackageManager.Stub if (createNewPackage) { final boolean instantApp = (scanFlags & SCAN_AS_INSTANT_APP) != 0; final boolean virtualPreload = (scanFlags & SCAN_AS_VIRTUAL_PRELOAD) != 0; + + // Flags contain system values stored in the server variant of AndroidPackage, + // and so the server-side PackageInfoUtils is still called, even without a + // PackageSetting to pass in. + int pkgFlags = PackageInfoUtils.appInfoFlags(parsedPackage, null); + int pkgPrivateFlags = PackageInfoUtils.appInfoPrivateFlags(parsedPackage, null); + // REMOVE SharedUserSetting from method; update in a separate call pkgSetting = Settings.createNewSetting(parsedPackage.getPackageName(), originalPkgSetting, disabledPkgSetting, realPkgName, sharedUserSetting, destCodeFile, destResourceFile, parsedPackage.getNativeLibraryRootDir(), AndroidPackageUtils.getRawPrimaryCpuAbi(parsedPackage), AndroidPackageUtils.getRawSecondaryCpuAbi(parsedPackage), - parsedPackage.getVersionCode(), - PackageInfoWithoutStateUtils.appInfoFlags(parsedPackage), - PackageInfoWithoutStateUtils.appInfoPrivateFlags(parsedPackage), - user, true /*allowInstall*/, instantApp, - virtualPreload, UserManagerService.getInstance(), usesStaticLibraries, + parsedPackage.getVersionCode(), pkgFlags, pkgPrivateFlags, user, + true /*allowInstall*/, instantApp, virtualPreload, + UserManagerService.getInstance(), usesStaticLibraries, parsedPackage.getUsesStaticLibrariesVersions(), parsedPackage.getMimeGroups()); } else { // make a deep copy to avoid modifying any existing system state.