diff options
author | Todd Kennedy <toddke@google.com> | 2017-07-25 15:38:39 -0700 |
---|---|---|
committer | Todd Kennedy <toddke@google.com> | 2017-07-31 11:29:37 -0700 |
commit | 9da8b8a7fc8c68c17e1bf8cce24e2f73abe5138e (patch) | |
tree | f58e436de30b56b87e5e3f5a378b35c16ec7dfbf | |
parent | 340e7d257362fddb0fad0450b88556745381ce4b (diff) |
Add new API to retrieve app names in a batch
Change-Id: I57e5c132bc58a32d70007a7a105775b526ff7bb9
Fixes: 62805090
Test: cts-tradefed run commandAndExit cts-dev -m CtsContentTestCases -t android.content.pm.cts.PackageManagerTest#testGetNamesForUids_null
Test: cts-tradefed run commandAndExit cts-dev -m CtsContentTestCases -t android.content.pm.cts.PackageManagerTest#testGetNamesForUids_empty
Test: cts-tradefed run commandAndExit cts-dev -m CtsContentTestCases -t android.content.pm.cts.PackageManagerTest#testGetNamesForUids_valid
-rw-r--r-- | api/current.txt | 1 | ||||
-rw-r--r-- | api/system-current.txt | 1 | ||||
-rw-r--r-- | api/test-current.txt | 1 | ||||
-rw-r--r-- | core/java/android/app/ApplicationPackageManager.java | 16 | ||||
-rw-r--r-- | core/java/android/content/pm/IPackageManager.aidl | 6 | ||||
-rw-r--r-- | core/java/android/content/pm/PackageManager.java | 8 | ||||
-rw-r--r-- | services/core/java/com/android/server/pm/PackageManagerService.java | 43 | ||||
-rw-r--r-- | services/tests/servicestests/src/com/android/server/backup/testutils/PackageManagerStub.java | 5 | ||||
-rw-r--r-- | test-runner/api/android-test-mock-current.txt | 1 | ||||
-rw-r--r-- | test-runner/src/android/test/mock/MockPackageManager.java | 5 |
10 files changed, 74 insertions, 13 deletions
diff --git a/api/current.txt b/api/current.txt index b4c60892ee4e..f2381d55262a 100644 --- a/api/current.txt +++ b/api/current.txt @@ -41049,6 +41049,7 @@ package android.test.mock { method public android.content.Intent getLaunchIntentForPackage(java.lang.String); method public android.content.Intent getLeanbackLaunchIntentForPackage(java.lang.String); method public java.lang.String getNameForUid(int); + method public java.lang.String[] getNamesForUids(int[]); method public int[] getPackageGids(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException; method public int[] getPackageGids(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException; method public android.content.pm.PackageInfo getPackageInfo(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException; diff --git a/api/system-current.txt b/api/system-current.txt index 57bf4b4093e5..8bed3e7ead08 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -44696,6 +44696,7 @@ package android.test.mock { method public android.content.Intent getLaunchIntentForPackage(java.lang.String); method public android.content.Intent getLeanbackLaunchIntentForPackage(java.lang.String); method public java.lang.String getNameForUid(int); + method public java.lang.String[] getNamesForUids(int[]); method public int[] getPackageGids(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException; method public int[] getPackageGids(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException; method public android.content.pm.PackageInfo getPackageInfo(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException; diff --git a/api/test-current.txt b/api/test-current.txt index 52a659e5d254..0305c6593127 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -41303,6 +41303,7 @@ package android.test.mock { method public android.content.Intent getLaunchIntentForPackage(java.lang.String); method public android.content.Intent getLeanbackLaunchIntentForPackage(java.lang.String); method public java.lang.String getNameForUid(int); + method public java.lang.String[] getNamesForUids(int[]); method public int[] getPackageGids(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException; method public int[] getPackageGids(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException; method public android.content.pm.PackageInfo getPackageInfo(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException; diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index 7fc9a69a1f92..0eafdec6bb0f 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -31,7 +31,6 @@ import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.ChangedPackages; import android.content.pm.ComponentInfo; -import android.content.pm.InstantAppInfo; import android.content.pm.FeatureInfo; import android.content.pm.IOnPermissionsChangeListener; import android.content.pm.IPackageDataObserver; @@ -40,6 +39,7 @@ import android.content.pm.IPackageInstallObserver; import android.content.pm.IPackageManager; import android.content.pm.IPackageMoveObserver; import android.content.pm.IPackageStatsObserver; +import android.content.pm.InstantAppInfo; import android.content.pm.InstrumentationInfo; import android.content.pm.IntentFilterVerificationInfo; import android.content.pm.KeySet; @@ -88,13 +88,14 @@ import android.util.LauncherIcons; import android.util.Log; import android.view.Display; -import dalvik.system.VMRuntime; - import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.os.SomeArgs; import com.android.internal.util.Preconditions; import com.android.internal.util.UserIcons; + +import dalvik.system.VMRuntime; + import libcore.util.EmptyArray; import java.lang.ref.WeakReference; @@ -706,6 +707,15 @@ public class ApplicationPackageManager extends PackageManager { } @Override + public String[] getNamesForUids(int[] uids) { + try { + return mPM.getNamesForUids(uids); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + @Override public int getUidForSharedUser(String sharedUserName) throws NameNotFoundException { try { diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl index 64d687e9d3de..6990d6de8ee8 100644 --- a/core/java/android/content/pm/IPackageManager.aidl +++ b/core/java/android/content/pm/IPackageManager.aidl @@ -61,6 +61,12 @@ import android.content.IntentSender; * {@hide} */ interface IPackageManager { + // Since these transactions are also called from native code, these must be kept in sync with + // the ones in frameworks/native/include/binder/IPackageManager.h + // =============== Beginning of transactions used on native side as well ====================== + String[] getNamesForUids(in int[] uids); + // =============== End of transactions used on native side as well ============================ + void checkPackageStartable(String packageName, int userId); boolean isPackageAvailable(String packageName, int userId); PackageInfo getPackageInfo(String packageName, int flags, int userId); diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 175293d82203..f6eaed4e5c5b 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -3590,6 +3590,14 @@ public abstract class PackageManager { public abstract @Nullable String getNameForUid(int uid); /** + * Retrieves the official names associated with each given uid. + * @see #getNameForUid(int) + * + * @hide + */ + public abstract @Nullable String[] getNamesForUids(int[] uids); + + /** * Return the user id associated with a shared user name. Multiple * applications can specify a shared user name in their manifest and thus * end up using a common uid. This might be used for new applications diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 815d871288ad..4f097b85c724 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -6397,17 +6397,40 @@ public class PackageManagerService extends IPackageManager.Stub return null; } synchronized (mPackages) { - Object obj = mSettings.getUserIdLPr(UserHandle.getAppId(uid)); - if (obj instanceof SharedUserSetting) { - final SharedUserSetting sus = (SharedUserSetting) obj; - return sus.name + ":" + sus.userId; - } else if (obj instanceof PackageSetting) { - final PackageSetting ps = (PackageSetting) obj; - if (filterAppAccessLPr(ps, callingUid, UserHandle.getUserId(callingUid))) { - return null; - } - return ps.name; + return getNameForUidLocked(callingUid, uid); + } + } + + @Override + public String[] getNamesForUids(int[] uids) { + if (uids == null || uids.length == 0) { + return null; + } + final int callingUid = Binder.getCallingUid(); + if (getInstantAppPackageName(callingUid) != null) { + return null; + } + final String[] names = new String[uids.length]; + synchronized (mPackages) { + for (int i = uids.length - 1; i >= 0; i--) { + final int uid = uids[i]; + names[i] = getNameForUidLocked(callingUid, uid); + } + } + return names; + } + + private String getNameForUidLocked(int callingUid, int uid) { + Object obj = mSettings.getUserIdLPr(UserHandle.getAppId(uid)); + if (obj instanceof SharedUserSetting) { + final SharedUserSetting sus = (SharedUserSetting) obj; + return sus.name + ":" + sus.userId; + } else if (obj instanceof PackageSetting) { + final PackageSetting ps = (PackageSetting) obj; + if (filterAppAccessLPr(ps, callingUid, UserHandle.getUserId(callingUid))) { + return null; } + return ps.name; } return null; } diff --git a/services/tests/servicestests/src/com/android/server/backup/testutils/PackageManagerStub.java b/services/tests/servicestests/src/com/android/server/backup/testutils/PackageManagerStub.java index 45b107d5a3b9..0e940f25a62a 100644 --- a/services/tests/servicestests/src/com/android/server/backup/testutils/PackageManagerStub.java +++ b/services/tests/servicestests/src/com/android/server/backup/testutils/PackageManagerStub.java @@ -275,6 +275,11 @@ public class PackageManagerStub extends PackageManager { } @Override + public String[] getNamesForUids(int uid[]) { + return null; + } + + @Override public int getUidForSharedUser(String sharedUserName) throws NameNotFoundException { return 0; diff --git a/test-runner/api/android-test-mock-current.txt b/test-runner/api/android-test-mock-current.txt index 4063ed7dae5e..93bbf6c5c024 100644 --- a/test-runner/api/android-test-mock-current.txt +++ b/test-runner/api/android-test-mock-current.txt @@ -292,6 +292,7 @@ package android.test.mock { method public android.content.Intent getLeanbackLaunchIntentForPackage(java.lang.String); method public int getMoveStatus(int); method public java.lang.String getNameForUid(int); + method public java.lang.String[] getNamesForUids(int[]); method public java.util.List<android.os.storage.VolumeInfo> getPackageCandidateVolumes(android.content.pm.ApplicationInfo); method public android.os.storage.VolumeInfo getPackageCurrentVolume(android.content.pm.ApplicationInfo); method public int[] getPackageGids(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException; diff --git a/test-runner/src/android/test/mock/MockPackageManager.java b/test-runner/src/android/test/mock/MockPackageManager.java index 3cb1f39ffaf0..68fd82588dde 100644 --- a/test-runner/src/android/test/mock/MockPackageManager.java +++ b/test-runner/src/android/test/mock/MockPackageManager.java @@ -321,6 +321,11 @@ public class MockPackageManager extends PackageManager { throw new UnsupportedOperationException(); } + @Override + public String[] getNamesForUids(int uid[]) { + throw new UnsupportedOperationException(); + } + /** * @hide - to match hiding in superclass */ |