diff --git a/packages/flutter_tools/lib/src/android/android_device.dart b/packages/flutter_tools/lib/src/android/android_device.dart index a9df0c927c..f1e338dfad 100644 --- a/packages/flutter_tools/lib/src/android/android_device.dart +++ b/packages/flutter_tools/lib/src/android/android_device.dart @@ -654,6 +654,8 @@ class AndroidDevice extends Device { ...['--ez', 'dump-skp-on-shader-compilation', 'true'], if (debuggingOptions.cacheSkSL) ...['--ez', 'cache-sksl', 'true'], + if (debuggingOptions.purgePersistentCache) + ...['--ez', 'purge-persistent-cache', 'true'], if (debuggingOptions.debuggingEnabled) ...[ if (debuggingOptions.buildInfo.isDebug) ...[ ...['--ez', 'enable-checked-mode', 'true'], diff --git a/packages/flutter_tools/lib/src/commands/drive.dart b/packages/flutter_tools/lib/src/commands/drive.dart index ef8313d36c..ad0876f07a 100644 --- a/packages/flutter_tools/lib/src/commands/drive.dart +++ b/packages/flutter_tools/lib/src/commands/drive.dart @@ -493,6 +493,7 @@ Future _startApp( verboseSystemLogs: command.verboseSystemLogs, cacheSkSL: command.cacheSkSL, dumpSkpOnShaderCompilation: command.dumpSkpOnShaderCompilation, + purgePersistentCache: command.purgePersistentCache, ), platformArgs: platformArgs, prebuiltApplication: !command.shouldBuild, diff --git a/packages/flutter_tools/lib/src/commands/run.dart b/packages/flutter_tools/lib/src/commands/run.dart index f98a03b894..6419aa8b18 100644 --- a/packages/flutter_tools/lib/src/commands/run.dart +++ b/packages/flutter_tools/lib/src/commands/run.dart @@ -52,6 +52,13 @@ abstract class RunCommandBase extends FlutterCommand with DeviceBasedDevelopment 'By default, this is not enabled to reduce the overhead. ' 'This is only available in profile or debug build. ', ) + ..addFlag('purge-persistent-cache', + negatable: false, + help: 'Removes all existing persistent caches. This allows reproducing ' + 'shader compilation jank that normally only happens the first time ' + 'an app is run, or for reliable testing of compilation jank fixes ' + '(e.g. shader warm-up).', + ) ..addOption('route', help: 'Which route to load when running the app.', ) @@ -74,6 +81,7 @@ abstract class RunCommandBase extends FlutterCommand with DeviceBasedDevelopment bool get traceStartup => boolArg('trace-startup'); bool get cacheSkSL => boolArg('cache-sksl'); bool get dumpSkpOnShaderCompilation => boolArg('dump-skp-on-shader-compilation'); + bool get purgePersistentCache => boolArg('purge-persistent-cache'); String get route => stringArg('route'); } @@ -397,6 +405,7 @@ class RunCommand extends RunCommandBase { endlessTraceBuffer: boolArg('endless-trace-buffer'), dumpSkpOnShaderCompilation: dumpSkpOnShaderCompilation, cacheSkSL: cacheSkSL, + purgePersistentCache: purgePersistentCache, deviceVmServicePort: deviceVmservicePort, hostVmServicePort: hostVmservicePort, verboseSystemLogs: boolArg('verbose-system-logs'), diff --git a/packages/flutter_tools/lib/src/device.dart b/packages/flutter_tools/lib/src/device.dart index 848e5cc10f..899539098a 100644 --- a/packages/flutter_tools/lib/src/device.dart +++ b/packages/flutter_tools/lib/src/device.dart @@ -774,6 +774,7 @@ class DebuggingOptions { this.endlessTraceBuffer = false, this.dumpSkpOnShaderCompilation = false, this.cacheSkSL = false, + this.purgePersistentCache = false, this.useTestFonts = false, this.verboseSystemLogs = false, this.hostVmServicePort, @@ -814,6 +815,7 @@ class DebuggingOptions { traceSystrace = false, endlessTraceBuffer = false, dumpSkpOnShaderCompilation = false, + purgePersistentCache = false, verboseSystemLogs = false, hostVmServicePort = null, deviceVmServicePort = null, @@ -836,6 +838,7 @@ class DebuggingOptions { final bool endlessTraceBuffer; final bool dumpSkpOnShaderCompilation; final bool cacheSkSL; + final bool purgePersistentCache; final bool useTestFonts; final bool verboseSystemLogs; /// Whether to invoke webOnlyInitializePlatform in Flutter for web. diff --git a/packages/flutter_tools/lib/src/ios/devices.dart b/packages/flutter_tools/lib/src/ios/devices.dart index a0cc61e6c2..056c857f68 100644 --- a/packages/flutter_tools/lib/src/ios/devices.dart +++ b/packages/flutter_tools/lib/src/ios/devices.dart @@ -383,6 +383,7 @@ class IOSDevice extends Device { if (debuggingOptions.dumpSkpOnShaderCompilation) '--dump-skp-on-shader-compilation', if (debuggingOptions.verboseSystemLogs) '--verbose-logging', if (debuggingOptions.cacheSkSL) '--cache-sksl', + if (debuggingOptions.purgePersistentCache) '--purge-persistent-cache', if (platformArgs['trace-startup'] as bool ?? false) '--trace-startup', ]; diff --git a/packages/flutter_tools/test/commands.shard/hermetic/drive_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/drive_test.dart index 8113fcc5cd..8a36a9efc2 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/drive_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/drive_test.dart @@ -619,6 +619,11 @@ void main() { '--cache-sksl', () => debuggingOptions.cacheSkSL, ); + + testOptionThatDefaultsToFalse( + '--purge-persistent-cache', + () => debuggingOptions.purgePersistentCache, + ); }); }); diff --git a/packages/flutter_tools/test/general.shard/android/android_device_start_test.dart b/packages/flutter_tools/test/general.shard/android/android_device_start_test.dart index 56b6450bf8..7218cac2f0 100644 --- a/packages/flutter_tools/test/general.shard/android/android_device_start_test.dart +++ b/packages/flutter_tools/test/general.shard/android/android_device_start_test.dart @@ -249,6 +249,7 @@ void main() { '--ez', 'endless-trace-buffer', 'true', '--ez', 'dump-skp-on-shader-compilation', 'true', '--ez', 'cache-sksl', 'true', + '--ez', 'purge-persistent-cache', 'true', '--ez', 'enable-checked-mode', 'true', '--ez', 'verify-entry-points', 'true', '--ez', 'start-paused', 'true', @@ -277,6 +278,7 @@ void main() { endlessTraceBuffer: true, dumpSkpOnShaderCompilation: true, cacheSkSL: true, + purgePersistentCache: true, useTestFonts: true, verboseSystemLogs: true, ), diff --git a/packages/flutter_tools/test/general.shard/ios/ios_device_start_prebuilt_test.dart b/packages/flutter_tools/test/general.shard/ios/ios_device_start_prebuilt_test.dart index 43791fb448..9b56f45f76 100644 --- a/packages/flutter_tools/test/general.shard/ios/ios_device_start_prebuilt_test.dart +++ b/packages/flutter_tools/test/general.shard/ios/ios_device_start_prebuilt_test.dart @@ -329,6 +329,7 @@ void main() { '--dump-skp-on-shader-compilation', '--verbose-logging', '--cache-sksl', + '--purge-persistent-cache', ].join(' '), ], environment: const { 'PATH': '/usr/bin:null', @@ -382,6 +383,7 @@ void main() { endlessTraceBuffer: true, dumpSkpOnShaderCompilation: true, cacheSkSL: true, + purgePersistentCache: true, verboseSystemLogs: true, ), platformArgs: {},