From c19da782031418a8de2c20f56547c5956adeb9d5 Mon Sep 17 00:00:00 2001 From: Rhed Jao Date: Wed, 13 Jun 2018 11:16:16 +0800 Subject: [PATCH] Hide system apps until installed (1/2) Applying this mechanism for system carrier apps to make visibility reasonable from the user's perspective. In other words, before hidden system apps have been installed, they wouldn't be listed via APIs in PackageManager which are used at all apps list and search in Settings and so on. Test: atest CarrierAppUtilsTest Test: atest PackageManagerTest Test: cts DeviceOwnerTest Test: gts ManagedProfileProvisioningHostsideTest Bug: 74068582 Change-Id: I1f23aba589b98351a1871a44a3058b67c416f351 --- .../android/content/pm/ApplicationInfo.java | 6 ++ .../android/content/pm/IPackageManager.aidl | 3 + .../android/content/pm/PackageManager.java | 11 ++- .../android/content/pm/PackageParser.java | 10 ++- core/res/AndroidManifest.xml | 9 +++ .../server/pm/PackageManagerService.java | 74 ++++++++++++++++++- .../java/com/android/server/pm/Settings.java | 3 +- .../internal/telephony/CarrierAppUtils.java | 57 +++++++++----- 8 files changed, 148 insertions(+), 25 deletions(-) diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java index d65e051b70b4f..3120421622a40 100644 --- a/core/java/android/content/pm/ApplicationInfo.java +++ b/core/java/android/content/pm/ApplicationInfo.java @@ -1120,6 +1120,9 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { /** @hide */ public String[] splitClassLoaderNames; + /** @hide */ + public boolean hiddenUntilInstalled; + /** * Represents the default policy. The actual policy used will depend on other properties of * the application, e.g. the target SDK version. @@ -1460,6 +1463,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { compileSdkVersion = orig.compileSdkVersion; compileSdkVersionCodename = orig.compileSdkVersionCodename; mHiddenApiPolicy = orig.mHiddenApiPolicy; + hiddenUntilInstalled = orig.hiddenUntilInstalled; } public String toString() { @@ -1534,6 +1538,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { dest.writeString(compileSdkVersionCodename); dest.writeString(appComponentFactory); dest.writeInt(mHiddenApiPolicy); + dest.writeInt(hiddenUntilInstalled ? 1 : 0); } public static final Parcelable.Creator CREATOR @@ -1605,6 +1610,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { compileSdkVersionCodename = source.readString(); appComponentFactory = source.readString(); mHiddenApiPolicy = source.readInt(); + hiddenUntilInstalled = source.readInt() != 0; } /** diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl index c988fa907f867..bc5b32c69b59f 100644 --- a/core/java/android/content/pm/IPackageManager.aidl +++ b/core/java/android/content/pm/IPackageManager.aidl @@ -598,6 +598,9 @@ interface IPackageManager { boolean setApplicationHiddenSettingAsUser(String packageName, boolean hidden, int userId); boolean getApplicationHiddenSettingAsUser(String packageName, int userId); + void setSystemAppHiddenUntilInstalled(String packageName, boolean hidden); + boolean setSystemAppInstallState(String packageName, boolean installed, int userId); + IPackageInstaller getPackageInstaller(); boolean setBlockUninstallForUser(String packageName, boolean blockUninstall, int userId); diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 7253e77580087..68d0da970b635 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -147,6 +147,7 @@ public abstract class PackageManager { GET_DISABLED_COMPONENTS, GET_DISABLED_UNTIL_USED_COMPONENTS, GET_UNINSTALLED_PACKAGES, + MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS, }) @Retention(RetentionPolicy.SOURCE) public @interface PackageInfoFlags {} @@ -164,6 +165,7 @@ public abstract class PackageManager { MATCH_STATIC_SHARED_LIBRARIES, GET_DISABLED_UNTIL_USED_COMPONENTS, GET_UNINSTALLED_PACKAGES, + MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS, }) @Retention(RetentionPolicy.SOURCE) public @interface ApplicationInfoFlags {} @@ -521,6 +523,12 @@ public abstract class PackageManager { */ public static final int MATCH_DEBUG_TRIAGED_MISSING = 0x10000000; + /** + * Internal flag used to indicate that a package is a hidden system app. + * @hide + */ + public static final int MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS = 0x20000000; + /** * Flag for {@link #addCrossProfileIntentFilter}: if this flag is set: when * resolving an intent that matches the {@code CrossProfileIntentFilter}, @@ -4841,7 +4849,8 @@ public abstract class PackageManager { * on the system for other users, also install it for the specified user. * @hide */ - @RequiresPermission(anyOf = { + @RequiresPermission(anyOf = { + Manifest.permission.INSTALL_EXISTING_PACKAGES, Manifest.permission.INSTALL_PACKAGES, Manifest.permission.INTERACT_ACROSS_USERS_FULL}) public abstract int installExistingPackageAsUser(String packageName, @UserIdInt int userId) diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index 2da2cb4c92853..edca4e625e975 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -639,11 +639,19 @@ public class PackageParser { */ private static boolean checkUseInstalledOrHidden(int flags, PackageUserState state, ApplicationInfo appInfo) { + // Returns false if the package is hidden system app until installed. + if ((flags & PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS) == 0 + && !state.installed + && appInfo != null && appInfo.hiddenUntilInstalled) { + return false; + } + // If available for the target user, or trying to match uninstalled packages and it's // a system app. return state.isAvailable(flags) || (appInfo != null && appInfo.isSystemApp() - && (flags & PackageManager.MATCH_KNOWN_PACKAGES) != 0); + && ((flags & PackageManager.MATCH_KNOWN_PACKAGES) != 0 + || (flags & PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS) != 0)); } public static boolean isAvailable(PackageUserState state) { diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 4e74d5066b6e6..cda1293e93c77 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -3025,6 +3025,15 @@ + + +