diff options
| author | 2023-01-18 00:27:19 +0000 | |
|---|---|---|
| committer | 2023-01-18 00:27:19 +0000 | |
| commit | 0dbe6ca5b2d7fd300c727c0c129e01bb3637a797 (patch) | |
| tree | 748d90b1ba0f686a777100f997504b30458c398d | |
| parent | 8f63bd1422e69e3aca199a69aaa6af7f3f825000 (diff) | |
| parent | 3ed22aea109ed04400587b6589d5323d294bb362 (diff) | |
Merge changes I9bc32129,I2e9c9dbf
* changes:
Make dumpProfiles and reconcileSecondaryDexFiles throwing.
Remove TODO(b/251903639) from PackageManagerShellCommand.
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; } |