diff options
4 files changed, 39 insertions, 3 deletions
diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl index 3d009f6bc845..c6844471d71e 100644 --- a/core/java/android/content/pm/IPackageManager.aidl +++ b/core/java/android/content/pm/IPackageManager.aidl @@ -382,6 +382,13 @@ interface IPackageManager { */ void clearApplicationUserData(in String packageName, IPackageDataObserver observer, int userId); + /** + * Clear the profile data of an application. + * @param packageName The package name of the application whose profile data + * need to be deleted + */ + void clearApplicationProfileData(in String packageName); + /** * Get package statistics including the code, data and cache size for * an already installed package diff --git a/services/core/java/com/android/server/pm/Installer.java b/services/core/java/com/android/server/pm/Installer.java index 93dcc72c0ae8..206a1438bd61 100644 --- a/services/core/java/com/android/server/pm/Installer.java +++ b/services/core/java/com/android/server/pm/Installer.java @@ -166,6 +166,10 @@ public final class Installer extends SystemService { mInstaller.execute("rmpackagedir", packageDir); } + public void rmProfiles(String pkgName) throws InstallerException { + mInstaller.execute("rmprofiles", pkgName); + } + public void createUserConfig(int userid) throws InstallerException { mInstaller.execute("mkuserconfig", userid); } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 10d4bca4ed7a..e180e0501d98 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -15154,6 +15154,16 @@ public class PackageManagerService extends IPackageManager.Stub { } @Override + public void clearApplicationProfileData(String packageName) { + enforceSystemOrRoot("Only the system can clear all profile data"); + try { + mInstaller.rmProfiles(packageName); + } catch (InstallerException ex) { + Log.e(TAG, "Could not clear profile data of package " + packageName); + } + } + + @Override public void clearApplicationUserData(final String packageName, final IPackageDataObserver observer, final int userId) { mContext.enforceCallingOrSelfPermission( diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java index 3e4250514e06..a2af7d96dc8a 100644 --- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java +++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java @@ -234,6 +234,7 @@ class PackageManagerShellCommand extends ShellCommand { boolean extractOnly = false; boolean forceCompilation = false; boolean allPackages = false; + boolean clearProfileData = false; String compilationMode = "default"; String opt; @@ -242,11 +243,19 @@ class PackageManagerShellCommand extends ShellCommand { case "-a": allPackages = true; break; + case "-c": + clearProfileData = true; + break; + case "-f": + forceCompilation = true; + break; case "-m": compilationMode = getNextArgRequired(); break; - case "-f": + case "--reset": forceCompilation = true; + clearProfileData = true; + compilationMode = "extract"; break; default: pw.println("Error: Unknown option: " + opt); @@ -290,7 +299,10 @@ class PackageManagerShellCommand extends ShellCommand { List<String> failedPackages = new ArrayList<>(); for (String packageName : packageNames) { - pw.println(packageName); + if (clearProfileData) { + mInterface.clearApplicationProfileData(packageName); + } + boolean result = mInterface.performDexOpt(packageName, null /* instructionSet */, useJitProfiles, extractOnly, forceCompilation); if (!result) { @@ -1170,9 +1182,12 @@ class PackageManagerShellCommand extends ShellCommand { pw.println(" Trigger compilation of TARGET-PACKAGE or all packages if \"-a\"."); pw.println(" Options:"); pw.println(" -a: compile all packages"); + pw.println(" -c: clear profile data before compiling"); + pw.println(" -f: force compilation even if not needed"); pw.println(" -m: select compilation mode"); pw.println(" MODE can be one of \"default\", \"all\", \"profile\", and \"extract\""); - pw.println(" -f: force compilation even if not needed"); + pw.println(" --reset: restore the package to post-install state"); + pw.println(" shorthand for \"-c -f -m extract\""); pw.println(" list features"); pw.println(" Prints all features of the system."); pw.println(" list instrumentation [-f] [TARGET-PACKAGE]"); |