Flutter Engine
 
Loading...
Searching...
No Matches
switches.cc
Go to the documentation of this file.
1// Copyright 2013 The Flutter Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include <algorithm>
6#include <iomanip>
7#include <iostream>
8#include <iterator>
9#include <sstream>
10#include <string>
11
13#include "flutter/fml/paths.h"
15
16// This will include switch_defs.h once to get the default enum definition.
18
19#undef FLUTTER_SHELL_COMMON_SWITCH_DEFS_H_
20
21struct SwitchDesc {
22 flutter::Switch sw;
23 const std::string_view flag;
24 const char* help;
25};
26
27#undef DEF_SWITCHES_START
28#undef DEF_SWITCH
29#undef DEF_SWITCHES_END
30
31// clang-format off
32#define DEF_SWITCHES_START static const struct SwitchDesc gSwitchDescs[] = {
33#define DEF_SWITCH(p_swtch, p_flag, p_help) \
34 { flutter::Switch:: p_swtch, p_flag, p_help },
35#define DEF_SWITCHES_END };
36// clang-format on
37
38// List of common and safe VM flags to allow to be passed directly to the VM.
39#if FLUTTER_RELEASE
40
41// clang-format off
42static const std::string kAllowedDartFlags[] = {
43 "--enable-isolate-groups",
44 "--no-enable-isolate-groups",
45};
46// clang-format on
47
48#else
49
50// clang-format off
51static const std::string kAllowedDartFlags[] = {
52 "--enable-isolate-groups",
53 "--no-enable-isolate-groups",
54 "--enable_mirrors",
55 "--enable-service-port-fallback",
56 "--max_profile_depth",
57 "--profile_period",
58 "--random_seed",
59 "--sample-buffer-duration",
60 "--trace-kernel",
61 "--trace-reload",
62 "--trace-reload-verbose",
63 "--write-service-info",
64 "--max_subtype_cache_entries",
65 "--enable-asserts",
66};
67// clang-format on
68
69#endif // FLUTTER_RELEASE
70
71// Include switch_defs.h again for the struct definition.
73
74// Define symbols for the ICU data that is linked into the Flutter library on
75// Android. This is a workaround for crashes seen when doing dynamic lookups
76// of the engine's own symbols on some older versions of Android.
77#if FML_OS_ANDROID
78extern uint8_t _binary_icudtl_dat_start[];
79extern size_t _binary_icudtl_dat_size;
80
81static std::unique_ptr<fml::Mapping> GetICUStaticMapping() {
82 return std::make_unique<fml::NonOwnedMapping>(_binary_icudtl_dat_start,
83 _binary_icudtl_dat_size);
84}
85#endif
86
87namespace flutter {
88
89void PrintUsage(const std::string& executable_name) {
90 std::cerr << std::endl << " " << executable_name << std::endl << std::endl;
91
92 std::cerr << "Versions: " << std::endl << std::endl;
93
94 std::cerr << "Flutter Engine Version: " << GetFlutterEngineVersion()
95 << std::endl;
96
97 std::cerr << "Flutter Content Hash: " << GetFlutterContentHash() << std::endl;
98
99 std::cerr << "Skia Version: " << GetSkiaVersion() << std::endl;
100
101 std::cerr << "Dart Version: " << GetDartVersion() << std::endl << std::endl;
102
103 std::cerr << "Available Flags:" << std::endl;
104
105 const uint32_t column_width = 80;
106
107 const uint32_t flags_count = static_cast<uint32_t>(Switch::Sentinel);
108
109 uint32_t max_width = 2;
110 for (uint32_t i = 0; i < flags_count; i++) {
111 auto desc = gSwitchDescs[i];
112 max_width = std::max<uint32_t>(desc.flag.size() + 2, max_width);
113 }
114
115 const uint32_t help_width = column_width - max_width - 3;
116
117 std::cerr << std::string(column_width, '-') << std::endl;
118 for (uint32_t i = 0; i < flags_count; i++) {
119 auto desc = gSwitchDescs[i];
120
121 std::cerr << std::setw(max_width)
122 << std::string("--") +
123 std::string{desc.flag.data(), desc.flag.size()}
124 << " : ";
125
126 std::istringstream stream(desc.help);
127 int32_t remaining = help_width;
128
129 std::string word;
130 while (stream >> word && remaining > 0) {
131 remaining -= (word.size() + 1);
132 if (remaining <= 0) {
133 std::cerr << std::endl
134 << std::string(max_width, ' ') << " " << word << " ";
135 remaining = help_width;
136 } else {
137 std::cerr << word << " ";
138 }
139 }
140
141 std::cerr << std::endl;
142 }
143 std::cerr << std::string(column_width, '-') << std::endl;
144}
145
146const std::string_view FlagForSwitch(Switch swtch) {
147 for (uint32_t i = 0; i < static_cast<uint32_t>(Switch::Sentinel); i++) {
148 if (gSwitchDescs[i].sw == swtch) {
149 return gSwitchDescs[i].flag;
150 }
151 }
152 return std::string_view();
153}
154
155static std::vector<std::string> ParseCommaDelimited(const std::string& input) {
156 std::istringstream ss(input);
157 std::vector<std::string> result;
158 std::string token;
159 while (std::getline(ss, token, ',')) {
160 result.push_back(token);
161 }
162 return result;
163}
164
165static bool IsAllowedDartVMFlag(const std::string& flag) {
166 for (uint32_t i = 0; i < std::size(kAllowedDartFlags); ++i) {
167 const std::string& allowed = kAllowedDartFlags[i];
168 // Check that the prefix of the flag matches one of the allowed flags. This
169 // is to handle cases where flags take arguments, such as in
170 // "--max_profile_depth 1".
171 //
172 // We don't need to worry about cases like "--safe --sneaky_dangerous" as
173 // the VM will discard these as a single unrecognized flag.
174 if (flag.length() >= allowed.length() &&
175 std::equal(allowed.begin(), allowed.end(), flag.begin())) {
176 return true;
177 }
178 }
179 return false;
180}
181
182template <typename T>
183static bool GetSwitchValue(const fml::CommandLine& command_line,
184 Switch sw,
185 T* result) {
186 std::string switch_string;
187
188 if (!command_line.GetOptionValue(FlagForSwitch(sw), &switch_string)) {
189 return false;
190 }
191
192 std::stringstream stream(switch_string);
193 T value = 0;
194 if (stream >> value) {
195 *result = value;
196 return true;
197 }
198
199 return false;
200}
201
202std::unique_ptr<fml::Mapping> GetSymbolMapping(
203 const std::string& symbol_prefix,
204 const std::string& native_lib_path) {
205 const uint8_t* mapping = nullptr;
206 intptr_t size;
207
208 auto lookup_symbol = [&mapping, &size, symbol_prefix](
209 const fml::RefPtr<fml::NativeLibrary>& library) {
210 mapping = library->ResolveSymbol((symbol_prefix + "_start").c_str());
211 size = reinterpret_cast<intptr_t>(
212 library->ResolveSymbol((symbol_prefix + "_size").c_str()));
213 };
214
217 lookup_symbol(library);
218
219 if (!(mapping && size)) {
220 // Symbol lookup for the current process fails on some devices. As a
221 // fallback, try doing the lookup based on the path to the Flutter library.
222 library = fml::NativeLibrary::Create(native_lib_path.c_str());
223 lookup_symbol(library);
224 }
225
226 FML_CHECK(mapping && size) << "Unable to resolve symbols: " << symbol_prefix;
227 return std::make_unique<fml::NonOwnedMapping>(mapping, size);
228}
229
231 bool require_merged_platform_ui_thread) {
232 Settings settings = {};
233
234 // Set executable name.
235 if (command_line.has_argv0()) {
236 settings.executable_name = command_line.argv0();
237 }
238
239 // Enable the VM Service
240 settings.enable_vm_service =
241 !command_line.HasOption(FlagForSwitch(Switch::DisableVMService));
242
243 // Enable mDNS VM Service Publication
244 settings.enable_vm_service_publication = !command_line.HasOption(
245 FlagForSwitch(Switch::DisableVMServicePublication));
246
247 // Set VM Service Host
248 if (command_line.HasOption(FlagForSwitch(Switch::DeviceVMServiceHost))) {
249 command_line.GetOptionValue(FlagForSwitch(Switch::DeviceVMServiceHost),
250 &settings.vm_service_host);
251 }
252 // Default the VM Service port based on --ipv6 if not set.
253 if (settings.vm_service_host.empty()) {
254 settings.vm_service_host =
255 command_line.HasOption(FlagForSwitch(Switch::IPv6)) ? "::1"
256 : "127.0.0.1";
257 }
258
259 // Set VM Service Port
260 if (command_line.HasOption(FlagForSwitch(Switch::DeviceVMServicePort))) {
261 if (!GetSwitchValue(command_line, Switch::DeviceVMServicePort,
262 &settings.vm_service_port)) {
263 FML_LOG(INFO)
264 << "VM Service port specified was malformed. Will default to "
265 << settings.vm_service_port;
266 }
267 }
268
269 settings.may_insecurely_connect_to_all_domains = !command_line.HasOption(
270 FlagForSwitch(Switch::DisallowInsecureConnections));
271
272 command_line.GetOptionValue(FlagForSwitch(Switch::DomainNetworkPolicy),
273 &settings.domain_network_policy);
274
275 // Disable need for authentication codes for VM service communication, if
276 // specified.
278 command_line.HasOption(FlagForSwitch(Switch::DisableServiceAuthCodes));
279
280 // Allow fallback to automatic port selection if binding to a specified port
281 // fails.
283 command_line.HasOption(FlagForSwitch(Switch::EnableServicePortFallback));
284
285 // Checked mode overrides.
286 settings.disable_dart_asserts =
287 command_line.HasOption(FlagForSwitch(Switch::DisableDartAsserts));
288
289 settings.start_paused =
290 command_line.HasOption(FlagForSwitch(Switch::StartPaused));
291
292 settings.enable_checked_mode =
293 command_line.HasOption(FlagForSwitch(Switch::EnableCheckedMode));
294
295 settings.enable_dart_profiling =
296 command_line.HasOption(FlagForSwitch(Switch::EnableDartProfiling));
297
298 settings.profile_startup =
299 command_line.HasOption(FlagForSwitch(Switch::ProfileStartup));
300
302 command_line.HasOption(FlagForSwitch(Switch::EnableSoftwareRendering));
303
304 settings.endless_trace_buffer =
305 command_line.HasOption(FlagForSwitch(Switch::EndlessTraceBuffer));
306
307 settings.trace_startup =
308 command_line.HasOption(FlagForSwitch(Switch::TraceStartup));
309
310 settings.enable_serial_gc =
311 command_line.HasOption(FlagForSwitch(Switch::EnableSerialGC));
312
313#if !FLUTTER_RELEASE
314 settings.trace_skia = true;
315
316 if (command_line.HasOption(FlagForSwitch(Switch::TraceSkia))) {
317 // If --trace-skia is specified, then log all Skia events.
318 settings.trace_skia_allowlist.reset();
319 } else {
320 std::string trace_skia_allowlist;
321 command_line.GetOptionValue(FlagForSwitch(Switch::TraceSkiaAllowlist),
322 &trace_skia_allowlist);
323 if (trace_skia_allowlist.size()) {
324 settings.trace_skia_allowlist = ParseCommaDelimited(trace_skia_allowlist);
325 } else {
326 settings.trace_skia_allowlist = {"skia.shaders"};
327 }
328 }
329#endif // !FLUTTER_RELEASE
330
331 std::string trace_allowlist;
332 command_line.GetOptionValue(FlagForSwitch(Switch::TraceAllowlist),
333 &trace_allowlist);
334 settings.trace_allowlist = ParseCommaDelimited(trace_allowlist);
335
336 settings.trace_systrace =
337 command_line.HasOption(FlagForSwitch(Switch::TraceSystrace));
338
339 command_line.GetOptionValue(FlagForSwitch(Switch::TraceToFile),
340 &settings.trace_to_file);
341
342 settings.profile_microtasks =
343 command_line.HasOption(FlagForSwitch(Switch::ProfileMicrotasks));
344
346 command_line.HasOption(FlagForSwitch(Switch::SkiaDeterministicRendering));
347
348 settings.verbose_logging =
349 command_line.HasOption(FlagForSwitch(Switch::VerboseLogging));
350
351 command_line.GetOptionValue(FlagForSwitch(Switch::FlutterAssetsDir),
352 &settings.assets_path);
353
354 std::vector<std::string_view> aot_shared_library_name =
355 command_line.GetOptionValues(FlagForSwitch(Switch::AotSharedLibraryName));
356
357 std::vector<std::string_view> vmservice_shared_library_name =
358 command_line.GetOptionValues(
359 FlagForSwitch(Switch::AotVMServiceSharedLibraryName));
360 for (auto path : vmservice_shared_library_name) {
361 settings.vmservice_snapshot_library_path.emplace_back(path);
362 }
363
364 std::string snapshot_asset_path;
365 command_line.GetOptionValue(FlagForSwitch(Switch::SnapshotAssetPath),
366 &snapshot_asset_path);
367
368 std::string vm_snapshot_data_filename;
369 command_line.GetOptionValue(FlagForSwitch(Switch::VmSnapshotData),
370 &vm_snapshot_data_filename);
371
372 command_line.GetOptionValue(FlagForSwitch(Switch::Route), &settings.route);
373
374 std::string vm_snapshot_instr_filename;
375 command_line.GetOptionValue(FlagForSwitch(Switch::VmSnapshotInstructions),
376 &vm_snapshot_instr_filename);
377
378 std::string isolate_snapshot_data_filename;
379 command_line.GetOptionValue(FlagForSwitch(Switch::IsolateSnapshotData),
380 &isolate_snapshot_data_filename);
381
382 std::string isolate_snapshot_instr_filename;
383 command_line.GetOptionValue(
384 FlagForSwitch(Switch::IsolateSnapshotInstructions),
385 &isolate_snapshot_instr_filename);
386
387 if (!aot_shared_library_name.empty()) {
388 for (std::string_view name : aot_shared_library_name) {
389 settings.application_library_paths.emplace_back(name);
390 }
391 } else if (!snapshot_asset_path.empty()) {
392 settings.vm_snapshot_data_path =
393 fml::paths::JoinPaths({snapshot_asset_path, vm_snapshot_data_filename});
395 {snapshot_asset_path, vm_snapshot_instr_filename});
397 {snapshot_asset_path, isolate_snapshot_data_filename});
399 {snapshot_asset_path, isolate_snapshot_instr_filename});
400 }
401
402 command_line.GetOptionValue(FlagForSwitch(Switch::CacheDirPath),
403 &settings.temp_directory_path);
404
405 bool leak_vm = "true" == command_line.GetOptionValueWithDefault(
406 FlagForSwitch(Switch::LeakVM), "true");
407 settings.leak_vm = leak_vm;
408
409 if (settings.icu_initialization_required) {
410 command_line.GetOptionValue(FlagForSwitch(Switch::ICUDataFilePath),
411 &settings.icu_data_path);
412 if (command_line.HasOption(FlagForSwitch(Switch::ICUSymbolPrefix))) {
413 std::string icu_symbol_prefix, native_lib_path;
414 command_line.GetOptionValue(FlagForSwitch(Switch::ICUSymbolPrefix),
415 &icu_symbol_prefix);
416 command_line.GetOptionValue(FlagForSwitch(Switch::ICUNativeLibPath),
417 &native_lib_path);
418
419#if FML_OS_ANDROID
420 settings.icu_mapper = GetICUStaticMapping;
421#else
422 settings.icu_mapper = [icu_symbol_prefix, native_lib_path] {
423 return GetSymbolMapping(icu_symbol_prefix, native_lib_path);
424 };
425#endif
426 }
427 }
428
429 settings.use_test_fonts =
430 command_line.HasOption(FlagForSwitch(Switch::UseTestFonts));
431 settings.use_asset_fonts =
432 !command_line.HasOption(FlagForSwitch(Switch::DisableAssetFonts));
433
434#if FML_OS_IOS || FML_OS_IOS_SIMULATOR || SLIMPELLER
435// On these configurations, the Impeller flags are completely ignored with the
436// default taking hold.
437#else // FML_OS_IOS && !FML_OS_IOS_SIMULATOR
438 {
439 std::string enable_impeller_value;
440 if (command_line.GetOptionValue(FlagForSwitch(Switch::EnableImpeller),
441 &enable_impeller_value)) {
442 settings.enable_impeller =
443 enable_impeller_value.empty() || "true" == enable_impeller_value;
444 }
445 }
446#endif // FML_OS_IOS && !FML_OS_IOS_SIMULATOR
447
448 {
449 std::string impeller_backend_value;
450 if (command_line.GetOptionValue(FlagForSwitch(Switch::ImpellerBackend),
451 &impeller_backend_value)) {
452 if (!impeller_backend_value.empty()) {
453 settings.requested_rendering_backend = impeller_backend_value;
454 }
455 }
456 }
457
458 settings.enable_vulkan_validation =
459 command_line.HasOption(FlagForSwitch(Switch::EnableVulkanValidation));
461 command_line.HasOption(FlagForSwitch(Switch::EnableOpenGLGPUTracing));
463 command_line.HasOption(FlagForSwitch(Switch::EnableVulkanGPUTracing));
464
465 settings.enable_embedder_api =
466 command_line.HasOption(FlagForSwitch(Switch::EnableEmbedderAPI));
467
468 settings.prefetched_default_font_manager = command_line.HasOption(
469 FlagForSwitch(Switch::PrefetchedDefaultFontManager));
470
471 std::string all_dart_flags;
472 if (command_line.GetOptionValue(FlagForSwitch(Switch::DartFlags),
473 &all_dart_flags)) {
474 // Assume that individual flags are comma separated.
475 std::vector<std::string> flags = ParseCommaDelimited(all_dart_flags);
476 for (const auto& flag : flags) {
477 if (!IsAllowedDartVMFlag(flag)) {
478 FML_LOG(FATAL) << "Encountered disallowed Dart VM flag: " << flag;
479 }
480 settings.dart_flags.push_back(flag);
481 }
482 }
483
484#if !FLUTTER_RELEASE
485 command_line.GetOptionValue(FlagForSwitch(Switch::LogTag), &settings.log_tag);
486#endif
487
489 command_line.HasOption(FlagForSwitch(Switch::DumpSkpOnShaderCompilation));
490
491 settings.cache_sksl =
492 command_line.HasOption(FlagForSwitch(Switch::CacheSkSL));
493
494 settings.purge_persistent_cache =
495 command_line.HasOption(FlagForSwitch(Switch::PurgePersistentCache));
496
497 if (command_line.HasOption(FlagForSwitch(Switch::OldGenHeapSize))) {
498 std::string old_gen_heap_size;
499 command_line.GetOptionValue(FlagForSwitch(Switch::OldGenHeapSize),
500 &old_gen_heap_size);
501 settings.old_gen_heap_size = std::stoi(old_gen_heap_size);
502 }
503
504 if (command_line.HasOption(
505 FlagForSwitch(Switch::ResourceCacheMaxBytesThreshold))) {
506 std::string resource_cache_max_bytes_threshold;
507 command_line.GetOptionValue(
508 FlagForSwitch(Switch::ResourceCacheMaxBytesThreshold),
509 &resource_cache_max_bytes_threshold);
511 std::stoi(resource_cache_max_bytes_threshold);
512 }
513
514 settings.enable_platform_isolates =
515 command_line.HasOption(FlagForSwitch(Switch::EnablePlatformIsolates));
516
517 settings.enable_surface_control = command_line.HasOption(
518 FlagForSwitch(Switch::EnableAndroidSurfaceControl));
519
520 constexpr std::string_view kMergedThreadEnabled = "enabled";
521 constexpr std::string_view kMergedThreadDisabled = "disabled";
522 constexpr std::string_view kMergedThreadMergeAfterLaunch = "mergeAfterLaunch";
523 if (command_line.HasOption(
524 FlagForSwitch(Switch::DisableMergedPlatformUIThread))) {
525 FML_CHECK(!require_merged_platform_ui_thread)
526 << "This platform does not support the "
527 << FlagForSwitch(Switch::DisableMergedPlatformUIThread) << " flag";
528
531 } else if (command_line.HasOption(
532 FlagForSwitch(Switch::MergedPlatformUIThread))) {
533 std::string merged_platform_ui;
534 command_line.GetOptionValue(FlagForSwitch(Switch::MergedPlatformUIThread),
535 &merged_platform_ui);
536 if (merged_platform_ui == kMergedThreadEnabled) {
539 } else if (merged_platform_ui == kMergedThreadDisabled) {
540 FML_CHECK(!require_merged_platform_ui_thread)
541 << "This platform does not support the "
542 << FlagForSwitch(Switch::MergedPlatformUIThread) << "="
543 << kMergedThreadDisabled << " flag";
544
547 } else if (merged_platform_ui == kMergedThreadMergeAfterLaunch) {
550 }
551 }
552
553 settings.enable_flutter_gpu =
554 command_line.HasOption(FlagForSwitch(Switch::EnableFlutterGPU));
556 command_line.HasOption(FlagForSwitch(Switch::ImpellerLazyShaderMode));
558 command_line.HasOption(FlagForSwitch(Switch::ImpellerAntialiasLines));
559
560 return settings;
561}
562
563} // namespace flutter
const std::string & argv0() const
std::vector< std::string_view > GetOptionValues(std::string_view name) const
std::string GetOptionValueWithDefault(std::string_view name, std::string_view default_value) const
bool HasOption(std::string_view name, size_t *index=nullptr) const
bool GetOptionValue(std::string_view name, std::string *value) const
bool has_argv0() const
static fml::RefPtr< NativeLibrary > CreateForCurrentProcess()
static fml::RefPtr< NativeLibrary > Create(const char *path)
static int input(yyscan_t yyscanner)
int32_t value
void PrintUsage()
Definition main.cc:159
#define FML_LOG(severity)
Definition logging.h:101
#define FML_CHECK(condition)
Definition logging.h:104
const char * GetDartVersion()
Definition version.cc:23
const char * GetSkiaVersion()
Definition version.cc:19
static bool IsAllowedDartVMFlag(const std::string &flag)
Definition switches.cc:165
static bool GetSwitchValue(const fml::CommandLine &command_line, Switch sw, T *result)
Definition switches.cc:183
it will be possible to load the file into Perfetto s trace viewer use test Running tests that layout and measure text will not yield consistent results across various platforms Enabling this option will make font resolution default to the Ahem test font on all disable asset Prevents usage of any non test fonts unless they were explicitly Loaded via prefetched default font Indicates whether the embedding started a prefetch of the default font manager before creating the engine run In non interactive keep the shell running after the Dart script has completed enable serial On low power devices with low core running concurrent GC tasks on threads can cause them to contend with the UI thread which could potentially lead to jank This option turns off all concurrent GC activities domain network JSON encoded network policy per domain This overrides the DisallowInsecureConnections switch Embedder can specify whether to allow or disallow insecure connections at a domain level old gen heap size
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot The VM snapshot data that will be memory mapped as read only SnapshotAssetPath must be present isolate snapshot The isolate snapshot data that will be memory mapped as read only SnapshotAssetPath must be present cache dir path
Definition switch_defs.h:52
const char * GetFlutterEngineVersion()
Definition version.cc:11
DEF_SWITCHES_START aot vmservice shared library name
Definition switch_defs.h:27
Settings SettingsFromCommandLine(const fml::CommandLine &command_line, bool require_merged_platform_ui_thread)
Definition switches.cc:230
static std::vector< std::string > ParseCommaDelimited(const std::string &input)
Definition switches.cc:155
const char * GetFlutterContentHash()
Definition version.cc:15
std::unique_ptr< fml::Mapping > GetSymbolMapping(const std::string &symbol_prefix, const std::string &native_lib_path)
Definition switches.cc:202
const std::string_view FlagForSwitch(Switch swtch)
Definition switches.cc:146
std::string JoinPaths(std::initializer_list< std::string > components)
Definition paths.cc:14
static const std::string kAllowedDartFlags[]
Definition switches.cc:51
const std::string_view flag
Definition switches.cc:23
flutter::Switch sw
Definition switches.cc:22
const char * help
Definition switches.cc:24
bool prefetched_default_font_manager
Definition settings.h:215
bool enable_embedder_api
Definition settings.h:360
std::vector< std::string > vmservice_snapshot_library_path
Definition settings.h:138
bool enable_software_rendering
Definition settings.h:317
bool icu_initialization_required
Definition settings.h:326
bool endless_trace_buffer
Definition settings.h:159
std::string vm_snapshot_instr_path
Definition settings.h:117
bool impeller_enable_lazy_shader_mode
Definition settings.h:239
bool disable_service_auth_codes
Definition settings.h:202
std::string temp_directory_path
Definition settings.h:144
bool enable_opengl_gpu_tracing
Definition settings.h:256
std::string assets_path
Definition settings.h:333
bool enable_dart_profiling
Definition settings.h:160
MergedPlatformUIThread merged_platform_ui_thread
Definition settings.h:379
bool skia_deterministic_rendering_on_cpu
Definition settings.h:318
bool purge_persistent_cache
Definition settings.h:158
bool enable_vulkan_gpu_tracing
Definition settings.h:259
std::vector< std::string > trace_allowlist
Definition settings.h:150
bool enable_flutter_gpu
Definition settings.h:233
bool enable_surface_control
Definition settings.h:236
std::string vm_service_host
Definition settings.h:193
bool enable_vulkan_validation
Definition settings.h:252
MappingCallback icu_mapper
Definition settings.h:328
bool dump_skp_on_shader_compilation
Definition settings.h:156
std::string log_tag
Definition settings.h:320
bool profile_microtasks
Definition settings.h:164
std::string isolate_snapshot_data_path
Definition settings.h:120
uint32_t vm_service_port
Definition settings.h:198
std::vector< std::string > dart_flags
Definition settings.h:145
bool impeller_antialiased_lines
Definition settings.h:242
bool may_insecurely_connect_to_all_domains
Definition settings.h:167
std::string route
Definition settings.h:125
bool enable_checked_mode
Definition settings.h:147
std::string executable_name
Definition settings.h:180
bool enable_service_port_fallback
Definition settings.h:206
bool enable_vm_service_publication
Definition settings.h:190
std::optional< std::vector< std::string > > trace_skia_allowlist
Definition settings.h:151
std::optional< std::string > requested_rendering_backend
Definition settings.h:248
std::string icu_data_path
Definition settings.h:327
bool enable_platform_isolates
Definition settings.h:365
std::string trace_to_file
Definition settings.h:154
bool disable_dart_asserts
Definition settings.h:162
std::string vm_snapshot_data_path
Definition settings.h:115
int64_t old_gen_heap_size
Definition settings.h:352
std::string isolate_snapshot_instr_path
Definition settings.h:122
size_t resource_cache_max_bytes_threshold
Definition settings.h:355
std::string domain_network_policy
Definition settings.h:169
std::vector< std::string > application_library_paths
Definition settings.h:134