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.