summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jiakai Zhang <jiakaiz@google.com> 2023-01-18 00:27:19 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2023-01-18 00:27:19 +0000
commit0dbe6ca5b2d7fd300c727c0c129e01bb3637a797 (patch)
tree748d90b1ba0f686a777100f997504b30458c398d
parent8f63bd1422e69e3aca199a69aaa6af7f3f825000 (diff)
parent3ed22aea109ed04400587b6589d5323d294bb362 (diff)
Merge changes I9bc32129,I2e9c9dbf
* changes: Make dumpProfiles and reconcileSecondaryDexFiles throwing. Remove TODO(b/251903639) from PackageManagerShellCommand.
-rw-r--r--core/java/android/content/pm/IPackageManager.aidl18
-rw-r--r--services/core/java/android/content/pm/PackageManagerInternal.java11
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java97
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerShellCommand.java100
4 files changed, 98 insertions, 128 deletions
diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl
index 047f8c1fd2b4..3430a61be2b6 100644
--- a/core/java/android/content/pm/IPackageManager.aidl
+++ b/core/java/android/content/pm/IPackageManager.aidl
@@ -572,26 +572,8 @@ interface IPackageManager {
boolean performDexOptSecondary(String packageName,
String targetCompilerFilter, boolean force);
- /**
- * Ask the package manager to dump profiles associated with a package.
- *
- * @param packageName The name of the package to dump.
- * @param dumpClassesAndMethods If false, pass {@code --dump-only} to profman to dump the
- * profile in a human readable form intended for debugging. If true, pass
- * {@code --dump-classes-and-methods} to profman to dump a sorted list of classes and methods
- * in a human readable form that is valid input for {@code profman --create-profile-from}.
- */
- void dumpProfiles(String packageName, boolean dumpClassesAndMethods);
-
void forceDexOpt(String packageName);
- /**
- * Reconcile the information we have about the secondary dex files belonging to
- * {@code packagName} and the actual dex files. For all dex files that were
- * deleted, update the internal records and delete the generated oat files.
- */
- void reconcileSecondaryDexFiles(String packageName);
-
int getMoveStatus(int moveId);
void registerMoveCallback(in IPackageMoveObserver callback);
diff --git a/services/core/java/android/content/pm/PackageManagerInternal.java b/services/core/java/android/content/pm/PackageManagerInternal.java
index f8e79e59901d..6fb5730a05e3 100644
--- a/services/core/java/android/content/pm/PackageManagerInternal.java
+++ b/services/core/java/android/content/pm/PackageManagerInternal.java
@@ -44,6 +44,7 @@ import android.util.ArraySet;
import android.util.SparseArray;
import com.android.internal.util.function.pooled.PooledLambda;
+import com.android.server.pm.Installer.LegacyDexoptDisabledException;
import com.android.server.pm.KnownPackages;
import com.android.server.pm.PackageList;
import com.android.server.pm.PackageSetting;
@@ -1320,4 +1321,14 @@ public abstract class PackageManagerInternal {
public abstract void setPackageStoppedState(@NonNull String packageName, boolean stopped,
@UserIdInt int userId);
+
+ /** @deprecated For legacy shell command only. */
+ @Deprecated
+ public abstract void legacyDumpProfiles(@NonNull String packageName,
+ boolean dumpClassesAndMethods) throws LegacyDexoptDisabledException;
+
+ /** @deprecated For legacy shell command only. */
+ @Deprecated
+ public abstract void legacyReconcileSecondaryDexFiles(String packageName)
+ throws LegacyDexoptDisabledException;
}
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index dfd305add074..8f95093ad826 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -4827,35 +4827,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
@Override
- public void dumpProfiles(String packageName, boolean dumpClassesAndMethods) {
- /* Only the shell, root, or the app user should be able to dump profiles. */
- final int callingUid = Binder.getCallingUid();
- final Computer snapshot = snapshotComputer();
- final String[] callerPackageNames = snapshot.getPackagesForUid(callingUid);
- if (callingUid != Process.SHELL_UID
- && callingUid != Process.ROOT_UID
- && !ArrayUtils.contains(callerPackageNames, packageName)) {
- throw new SecurityException("dumpProfiles");
- }
-
- AndroidPackage pkg = snapshot.getPackage(packageName);
- if (pkg == null) {
- throw new IllegalArgumentException("Unknown package: " + packageName);
- }
-
- // TODO(b/251903639): Call into ART Service.
- synchronized (mInstallLock) {
- Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "dump profiles");
- try {
- mArtManagerService.dumpProfiles(pkg, dumpClassesAndMethods);
- } catch (LegacyDexoptDisabledException e) {
- throw new RuntimeException(e);
- }
- Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
- }
- }
-
- @Override
public void enterSafeMode() {
PackageManagerServiceUtils.enforceSystemOrRoot(
"Only the system can request entering safe mode");
@@ -5541,33 +5512,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService
return new ParceledListSlice<>(result);
}
- /**
- * Reconcile the information we have about the secondary dex files belonging to
- * {@code packageName} and the actual dex files. For all dex files that were
- * deleted, update the internal records and delete the generated oat files.
- */
- @Override
- public void reconcileSecondaryDexFiles(String packageName) {
- if (useArtService()) {
- // ART Service currently relies on a GC to find stale oat files, including secondary
- // dex files. Hence it doesn't use this call for anything.
- return;
- }
-
- final Computer snapshot = snapshotComputer();
- if (snapshot.getInstantAppPackageName(Binder.getCallingUid()) != null) {
- return;
- } else if (snapshot.isInstantAppInternal(
- packageName, UserHandle.getCallingUserId(), Process.SYSTEM_UID)) {
- return;
- }
- try {
- mDexManager.reconcileSecondaryDexFiles(packageName);
- } catch (LegacyDexoptDisabledException e) {
- throw new RuntimeException(e);
- }
- }
-
@Override
public void registerDexModule(String packageName, String dexModulePath,
boolean isSharedModule,
@@ -6663,6 +6607,47 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
}
+ /** @deprecated For legacy shell command only. */
+ @Override
+ @Deprecated
+ public void legacyDumpProfiles(String packageName, boolean dumpClassesAndMethods)
+ throws LegacyDexoptDisabledException {
+ /* Only the shell, root, or the app user should be able to dump profiles. */
+ final int callingUid = Binder.getCallingUid();
+ final Computer snapshot = snapshotComputer();
+ final String[] callerPackageNames = snapshot.getPackagesForUid(callingUid);
+ if (callingUid != Process.SHELL_UID && callingUid != Process.ROOT_UID
+ && !ArrayUtils.contains(callerPackageNames, packageName)) {
+ throw new SecurityException("dumpProfiles");
+ }
+
+ AndroidPackage pkg = snapshot.getPackage(packageName);
+ if (pkg == null) {
+ throw new IllegalArgumentException("Unknown package: " + packageName);
+ }
+
+ synchronized (mInstallLock) {
+ Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "dump profiles");
+ mArtManagerService.dumpProfiles(pkg, dumpClassesAndMethods);
+ Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
+ }
+ }
+
+ /** @deprecated For legacy shell command only. */
+ @Override
+ @Deprecated
+ public void legacyReconcileSecondaryDexFiles(String packageName)
+ throws LegacyDexoptDisabledException {
+ final Computer snapshot = snapshotComputer();
+ if (snapshot.getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return;
+ } else if (snapshot.isInstantAppInternal(
+ packageName, UserHandle.getCallingUserId(), Process.SYSTEM_UID)) {
+ return;
+ }
+ mDexManager.reconcileSecondaryDexFiles(packageName);
+ }
+
@Override
@SuppressWarnings("GuardedBy")
public void updateRuntimePermissionsFingerprint(@UserIdInt int userId) {
diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
index 0685435424e1..426379118eeb 100644
--- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
+++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
@@ -179,6 +179,7 @@ class PackageManagerShellCommand extends ShellCommand {
"cancel-bg-dexopt-job", "delete-dexopt", "dump-profiles", "snapshot-profile", "art");
final IPackageManager mInterface;
+ private final PackageManagerInternal mPm;
final LegacyPermissionManagerInternal mLegacyPermissionManager;
final PermissionManager mPermissionManager;
final Context mContext;
@@ -195,6 +196,7 @@ class PackageManagerShellCommand extends ShellCommand {
PackageManagerShellCommand(@NonNull IPackageManager packageManager,
@NonNull Context context, @NonNull DomainVerificationShell domainVerificationShell) {
mInterface = packageManager;
+ mPm = LocalServices.getService(PackageManagerInternal.class);
mLegacyPermissionManager = LocalServices.getService(LegacyPermissionManagerInternal.class);
mPermissionManager = context.getSystemService(PermissionManager.class);
mContext = context;
@@ -1968,9 +1970,10 @@ class PackageManagerShellCommand extends ShellCommand {
}
}
- private int runreconcileSecondaryDexFiles() throws RemoteException {
+ private int runreconcileSecondaryDexFiles()
+ throws RemoteException, LegacyDexoptDisabledException {
String packageName = getNextArg();
- mInterface.reconcileSecondaryDexFiles(packageName);
+ mPm.legacyReconcileSecondaryDexFiles(packageName);
return 0;
}
@@ -1979,63 +1982,53 @@ class PackageManagerShellCommand extends ShellCommand {
return 0;
}
- private int runBgDexOpt() throws RemoteException {
- // TODO(b/251903639): Call into ART Service.
- try {
- String opt = getNextOption();
+ private int runBgDexOpt() throws RemoteException, LegacyDexoptDisabledException {
+ String opt = getNextOption();
- if (opt == null) {
- List<String> packageNames = new ArrayList<>();
- String arg;
- while ((arg = getNextArg()) != null) {
- packageNames.add(arg);
- }
- if (!BackgroundDexOptService.getService().runBackgroundDexoptJob(
- packageNames.isEmpty() ? null : packageNames)) {
- getOutPrintWriter().println("Failure");
- return -1;
- }
- } else {
- String extraArg = getNextArg();
- if (extraArg != null) {
- getErrPrintWriter().println("Invalid argument: " + extraArg);
- return -1;
- }
+ if (opt == null) {
+ List<String> packageNames = new ArrayList<>();
+ String arg;
+ while ((arg = getNextArg()) != null) {
+ packageNames.add(arg);
+ }
+ if (!BackgroundDexOptService.getService().runBackgroundDexoptJob(
+ packageNames.isEmpty() ? null : packageNames)) {
+ getOutPrintWriter().println("Failure");
+ return -1;
+ }
+ } else {
+ String extraArg = getNextArg();
+ if (extraArg != null) {
+ getErrPrintWriter().println("Invalid argument: " + extraArg);
+ return -1;
+ }
- switch (opt) {
- case "--cancel":
- return cancelBgDexOptJob();
+ switch (opt) {
+ case "--cancel":
+ return cancelBgDexOptJob();
- case "--disable":
- BackgroundDexOptService.getService().setDisableJobSchedulerJobs(true);
- break;
+ case "--disable":
+ BackgroundDexOptService.getService().setDisableJobSchedulerJobs(true);
+ break;
- case "--enable":
- BackgroundDexOptService.getService().setDisableJobSchedulerJobs(false);
- break;
+ case "--enable":
+ BackgroundDexOptService.getService().setDisableJobSchedulerJobs(false);
+ break;
- default:
- getErrPrintWriter().println("Unknown option: " + opt);
- return -1;
- }
+ default:
+ getErrPrintWriter().println("Unknown option: " + opt);
+ return -1;
}
-
- getOutPrintWriter().println("Success");
- return 0;
- } catch (LegacyDexoptDisabledException e) {
- throw new RuntimeException(e);
}
+
+ getOutPrintWriter().println("Success");
+ return 0;
}
- private int cancelBgDexOptJob() throws RemoteException {
- // TODO(b/251903639): Call into ART Service.
- try {
- BackgroundDexOptService.getService().cancelBackgroundDexoptJob();
- getOutPrintWriter().println("Success");
- return 0;
- } catch (LegacyDexoptDisabledException e) {
- throw new RuntimeException(e);
- }
+ private int cancelBgDexOptJob() throws RemoteException, LegacyDexoptDisabledException {
+ BackgroundDexOptService.getService().cancelBackgroundDexoptJob();
+ getOutPrintWriter().println("Success");
+ return 0;
}
private int runDeleteDexOpt() throws RemoteException {
@@ -2045,8 +2038,7 @@ class PackageManagerShellCommand extends ShellCommand {
pw.println("Error: no package name");
return 1;
}
- long freedBytes = LocalServices.getService(PackageManagerInternal.class)
- .deleteOatArtifactsOfPackage(packageName);
+ long freedBytes = mPm.deleteOatArtifactsOfPackage(packageName);
if (freedBytes < 0) {
pw.println("Error: delete failed");
return 1;
@@ -2056,7 +2048,7 @@ class PackageManagerShellCommand extends ShellCommand {
return 0;
}
- private int runDumpProfiles() throws RemoteException {
+ private int runDumpProfiles() throws RemoteException, LegacyDexoptDisabledException {
final PrintWriter pw = getOutPrintWriter();
boolean dumpClassesAndMethods = false;
@@ -2073,7 +2065,7 @@ class PackageManagerShellCommand extends ShellCommand {
}
String packageName = getNextArg();
- mInterface.dumpProfiles(packageName, dumpClassesAndMethods);
+ mPm.legacyDumpProfiles(packageName, dumpClassesAndMethods);
return 0;
}