From 0a98d27b04f225d5b87efa206ef289ba08ee5ad9 Mon Sep 17 00:00:00 2001 From: Jackal Guo Date: Wed, 28 Apr 2021 09:26:03 +0800 Subject: [PATCH] Migrate the usage of sCompatibilityModeEnabled PackageManagerService still set global compatibility mode to the Deprecated PackageParser. We should migrate the usage to the new ParingPackageUtils. Also replacing the usage of PackageParser#generateApplicationInfo in PackageManagerService since we no longer set the compatibility mode to PackageParser. Bug: 186592266 Bug: 174723245 Test: atest -p core/java/android/content/pm \ core/java/com/android/internal/content \ services/core/java/com/android/server/pm \ services/tests/servicestests/src/com/android/server/pm Change-Id: I3f377273e06bd4adbd9311dd3bdc584af0028c77 --- .../pm/parsing/ParsingPackageUtils.java | 7 +++++ .../server/pm/PackageManagerService.java | 28 ++++++++++++++----- .../server/pm/parsing/PackageInfoUtils.java | 2 +- 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/core/java/android/content/pm/parsing/ParsingPackageUtils.java b/core/java/android/content/pm/parsing/ParsingPackageUtils.java index 0fc6b2bd4f2ea..2ce70900f7fe1 100644 --- a/core/java/android/content/pm/parsing/ParsingPackageUtils.java +++ b/core/java/android/content/pm/parsing/ParsingPackageUtils.java @@ -3063,6 +3063,13 @@ public class ParsingPackageUtils { } } + /** + * @hide + */ + public static void setCompatibilityModeEnabled(boolean compatibilityModeEnabled) { + sCompatibilityModeEnabled = compatibilityModeEnabled; + } + /** * @hide */ diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index f5f0ce190e130..2379b24a85fd1 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -134,6 +134,7 @@ import static com.android.server.pm.PackageManagerServiceUtils.getLastModifiedTi import static com.android.server.pm.PackageManagerServiceUtils.logCriticalInfo; import static com.android.server.pm.PackageManagerServiceUtils.makeDirRecursive; import static com.android.server.pm.PackageManagerServiceUtils.verifySignatures; +import static com.android.server.pm.parsing.PackageInfoUtils.checkUseInstalledOrHidden; import android.Manifest; import android.annotation.AppIdInt; @@ -2539,8 +2540,8 @@ public class PackageManagerService extends IPackageManager.Stub if (DEBUG_PACKAGE_INFO) Log.v(TAG, "getActivityInfo " + component + ": " + a); AndroidPackage pkg = a == null ? null : mPackages.get(a.getPackageName()); + PackageSetting ps = a == null ? null : mSettings.getPackageLPr(a.getPackageName()); if (pkg != null && mSettings.isEnabledAndMatchLPr(pkg, a, flags, userId)) { - PackageSetting ps = mSettings.getPackageLPr(component.getPackageName()); if (ps == null) return null; if (shouldFilterApplicationLocked( ps, filterCallingUid, component, TYPE_ACTIVITY, userId)) { @@ -2550,8 +2551,8 @@ public class PackageManagerService extends IPackageManager.Stub a, flags, ps.readUserState(userId), userId, ps); } if (resolveComponentName().equals(component)) { - return PackageParser.generateActivityInfo( - mResolveActivity, flags, new PackageUserState(), userId); + return generateDelegateActivityInfo(pkg, ps, new PackageUserState(), + mResolveActivity, flags, userId); } return null; } @@ -3197,8 +3198,8 @@ public class PackageManagerService extends IPackageManager.Stub return result; } final ResolveInfo ephemeralInstaller = new ResolveInfo(mInstantAppInstallerInfo); - ephemeralInstaller.activityInfo = PackageParser.generateActivityInfo( - instantAppInstallerActivity(), 0, ps.readUserState(userId), userId); + ephemeralInstaller.activityInfo = generateDelegateActivityInfo(ps.getPkg(), ps, + ps.readUserState(userId), instantAppInstallerActivity(), 0 /*flags*/, userId); ephemeralInstaller.match = IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART | IntentFilter.MATCH_ADJUSTMENT_NORMAL; // add a non-generic filter @@ -3282,7 +3283,7 @@ public class PackageManagerService extends IPackageManager.Stub ai.flags = ps.pkgFlags; ai.privateFlags = ps.pkgPrivateFlags; pi.applicationInfo = - PackageParser.generateApplicationInfo(ai, flags, state, userId); + PackageInfoUtils.generateApplicationInfo(p, flags, state, userId, ps); if (DEBUG_PACKAGE_INFO) Log.v(TAG, "ps.pkg is n/a for [" + ps.name + "]. Provides a minimum info."); @@ -3398,6 +3399,19 @@ public class PackageManagerService extends IPackageManager.Stub return getInstalledPackagesBody(flags, userId, callingUid); } + private static ActivityInfo generateDelegateActivityInfo(@Nullable AndroidPackage pkg, + @Nullable PackageSetting ps, @NonNull PackageUserState state, + @Nullable ActivityInfo activity, int flags, int userId) { + if (activity == null || pkg == null + || !checkUseInstalledOrHidden(pkg, ps, state, flags)) { + return null; + } + final ActivityInfo info = new ActivityInfo(activity); + info.applicationInfo = + PackageInfoUtils.generateApplicationInfo(pkg, flags, state, userId, ps); + return info; + } + public ParceledListSlice getInstalledPackagesBody(int flags, int userId, int callingUid) { // writer @@ -23603,7 +23617,7 @@ public class PackageManagerService extends IPackageManager.Stub boolean compatibilityModeEnabled = android.provider.Settings.Global.getInt( mContext.getContentResolver(), android.provider.Settings.Global.COMPATIBILITY_MODE, 1) == 1; - PackageParser.setCompatibilityModeEnabled(compatibilityModeEnabled); + ParsingPackageUtils.setCompatibilityModeEnabled(compatibilityModeEnabled); if (DEBUG_SETTINGS) { Log.d(TAG, "compatibility mode:" + compatibilityModeEnabled); diff --git a/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java b/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java index 21e44ab9b5395..5f58befa0fcac 100644 --- a/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java +++ b/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java @@ -416,7 +416,7 @@ public class PackageInfoUtils { * Returns true if the package is installed and not hidden, or if the caller * explicitly wanted all uninstalled and hidden packages as well. */ - private static boolean checkUseInstalledOrHidden(AndroidPackage pkg, + public static boolean checkUseInstalledOrHidden(AndroidPackage pkg, PackageSetting pkgSetting, PackageUserState state, @PackageManager.PackageInfoFlags int flags) { // Returns false if the package is hidden system app until installed.