diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl index 047f8c1fd2b40..3430a61be2b68 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 f8e79e59901d8..6fb5730a05e30 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 dfd305add0747..8f95093ad8265 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -4826,35 +4826,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( @@ -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 0685435424e1b..426379118eebe 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 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(); - - case "--disable": - BackgroundDexOptService.getService().setDisableJobSchedulerJobs(true); - break; - - case "--enable": - BackgroundDexOptService.getService().setDisableJobSchedulerJobs(false); - break; - - default: - getErrPrintWriter().println("Unknown option: " + opt); - return -1; - } + if (opt == null) { + List 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; } - getOutPrintWriter().println("Success"); - return 0; - } catch (LegacyDexoptDisabledException e) { - throw new RuntimeException(e); + switch (opt) { + case "--cancel": + return cancelBgDexOptJob(); + + case "--disable": + BackgroundDexOptService.getService().setDisableJobSchedulerJobs(true); + break; + + case "--enable": + BackgroundDexOptService.getService().setDisableJobSchedulerJobs(false); + break; + + default: + getErrPrintWriter().println("Unknown option: " + opt); + return -1; + } } + + 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; }