aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Iashchenko <nikitai@google.com>2022-07-19 23:13:23 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2022-07-19 23:13:23 +0000
commitd668118a296bda637ac216b33925075384217b1e (patch)
tree60bf63e912ce4a7ea73863fbe6448b6955bfe347
parent797ea3aa08e0f72cdc546505017903f79ef1f341 (diff)
parent98bdb39d5e7c5cdc2a14eed33f2b4246cbb46fce (diff)
downloadvogar-d668118a296bda637ac216b33925075384217b1e.tar.gz
Merge "Add --serial-dexing and --verbose-dex-stats flags to Vogar" am: ded9550581 am: 602bd6ca24 am: 60e49e9e22 am: e0c0348b87 am: 98bdb39d5e
Original change: https://android-review.googlesource.com/c/platform/external/vogar/+/2150073 Change-Id: I0c45280b1fc25fb45c232d70b13888a3bc7fdfa8 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r--src/vogar/Run.java4
-rw-r--r--src/vogar/Vogar.java19
-rw-r--r--src/vogar/android/AndroidSdk.java14
-rw-r--r--src/vogar/android/DeviceRuntime.java14
-rw-r--r--test/vogar/android/AbstractModeTest.java2
5 files changed, 45 insertions, 8 deletions
diff --git a/src/vogar/Run.java b/src/vogar/Run.java
index ba36594..402b1c4 100644
--- a/src/vogar/Run.java
+++ b/src/vogar/Run.java
@@ -106,6 +106,8 @@ public final class Run {
public final boolean checkJni;
public final boolean debugging;
public final Integer sdkVersion;
+ public final boolean serialDexing;
+ public final boolean verboseDexStats;
public Run(Vogar vogar, Toolchain toolchain, Console console, Mkdir mkdir,
AndroidSdk androidSdk, Rm rm, Target target, File runnerDir)
@@ -186,6 +188,8 @@ public final class Run {
this.checkJni = vogar.checkJni;
this.debugging = (vogar.debugPort != null) || vogar.debugApp;
this.sdkVersion = vogar.sdkVersion;
+ this.serialDexing = vogar.serialDexing;
+ this.verboseDexStats = vogar.verboseDexStats;
}
private Mode createMode(ModeId modeId, Variant variant) {
diff --git a/src/vogar/Vogar.java b/src/vogar/Vogar.java
index 59a0616..2be22e9 100644
--- a/src/vogar/Vogar.java
+++ b/src/vogar/Vogar.java
@@ -221,6 +221,12 @@ public final class Vogar {
@Option(names = {"--sdk-version"})
Integer sdkVersion = 28;
+ @Option(names = {"--serial-dexing"})
+ boolean serialDexing = false;
+
+ @Option(names = {"--verbose-dex-stats"})
+ boolean verboseDexStats = false;
+
@VisibleForTesting public Vogar() {}
private void printUsage() {
@@ -327,6 +333,17 @@ public final class Vogar {
System.out.println();
System.out.println(" --verbose: turn on persistent verbose output.");
System.out.println();
+ System.out.println(" --serial-dexing: disallow Vogar spawn multiple simultaneous dex tasks");
+ System.out.println(" Enabling this is useful when there is a memory constraint;");
+ System.out.println(" and each dex task could easily consume around 1.5G of memory.");
+ System.out.println(" Default is: " + serialDexing);
+ System.out.println();
+ System.out.println(" --verbose-dex-stats: print verbose stats of used resources by dex tasks");
+ System.out.println(" Enabling this wraps each dex task in '/usr/bin/time -v' call");
+ System.out.println(" and adds its output to the stdout log. Useful to get a sense of");
+ System.out.println(" resource usage such as RSS memory, CPU usage and wall-clock time.");
+ System.out.println(" Default is: " + verboseDexStats);
+ System.out.println();
System.out.println(" --check-jni: enable CheckJNI mode.");
System.out.println(" See http://developer.android.com/training/articles/perf-jni.html.");
System.out.println(" Default is: " + checkJni + ", but disabled for --benchmark.");
@@ -666,7 +683,7 @@ public final class Vogar {
AndroidSdk androidSdk = null;
if (modeId.requiresAndroidSdk()) {
androidSdk = AndroidSdk.createAndroidSdk(console, mkdir, modeId, language,
- !actionFiles.isEmpty());
+ !actionFiles.isEmpty(), serialDexing, verboseDexStats);
}
if (runnerType == null) {
diff --git a/src/vogar/android/AndroidSdk.java b/src/vogar/android/AndroidSdk.java
index c4b06ab..6dc5f4a 100644
--- a/src/vogar/android/AndroidSdk.java
+++ b/src/vogar/android/AndroidSdk.java
@@ -58,6 +58,8 @@ public class AndroidSdk {
private final String desugarJarPath;
private final Md5Cache dexCache;
private final Language language;
+ private final boolean serialDexing;
+ private final boolean verboseDexStats;
public static Collection<File> defaultExpectations() {
return Collections.singletonList(new File("libcore/expectations/knownfailures.txt"));
@@ -71,7 +73,7 @@ public class AndroidSdk {
*/
public static AndroidSdk createAndroidSdk(
Log log, Mkdir mkdir, ModeId modeId, Language language,
- boolean supportBuildFromSource) {
+ boolean supportBuildFromSource, boolean serialDexing, boolean verboseDexStats) {
List<String> path = new Command.Builder(log).args("which", ARBITRARY_BUILD_TOOL_NAME)
.permitNonZeroExitStatus(true)
.execute();
@@ -220,7 +222,7 @@ public class AndroidSdk {
}
return new AndroidSdk(log, mkdir, compilationClasspath, androidJarPath, desugarJarPath,
- new HostFileCache(log, mkdir), language);
+ new HostFileCache(log, mkdir), language, serialDexing, verboseDexStats);
}
/** Logs jars that couldn't be found ands suggests a command for building them */
@@ -261,7 +263,8 @@ public class AndroidSdk {
@VisibleForTesting
AndroidSdk(Log log, Mkdir mkdir, File[] compilationClasspath, String androidJarPath,
- String desugarJarPath, HostFileCache hostFileCache, Language language) {
+ String desugarJarPath, HostFileCache hostFileCache, Language language,
+ boolean serialDexing, boolean verboseDexStats) {
this.log = log;
this.mkdir = mkdir;
this.compilationClasspath = compilationClasspath;
@@ -269,6 +272,8 @@ public class AndroidSdk {
this.desugarJarPath = desugarJarPath;
this.dexCache = new Md5Cache(log, "dex", hostFileCache);
this.language = language;
+ this.serialDexing = serialDexing;
+ this.verboseDexStats = verboseDexStats;
}
// Goes up N levels in the filesystem hierarchy. Return the last file that exists if this goes
@@ -382,6 +387,9 @@ public class AndroidSdk {
*/
Command.Builder builder = new Command.Builder(log);
+ if (verboseDexStats) {
+ builder.args("/usr/bin/time").args("-v");
+ }
switch (dexer) {
case DX:
builder.args(DX_COMMAND_NAME);
diff --git a/src/vogar/android/DeviceRuntime.java b/src/vogar/android/DeviceRuntime.java
index 1c85793..5c317ce 100644
--- a/src/vogar/android/DeviceRuntime.java
+++ b/src/vogar/android/DeviceRuntime.java
@@ -25,7 +25,6 @@ import java.util.HashSet;
import java.util.List;
import java.util.Set;
import vogar.Action;
-import vogar.Toolchain;
import vogar.Variant;
import vogar.Classpath;
import vogar.Mode;
@@ -56,10 +55,18 @@ public final class DeviceRuntime implements Mode {
@Override public Set<Task> installTasks() {
Set<Task> result = new HashSet<Task>();
+ Task lastDexTask = null;
// dex everything on the classpath and push it to the device.
for (File classpathElement : run.classpath.getElements()) {
- addCreateDexJarAndPushTasks(result, run.basenameOfJar(classpathElement),
+ Task currentDexTask = addCreateDexJarAndPushTasks(result, run.basenameOfJar(classpathElement),
classpathElement, null);
+ // If {@code serialDexing} is enabled, make each subsequent dex task
+ // depend on previous so any moment of time only one dexer (d8 or dx) instance is run
+ // simultaneously.
+ if (lastDexTask != null && run.serialDexing) {
+ currentDexTask.afterSuccess(lastDexTask);
+ }
+ lastDexTask = currentDexTask;
}
return result;
}
@@ -131,7 +138,7 @@ public final class DeviceRuntime implements Mode {
return result;
}
- private void addCreateDexJarAndPushTasks(
+ private Task addCreateDexJarAndPushTasks(
Set<Task> tasks, String name, File jar, Action action) {
File localDex = run.localDexFile(name);
File localTempDir = run.localDir(name);
@@ -140,6 +147,7 @@ public final class DeviceRuntime implements Mode {
localTempDir);
tasks.add(createDexJarTask);
tasks.add(run.target.pushTask(localDex, deviceDex).afterSuccess(createDexJarTask));
+ return createDexJarTask;
}
private Task newCreateDexJarTask(Classpath classpath, File classpathElement, String name,
diff --git a/test/vogar/android/AbstractModeTest.java b/test/vogar/android/AbstractModeTest.java
index 225883c..8f60b78 100644
--- a/test/vogar/android/AbstractModeTest.java
+++ b/test/vogar/android/AbstractModeTest.java
@@ -73,7 +73,7 @@ public abstract class AbstractModeTest {
androidSdk = new AndroidSdk(console, mkdir,
new File[] {new File("classpath")}, "android.jar", "desugar.jar",
new HostFileCache(console, mkdir),
- Language.CUR);
+ Language.CUR, false, false);
Target target = createTarget();
final Vogar vogar = new Vogar();