Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,160 @@
*/
public class JavaSwitches {
public static final String ENABLE_QUIC = "EnableQUIC";
<<<<<<< HEAD
=======
public static final String DISABLE_STARTUP_GUARD = "DisableStartupGuard";
public static final String DISABLE_STORAGE_MIGRATION = "DisableStorageMigration";
public static final String DISABLE_LOW_END_DEVICE_MODE = "DisableLowEndDeviceMode";
public static final String ENABLE_LOW_END_DEVICE_MODE_NO_SIMULATED_MEMORY =
"EnableLowEndDeviceModeNoSimulatedMemory";

/** GPU flag to enable memory settings in layer tree and set max_memory_for_prepaint_percentage. Value type: Integer (MiB) */
public static final String CC_LAYER_TREE_OPTIMIZATION = "CCLayerTreeOptimization";

/** V8 flag to enable jitless mode. Value type: Boolean (presence means true) */
public static final String V8_JITLESS = "V8Jitless";

/** V8 flag to enable write protection for code memory. Value type: Boolean (presence means true) */
public static final String V8_WRITE_PROTECT_CODE_MEMORY = "V8WriteProtectCodeMemory";

/** V8 flag to disable optimize for size. Value type: Boolean (presence means true) */
public static final String V8_DISABLE_OPTIMIZE_FOR_SIZE = "V8DisableOptimizeForSize";

/** V8 flag to set the GC interval. Value type: Integer */
public static final String V8_GC_INTERVAL = "V8GcInterval";

/** V8 flag to set the initial old space size. Value type: Integer (MiB) */
public static final String V8_INITIAL_OLD_SPACE_SIZE = "V8InitialOldSpaceSize";

/** V8 flag to set the maximum old space size. Value type: Integer (MiB) */
public static final String V8_MAX_OLD_SPACE_SIZE = "V8MaxOldSpaceSize";

/** V8 flag to set the maximum semi space size. Value type: Integer (MiB) */
public static final String V8_MAX_SEMI_SPACE_SIZE = "V8MaxSemiSpaceSize";

/** V8 flag to set the heap growing percent. Value type: Integer */
public static final String V8_HEAP_GROWING_PERCENT = "V8HeapGrowingPercent";

/** V8 flag to disable garbage collection for wasm code */
public static final String V8_NOWASM_CODE_GC = "V8NoWasmCodeGC";

public static final String DISABLE_SPLASH_SCREEN = "DisableSplashScreen";
public static final String FORCE_IMAGE_SPLASH_SCREEN = "ForceImageSplashScreen";
/** CC flag to set the number of raster threads. Value type: Integer */
public static final String NUM_RASTER_THREADS = "NumRasterThreads";

/** flag to disable PartitionAllocBackupRefPtr */
public static final String DISABLE_BRP = "DisableBRP";
/** flag to enable PartitionAllocBackupRefPtr with reclaimer */
public static final String ENABLE_BRP_RECLAIMER = "EnableBRPRcelaimer";

/** flag to enable AndroidOverlay for SbPlayer */
public static final String ENABLE_ANDROID_OVERLAY = "EnableAndroidOverlay";

/** flag to enable SkiaFontCache */
public static final String SKIA_FONT_CACHE = "SkiaFontCache";

/** flag to lower the priority of the network service thread */
public static final String LOWER_NETWORK_SERVICE_THREAD_PRIORITY = "LowerNetworkServiceThreadPriority";

public static List<String> getExtraCommandLineArgs(Map<String, String> javaSwitches) {
List<String> extraCommandLineArgs = new ArrayList<>();
if (!javaSwitches.containsKey(JavaSwitches.ENABLE_QUIC)) {
extraCommandLineArgs.add("--disable-quic");
}
if (!javaSwitches.containsKey(JavaSwitches.DISABLE_LOW_END_DEVICE_MODE)) {
extraCommandLineArgs.add("--enable-low-end-device-mode");
extraCommandLineArgs.add("--disable-rgba-4444-textures");
if (javaSwitches.containsKey(JavaSwitches.ENABLE_LOW_END_DEVICE_MODE_NO_SIMULATED_MEMORY)) {
extraCommandLineArgs.add("--enable-low-end-device-mode-no-simulated-memory");
}
}

if (javaSwitches.containsKey(JavaSwitches.CC_LAYER_TREE_OPTIMIZATION)) {
extraCommandLineArgs.add(
"--cc-layer-tree-optimization="
+ javaSwitches.get(JavaSwitches.CC_LAYER_TREE_OPTIMIZATION).replaceAll("[^0-9]", ""));
}

if (javaSwitches.containsKey(JavaSwitches.V8_JITLESS)) {
extraCommandLineArgs.add("--js-flags=--jitless");
}
if (javaSwitches.containsKey(JavaSwitches.V8_WRITE_PROTECT_CODE_MEMORY)) {
extraCommandLineArgs.add("--js-flags=--write-protect-code-memory");
}
if (javaSwitches.containsKey(JavaSwitches.V8_GC_INTERVAL)) {
extraCommandLineArgs.add(
"--js-flags=--gc-interval="
+ javaSwitches.get(JavaSwitches.V8_GC_INTERVAL).replaceAll("[^0-9]", ""));
}
if (javaSwitches.containsKey(JavaSwitches.V8_INITIAL_OLD_SPACE_SIZE)) {
extraCommandLineArgs.add(
"--js-flags=--initial-old-space-size="
+ javaSwitches.get(JavaSwitches.V8_INITIAL_OLD_SPACE_SIZE).replaceAll("[^0-9]", ""));
}
if (javaSwitches.containsKey(JavaSwitches.V8_MAX_OLD_SPACE_SIZE)) {
extraCommandLineArgs.add(
"--js-flags=--max-old-space-size="
+ javaSwitches.get(JavaSwitches.V8_MAX_OLD_SPACE_SIZE).replaceAll("[^0-9]", ""));
}
if (javaSwitches.containsKey(JavaSwitches.V8_MAX_SEMI_SPACE_SIZE)) {
extraCommandLineArgs.add(
"--js-flags=--max-semi-space-size="
+ javaSwitches.get(JavaSwitches.V8_MAX_SEMI_SPACE_SIZE).replaceAll("[^0-9]", ""));
}
if (javaSwitches.containsKey(JavaSwitches.V8_HEAP_GROWING_PERCENT)) {
extraCommandLineArgs.add(
"--js-flags=--heap-growing-percent="
+ javaSwitches.get(JavaSwitches.V8_HEAP_GROWING_PERCENT).replaceAll("[^0-9]", ""));
}

if (!javaSwitches.containsKey(JavaSwitches.V8_DISABLE_OPTIMIZE_FOR_SIZE)) {
extraCommandLineArgs.add("--js-flags=--optimize-for-size");
}

if (javaSwitches.containsKey(JavaSwitches.V8_NOWASM_CODE_GC)) {
extraCommandLineArgs.add("--js-flags=--nowasm-code-gc");
}

if (javaSwitches.containsKey(JavaSwitches.DISABLE_SPLASH_SCREEN)) {
extraCommandLineArgs.add("--disable-splash-screen");
}
if (javaSwitches.containsKey(JavaSwitches.DISABLE_STORAGE_MIGRATION)) {
extraCommandLineArgs.add("--disable-storage-migration");
}
if (javaSwitches.containsKey(JavaSwitches.FORCE_IMAGE_SPLASH_SCREEN)) {
extraCommandLineArgs.add("--force-image-splash-screen");
}

if (javaSwitches.containsKey(JavaSwitches.NUM_RASTER_THREADS)) {
extraCommandLineArgs.add(
"--num-raster-threads="
+ javaSwitches.get(JavaSwitches.NUM_RASTER_THREADS).replaceAll("[^0-9]", ""));
}

// BRP settings
if (javaSwitches.containsKey(JavaSwitches.DISABLE_BRP)) {
extraCommandLineArgs.add("--disable-features=PartitionAllocBackupRefPtr");
}
if (javaSwitches.containsKey(JavaSwitches.ENABLE_BRP_RECLAIMER)) {
extraCommandLineArgs.add("--enable-features=PartitionAllocBackupRefPtr:brp-mode/enabled-with-memory-reclaimer");
}

if (javaSwitches.containsKey(JavaSwitches.ENABLE_ANDROID_OVERLAY)) {
extraCommandLineArgs.add("--CobaltUsingAndroidOverlay");
extraCommandLineArgs.add("--enable-features=CobaltUsingAndroidOverlay");
}

if (javaSwitches.containsKey(JavaSwitches.SKIA_FONT_CACHE)) {
extraCommandLineArgs.add("--enable-features=SkiaFontCache");
}

if (javaSwitches.containsKey(JavaSwitches.LOWER_NETWORK_SERVICE_THREAD_PRIORITY)) {
extraCommandLineArgs.add("--enable-features=LowerNetworkServiceThreadPriority");
}

return extraCommandLineArgs;
}
>>>>>>> fc66316c69 (Add experiment switch for v8 --nowasm-code-gc (#9241))
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
// Copyright 2025 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package dev.cobalt.util;

import static com.google.common.truth.Truth.assertThat;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;

/** Tests for JavaSwitches. */
@RunWith(RobolectricTestRunner.class)
public class JavaSwitchesTest {

@Test
public void getExtraCommandLineArgs_EmptySwitches() {
Map<String, String> javaSwitches = new HashMap<>();
List<String> args = JavaSwitches.getExtraCommandLineArgs(javaSwitches);

// Default switches when none are provided.
assertThat(args).contains("--disable-quic");
assertThat(args).contains("--enable-low-end-device-mode");
assertThat(args).contains("--disable-rgba-4444-textures");
assertThat(args).contains("--js-flags=--optimize-for-size");
assertThat(args).hasSize(4);
}

@Test
public void getExtraCommandLineArgs_AllSwitches() {
Map<String, String> javaSwitches = new HashMap<>();
javaSwitches.put(JavaSwitches.ENABLE_QUIC, "true");
javaSwitches.put(JavaSwitches.DISABLE_LOW_END_DEVICE_MODE, "true");
javaSwitches.put(JavaSwitches.V8_JITLESS, "true");
javaSwitches.put(JavaSwitches.V8_WRITE_PROTECT_CODE_MEMORY, "true");
javaSwitches.put(JavaSwitches.V8_GC_INTERVAL, "1000");
javaSwitches.put(JavaSwitches.V8_INITIAL_OLD_SPACE_SIZE, "128");
javaSwitches.put(JavaSwitches.V8_MAX_OLD_SPACE_SIZE, "256");
javaSwitches.put(JavaSwitches.V8_MAX_SEMI_SPACE_SIZE, "16");
javaSwitches.put(JavaSwitches.V8_HEAP_GROWING_PERCENT, "50");
javaSwitches.put(JavaSwitches.V8_NOWASM_CODE_GC, "true");
javaSwitches.put(JavaSwitches.CC_LAYER_TREE_OPTIMIZATION, "0");
javaSwitches.put(JavaSwitches.DISABLE_SPLASH_SCREEN, "true");
javaSwitches.put(JavaSwitches.FORCE_IMAGE_SPLASH_SCREEN, "true");
javaSwitches.put(JavaSwitches.NUM_RASTER_THREADS, "4");
javaSwitches.put(JavaSwitches.DISABLE_BRP, "true");
javaSwitches.put(JavaSwitches.ENABLE_BRP_RECLAIMER, "true");
javaSwitches.put(JavaSwitches.SKIA_FONT_CACHE, "true");

List<String> args = JavaSwitches.getExtraCommandLineArgs(javaSwitches);

assertThat(args).doesNotContain("--disable-quic");
assertThat(args).doesNotContain("--enable-low-end-device-mode");
assertThat(args).doesNotContain("--disable-rgba-4444-textures");

assertThat(args).contains("--cc-layer-tree-optimization=0");

assertThat(args).contains("--js-flags=--jitless");
assertThat(args).contains("--js-flags=--write-protect-code-memory");
assertThat(args).contains("--js-flags=--gc-interval=1000");
assertThat(args).contains("--js-flags=--initial-old-space-size=128");
assertThat(args).contains("--js-flags=--max-old-space-size=256");
assertThat(args).contains("--js-flags=--max-semi-space-size=16");
assertThat(args).contains("--js-flags=--heap-growing-percent=50");
assertThat(args).contains("--js-flags=--optimize-for-size");
assertThat(args).contains("--js-flags=--nowasm-code-gc");
assertThat(args).contains("--disable-splash-screen");
assertThat(args).contains("--force-image-splash-screen");
assertThat(args).contains("--num-raster-threads=4");
assertThat(args).contains("--disable-features=PartitionAllocBackupRefPtr");
assertThat(args).contains("--enable-features=PartitionAllocBackupRefPtr:brp-mode/enabled-with-memory-reclaimer");
assertThat(args).contains("--enable-features=SkiaFontCache");
assertThat(args).hasSize(16);
}

@Test
public void getExtraCommandLineArgs_LowEndDeviceModeNoSimulatedMemory() {
Map<String, String> javaSwitches = new HashMap<>();
javaSwitches.put(JavaSwitches.ENABLE_LOW_END_DEVICE_MODE_NO_SIMULATED_MEMORY, "true");

List<String> args = JavaSwitches.getExtraCommandLineArgs(javaSwitches);

assertThat(args).contains("--enable-low-end-device-mode");
assertThat(args).contains("--enable-low-end-device-mode-no-simulated-memory");
}

@Test
public void getExtraCommandLineArgs_SanitizeValues() {
Map<String, String> javaSwitches = new HashMap<>();
javaSwitches.put(JavaSwitches.V8_GC_INTERVAL, "1,000ms");
javaSwitches.put(JavaSwitches.V8_INITIAL_OLD_SPACE_SIZE, "128 MiB");

List<String> args = JavaSwitches.getExtraCommandLineArgs(javaSwitches);

assertThat(args).contains("--js-flags=--gc-interval=1000");
assertThat(args).contains("--js-flags=--initial-old-space-size=128");
}

@Test
public void getExtraCommandLineArgs_DisableV8OptimizeForSize() {
Map<String, String> javaSwitches = new HashMap<>();
javaSwitches.put(JavaSwitches.V8_DISABLE_OPTIMIZE_FOR_SIZE, "true");

List<String> args = JavaSwitches.getExtraCommandLineArgs(javaSwitches);

assertThat(args).doesNotContain("--js-flags=--optimize-for-size");
}
}
Loading