summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Mohammad Samiul Islam <samiul@google.com> 2019-05-09 15:36:21 +0100
committer Mohammad Samiul Islam <samiul@google.com> 2019-05-10 10:55:17 +0100
commitc46ff38d5f3620ecc4d3339a99f4da2fd37112e0 (patch)
tree169f2fdb97d2d57bfb40408341f3f061fa68edd9
parent39789e86f766a16b6e0398dec963e96d280dac21 (diff)
Add filter to getInstalledModules for showing installed modules only
Additionally, the function now accepts PackageManager.MATCH_ALL flag for returning all ModuleInfos. Bug: 131929295 Test: Manual testing. Run the following commands $ adb shell pm get-moduleinfo $ adb shell pm get-installed-moduleinfo Observed that they are different. Change-Id: I37cfb7d717664c6183695348e1b0f11e4ddff0cf
-rw-r--r--services/core/java/com/android/server/pm/ModuleInfoProvider.java24
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerShellCommand.java52
2 files changed, 75 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/pm/ModuleInfoProvider.java b/services/core/java/com/android/server/pm/ModuleInfoProvider.java
index e7dace0ad4d1..691b38e2b093 100644
--- a/services/core/java/com/android/server/pm/ModuleInfoProvider.java
+++ b/services/core/java/com/android/server/pm/ModuleInfoProvider.java
@@ -28,6 +28,7 @@ import android.os.RemoteException;
import android.os.UserHandle;
import android.text.TextUtils;
import android.util.ArrayMap;
+import android.util.ArraySet;
import android.util.Slog;
import com.android.internal.R;
@@ -39,6 +40,7 @@ import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
import java.util.Map;
@@ -165,7 +167,27 @@ public class ModuleInfoProvider {
throw new IllegalStateException("Call to getInstalledModules before metadata loaded");
}
- return new ArrayList<>(mModuleInfo.values());
+ ArrayList<ModuleInfo> allModules = new ArrayList<>(mModuleInfo.values());
+ if ((flags & PackageManager.MATCH_ALL) != 0) {
+ return allModules;
+ }
+
+ ArraySet<String> allPackages;
+ try {
+ allPackages = new ArraySet<>(mPackageManager.getAllPackages());
+ } catch (RemoteException e) {
+ Slog.w(TAG, "Unable to retrieve all package names", e);
+ return Collections.emptyList();
+ }
+
+ ArrayList<ModuleInfo> installedModules = new ArrayList<>(allPackages.size());
+ for (int i = allModules.size() - 1; i >= 0; --i) {
+ ModuleInfo mi = allModules.get(i);
+ if (allPackages.contains(mi.getPackageName())) {
+ installedModules.add(mi);
+ }
+ }
+ return installedModules;
}
ModuleInfo getModuleInfo(String packageName, int flags) {
diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
index fbf074e3ba15..ac4f43df9357 100644
--- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
+++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
@@ -39,6 +39,7 @@ import android.content.pm.IPackageDataObserver;
import android.content.pm.IPackageInstaller;
import android.content.pm.IPackageManager;
import android.content.pm.InstrumentationInfo;
+import android.content.pm.ModuleInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageInstaller;
import android.content.pm.PackageInstaller.SessionInfo;
@@ -273,6 +274,8 @@ class PackageManagerShellCommand extends ShellCommand {
return uninstallSystemUpdates();
case "rollback-app":
return runRollbackApp();
+ case "get-moduleinfo":
+ return runGetModuleInfo();
default: {
String nextArg = getNextArg();
if (nextArg == null) {
@@ -295,6 +298,49 @@ class PackageManagerShellCommand extends ShellCommand {
return -1;
}
+ /**
+ * Shows module info
+ *
+ * Usage: get-moduleinfo [--all | --installed] [module-name]
+ * Example: get-moduleinfo, get-moduleinfo --all, get-moduleinfo xyz
+ */
+ private int runGetModuleInfo() {
+ final PrintWriter pw = getOutPrintWriter();
+ int flags = 0;
+
+ String opt;
+ while ((opt = getNextOption()) != null) {
+ switch (opt) {
+ case "--all":
+ flags |= PackageManager.MATCH_ALL;
+ break;
+ case "--installed":
+ break;
+ default:
+ pw.println("Error: Unknown option: " + opt);
+ return -1;
+ }
+ }
+
+ String moduleName = getNextArg();
+ try {
+ if (moduleName != null) {
+ ModuleInfo m = mInterface.getModuleInfo(moduleName, flags);
+ pw.println(m.toString() + " packageName: " + m.getPackageName());
+
+ } else {
+ List<ModuleInfo> modules = mInterface.getInstalledModules(flags);
+ for (ModuleInfo m: modules) {
+ pw.println(m.toString() + " packageName: " + m.getPackageName());
+ }
+ }
+ } catch (RemoteException e) {
+ pw.println("Failure [" + e.getClass().getName() + " - " + e.getMessage() + "]");
+ return -1;
+ }
+ return 1;
+ }
+
private int getStagedSessions() {
final PrintWriter pw = getOutPrintWriter();
try {
@@ -3205,6 +3251,12 @@ class PackageManagerShellCommand extends ShellCommand {
pw.println(" Remove updates to all system applications and fall back to their /system " +
"version.");
pw.println();
+ pw.println(" get-moduleinfo [--all | --installed] [module-name]");
+ pw.println(" Displays module info. If module-name is specified only that info is shown");
+ pw.println(" By default, without any argument only installed modules are shown.");
+ pw.println(" --all: show all module info");
+ pw.println(" --installed: show only installed modules");
+ pw.println("");
Intent.printIntentArgsHelp(pw , "");
}