From 829792d752ab31675a3c7979327402088132780d Mon Sep 17 00:00:00 2001 From: Rhed Jao Date: Thu, 3 Mar 2022 22:51:45 +0800 Subject: [PATCH] Add a system API to make a package become visible to other package Expose a system API PackageManager#makeUidVisible for mainline module to make a package become visible to the caller. Bug: 222205552 Test: atest AppEnumerationTests Test: atest PermissionPolicyTest Ignore-AOSP-First: (for packages/Shell/AndroidManifest.xml) Permission Change-Id: I6cf322ddfea09a8a4c0c442a6789af4e79d294d7 --- core/api/module-lib-current.txt | 1 + core/api/test-current.txt | 2 ++ .../app/ApplicationPackageManager.java | 9 +++++++ .../android/content/pm/IPackageManager.aidl | 6 ++++- .../android/content/pm/PackageManager.java | 25 ++++++++++++++++--- core/res/AndroidManifest.xml | 6 +++++ packages/Shell/AndroidManifest.xml | 3 +++ .../server/pm/PackageManagerService.java | 22 +++++++++++++++- 8 files changed, 69 insertions(+), 5 deletions(-) diff --git a/core/api/module-lib-current.txt b/core/api/module-lib-current.txt index 7aef9a6b767af..dd253ac6c85de 100644 --- a/core/api/module-lib-current.txt +++ b/core/api/module-lib-current.txt @@ -102,6 +102,7 @@ package android.content.pm { public abstract class PackageManager { method @NonNull public String getPermissionControllerPackageName(); method @NonNull public String getSdkSandboxPackageName(); + method @RequiresPermission("android.permission.MAKE_UID_VISIBLE") public void makeUidVisible(int, int); field public static final String EXTRA_VERIFICATION_ROOT_HASH = "android.content.pm.extra.VERIFICATION_ROOT_HASH"; field public static final int MATCH_STATIC_SHARED_AND_SDK_LIBRARIES = 67108864; // 0x4000000 } diff --git a/core/api/test-current.txt b/core/api/test-current.txt index 5aec193f33d4e..e7ea13ddece59 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -19,6 +19,7 @@ package android { field public static final String FORCE_STOP_PACKAGES = "android.permission.FORCE_STOP_PACKAGES"; field public static final String INSTALL_TEST_ONLY_PACKAGE = "android.permission.INSTALL_TEST_ONLY_PACKAGE"; field public static final String KEEP_UNINSTALLED_PACKAGES = "android.permission.KEEP_UNINSTALLED_PACKAGES"; + field public static final String MAKE_UID_VISIBLE = "android.permission.MAKE_UID_VISIBLE"; field @Deprecated public static final String MANAGE_ACTIVITY_STACKS = "android.permission.MANAGE_ACTIVITY_STACKS"; field public static final String MANAGE_ACTIVITY_TASKS = "android.permission.MANAGE_ACTIVITY_TASKS"; field public static final String MANAGE_CRATES = "android.permission.MANAGE_CRATES"; @@ -836,6 +837,7 @@ package android.content.pm { method @Nullable public String getSystemTextClassifierPackageName(); method @Nullable public String getWellbeingPackageName(); method public void holdLock(android.os.IBinder, int); + method @RequiresPermission(android.Manifest.permission.MAKE_UID_VISIBLE) public void makeUidVisible(int, int); method @RequiresPermission(android.Manifest.permission.KEEP_UNINSTALLED_PACKAGES) public void setKeepUninstalledPackages(@NonNull java.util.List); field public static final String FEATURE_ADOPTABLE_STORAGE = "android.software.adoptable_storage"; field public static final String FEATURE_COMMUNAL_MODE = "android.software.communal_mode"; diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index dca5c542af172..7ffa61be76046 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -3832,4 +3832,13 @@ public class ApplicationPackageManager extends PackageManager { throw re.rethrowAsRuntimeException(); } } + + @Override + public void makeUidVisible(int recipientUid, int visibleUid) { + try { + mPM.makeUidVisible(recipientUid, visibleUid); + } catch (RemoteException e) { + throw e.rethrowAsRuntimeException(); + } + } } diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl index 0f236dfe1a8bf..ca7d77b2c44a3 100644 --- a/core/java/android/content/pm/IPackageManager.aidl +++ b/core/java/android/content/pm/IPackageManager.aidl @@ -781,7 +781,11 @@ interface IPackageManager { boolean isAutoRevokeWhitelisted(String packageName); - void grantImplicitAccess(int queryingUid, String visibleAuthority); + void makeProviderVisible(int recipientAppId, String visibleAuthority); + + @JavaPassthrough(annotation = "@android.annotation.RequiresPermission(android.Manifest" + + ".permission.MAKE_UID_VISIBLE)") + void makeUidVisible(int recipientAppId, int visibleUid); IBinder getHoldLockToken(); diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index f9beaa7cd0e9c..81c941eedef0b 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -10281,19 +10281,38 @@ public abstract class PackageManager { } /** - * Grants implicit visibility of the package that provides an authority to a querying UID. + * Makes a package that provides an authority {@code visibleAuthority} become visible to the + * application {@code recipientUid}. * * @throws SecurityException when called by a package other than the contacts provider * @hide */ - public void grantImplicitAccess(int queryingUid, String visibleAuthority) { + public void makeProviderVisible(int recipientUid, String visibleAuthority) { try { - ActivityThread.getPackageManager().grantImplicitAccess(queryingUid, visibleAuthority); + ActivityThread.getPackageManager().makeProviderVisible(recipientUid, visibleAuthority); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } + /** + * Makes the package associated with the uid {@code visibleUid} become visible to the + * recipient uid application. + * + * @param recipientUid The uid of the application that is being given access to {@code + * visibleUid} + * @param visibleUid The uid of the application that is becoming accessible to {@code + * recipientAppId} + * @hide + */ + @RequiresPermission(android.Manifest.permission.MAKE_UID_VISIBLE) + @TestApi + @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES) + public void makeUidVisible(int recipientUid, int visibleUid) { + throw new UnsupportedOperationException( + "makeUidVisible not implemented in subclass"); + } + // Some of the flags don't affect the query result, but let's be conservative and cache // each combination of flags separately. diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index becac7f96428b..1c8ec0fdf3e93 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -6420,6 +6420,12 @@ + + + diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml index dae63a8b0e3c9..8c922ca422fc0 100644 --- a/packages/Shell/AndroidManifest.xml +++ b/packages/Shell/AndroidManifest.xml @@ -668,6 +668,9 @@ + + +