summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java25
1 files changed, 25 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index c85ea6353ba1..957fc4ebabc4 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -3967,6 +3967,7 @@ public class PackageManagerService extends IPackageManager.Stub
}
return generatePackageInfo(ps, flags, userId);
}
+ // TODO(b/123680735): support MATCH_APEX|MATCH_FACTORY_ONLY case
}
PackageParser.Package p = mPackages.get(packageName);
@@ -3996,6 +3997,30 @@ public class PackageManagerService extends IPackageManager.Stub
}
return generatePackageInfo(ps, flags, userId);
}
+ //
+ if (!matchFactoryOnly && (flags & MATCH_APEX) != 0) {
+ //TODO(b/123052859) Don't do file operations every time there is a query.
+ final IApexService apex = IApexService.Stub.asInterface(
+ ServiceManager.getService("apexservice"));
+ if (apex != null) {
+ try {
+ final ApexInfo activePkg = apex.getActivePackage(packageName);
+ if (activePkg != null) {
+ try {
+ return PackageParser.generatePackageInfoFromApex(
+ new File(activePkg.packagePath), true /* collect certs */);
+ } catch (PackageParserException pe) {
+ throw new IllegalStateException("Unable to parse: " + activePkg,
+ pe);
+ }
+ }
+ } catch (RemoteException e) {
+ Log.e(TAG, "Unable to retrieve packages from apexservice: " + e.toString());
+ }
+ } else {
+ Log.e(TAG, "Unable to connect to apexservice for querying packages.");
+ }
+ }
}
return null;
}