Determine OptimizeFlags based on the reason.
Bug: 260419279
Test: adb shell pm art optimize-package -m speed-profile -f \
com.google.android.gms
Test: adb shell pm art optimize-package -m speed-profile -f \
--primary-dex com.google.android.gms
Test: adb shell pm art optimize-package -m speed-profile -f \
--split \"\" com.google.android.gms
Ignore-AOSP-First: ART Services.
Change-Id: I36d76ff03e01996c34dd86f993d04ab897acb2fb
diff --git a/libartservice/service/api/system-server-current.txt b/libartservice/service/api/system-server-current.txt
index f3dfb38..992c08c 100644
--- a/libartservice/service/api/system-server-current.txt
+++ b/libartservice/service/api/system-server-current.txt
@@ -71,7 +71,6 @@
public class ArtFlags {
method public static int defaultDeleteFlags();
method public static int defaultGetStatusFlags();
- method public static int defaultOptimizeFlags();
field public static final int FLAG_FORCE = 16; // 0x10
field public static final int FLAG_FOR_PRIMARY_DEX = 1; // 0x1
field public static final int FLAG_FOR_SECONDARY_DEX = 2; // 0x2
diff --git a/libartservice/service/java/com/android/server/art/ArtShellCommand.java b/libartservice/service/java/com/android/server/art/ArtShellCommand.java
index 7feea28..727803f 100644
--- a/libartservice/service/java/com/android/server/art/ArtShellCommand.java
+++ b/libartservice/service/java/com/android/server/art/ArtShellCommand.java
@@ -103,6 +103,8 @@
case "optimize-package": {
var paramsBuilder = new OptimizeParams.Builder("cmdline");
String opt;
+ @OptimizeFlags int scopeFlags = 0;
+ boolean forSingleSplit = false;
while ((opt = getNextOption()) != null) {
switch (opt) {
case "-m":
@@ -111,17 +113,18 @@
case "-f":
paramsBuilder.setFlags(ArtFlags.FLAG_FORCE, ArtFlags.FLAG_FORCE);
break;
+ case "--primary-dex":
+ scopeFlags |= ArtFlags.FLAG_FOR_PRIMARY_DEX;
+ break;
case "--secondary-dex":
- paramsBuilder.setFlags(ArtFlags.FLAG_FOR_SECONDARY_DEX,
- ArtFlags.FLAG_FOR_PRIMARY_DEX
- | ArtFlags.FLAG_FOR_SECONDARY_DEX);
+ scopeFlags |= ArtFlags.FLAG_FOR_SECONDARY_DEX;
break;
case "--include-dependencies":
- paramsBuilder.setFlags(ArtFlags.FLAG_SHOULD_INCLUDE_DEPENDENCIES,
- ArtFlags.FLAG_SHOULD_INCLUDE_DEPENDENCIES);
+ scopeFlags |= ArtFlags.FLAG_SHOULD_INCLUDE_DEPENDENCIES;
break;
case "--split":
String splitName = getNextArgRequired();
+ forSingleSplit = true;
paramsBuilder
.setFlags(ArtFlags.FLAG_FOR_SINGLE_SPLIT,
ArtFlags.FLAG_FOR_SINGLE_SPLIT)
@@ -132,6 +135,20 @@
return 1;
}
}
+ if (forSingleSplit) {
+ if (scopeFlags != 0) {
+ pw.println("'--primary-dex', '--secondary-dex', and "
+ + "'--include-dependencies' must not be set when '--split' is "
+ + "set.");
+ return 1;
+ }
+ scopeFlags = ArtFlags.FLAG_FOR_PRIMARY_DEX;
+ }
+ if (scopeFlags != 0) {
+ paramsBuilder.setFlags(scopeFlags,
+ ArtFlags.FLAG_FOR_PRIMARY_DEX | ArtFlags.FLAG_FOR_SECONDARY_DEX
+ | ArtFlags.FLAG_SHOULD_INCLUDE_DEPENDENCIES);
+ }
OptimizeResult result;
try (var signal = new WithCancellationSignal(pw)) {
@@ -301,19 +318,24 @@
pw.println(" Print the optimization status of a package.");
pw.println(" By default, the command only prints the optimization status of primary "
+ "dex'es.");
- pw.println(" optimize-package [-m COMPILER_FILTER] [-f] [--secondary-dex] ");
- pw.println(" [--include-dependencies] [--split SPLIT_NAME] PACKAGE_NAME");
+ pw.println(" optimize-package [-m COMPILER_FILTER] [-f] [--primary-dex]");
+ pw.println(" [--secondary-dex] [--include-dependencies] [--split SPLIT_NAME]");
+ pw.println(" PACKAGE_NAME");
pw.println(" Optimize a package.");
- pw.println(" By default, the command only optimizes primary dex'es.");
- pw.println(" The command prints a job ID, which can be used to cancel the job using the"
- + "'cancel' command.");
+ pw.println(" If none of '--primary-dex', '--secondary-dex', and");
+ pw.println(" '--include-dependencies' is set, the command optimizes all of them.");
+ pw.println(" The command prints a job ID, which can be used to cancel the job using");
+ pw.println(" the 'cancel' command.");
pw.println(" Options:");
pw.println(" -m Set the compiler filter.");
pw.println(" -f Force compilation.");
- pw.println(" --secondary-dex Only optimize secondary dex.");
+ pw.println(" --primary-dex Optimize primary dex.");
+ pw.println(" --secondary-dex Optimize secondary dex.");
pw.println(" --include-dependencies Include dependencies.");
pw.println(" --split SPLIT_NAME Only optimize the given split. If SPLIT_NAME is an");
- pw.println(" empty string, only optimize the base APK.");
+ pw.println(" empty string, only optimize the base APK. When this option is set,");
+ pw.println(" '--primary-dex', '--secondary-dex', and '--include-dependencies' must");
+ pw.println(" not be set.");
pw.println(" optimize-packages REASON");
pw.println(" Run batch optimization for the given reason.");
pw.println(" The command prints a job ID, which can be used to cancel the job using the"
diff --git a/libartservice/service/java/com/android/server/art/model/ArtFlags.java b/libartservice/service/java/com/android/server/art/model/ArtFlags.java
index c35b2c2..cb5921d 100644
--- a/libartservice/service/java/com/android/server/art/model/ArtFlags.java
+++ b/libartservice/service/java/com/android/server/art/model/ArtFlags.java
@@ -17,11 +17,13 @@
package com.android.server.art.model;
import android.annotation.IntDef;
+import android.annotation.NonNull;
import android.annotation.SystemApi;
import android.app.job.JobScheduler;
import com.android.server.art.ArtManagerLocal;
import com.android.server.art.PriorityClass;
+import com.android.server.art.ReasonMapping;
import com.android.server.pm.PackageManagerLocal;
import java.lang.annotation.Retention;
@@ -136,10 +138,29 @@
/**
* Default flags that are used when
* {@link OptimizeParams.Builder#Builder(String)} is called.
- * Value: {@link #FLAG_FOR_PRIMARY_DEX}.
+ *
+ * @hide
*/
- public static @OptimizeFlags int defaultOptimizeFlags() {
- return FLAG_FOR_PRIMARY_DEX;
+ public static @OptimizeFlags int defaultOptimizeFlags(@NonNull String reason) {
+ switch (reason) {
+ case ReasonMapping.REASON_INSTALL:
+ case ReasonMapping.REASON_INSTALL_FAST:
+ case ReasonMapping.REASON_INSTALL_BULK:
+ case ReasonMapping.REASON_INSTALL_BULK_SECONDARY:
+ case ReasonMapping.REASON_INSTALL_BULK_DOWNGRADED:
+ case ReasonMapping.REASON_INSTALL_BULK_SECONDARY_DOWNGRADED:
+ return FLAG_FOR_PRIMARY_DEX;
+ case ReasonMapping.REASON_INACTIVE:
+ return FLAG_FOR_PRIMARY_DEX | FLAG_FOR_SECONDARY_DEX | FLAG_SHOULD_DOWNGRADE;
+ case ReasonMapping.REASON_FIRST_BOOT:
+ case ReasonMapping.REASON_BOOT_AFTER_OTA:
+ return FLAG_FOR_PRIMARY_DEX | FLAG_SHOULD_INCLUDE_DEPENDENCIES;
+ case ReasonMapping.REASON_BG_DEXOPT:
+ case ReasonMapping.REASON_CMDLINE:
+ default:
+ return FLAG_FOR_PRIMARY_DEX | FLAG_FOR_SECONDARY_DEX
+ | FLAG_SHOULD_INCLUDE_DEPENDENCIES;
+ }
}
// Keep in sync with `PriorityClass` except for `PRIORITY_NONE`.
diff --git a/libartservice/service/java/com/android/server/art/model/OptimizeParams.java b/libartservice/service/java/com/android/server/art/model/OptimizeParams.java
index 175d900..0c22337 100644
--- a/libartservice/service/java/com/android/server/art/model/OptimizeParams.java
+++ b/libartservice/service/java/com/android/server/art/model/OptimizeParams.java
@@ -46,7 +46,7 @@
* compiler filter must be explicitly set.
*/
public Builder(@NonNull String reason) {
- this(reason, ArtFlags.defaultOptimizeFlags());
+ this(reason, ArtFlags.defaultOptimizeFlags(reason));
}
/**