From 164dae3bf1fd33ffe09cca53500fb86143db89ba Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Tue, 26 Mar 2019 10:01:22 -0700 Subject: [PATCH] Revert "Lazy cache 4 (#29785)" (#29985) --- .../flutter_tools/lib/src/base/build.dart | 3 +- packages/flutter_tools/lib/src/cache.dart | 454 ++++++------------ .../lib/src/commands/analyze.dart | 5 - .../lib/src/commands/build_web.dart | 8 +- .../lib/src/commands/create.dart | 2 +- .../lib/src/commands/ide_config.dart | 2 +- .../lib/src/commands/precache.dart | 28 +- packages/flutter_tools/lib/src/compile.dart | 3 +- packages/flutter_tools/lib/src/doctor.dart | 4 +- .../lib/src/runner/flutter_command.dart | 18 +- packages/flutter_tools/test/cache_test.dart | 24 +- .../test/runner/flutter_command_test.dart | 2 +- 12 files changed, 190 insertions(+), 363 deletions(-) diff --git a/packages/flutter_tools/lib/src/base/build.dart b/packages/flutter_tools/lib/src/base/build.dart index 86dc3b406b..d7c406d5df 100644 --- a/packages/flutter_tools/lib/src/base/build.dart +++ b/packages/flutter_tools/lib/src/base/build.dart @@ -85,6 +85,7 @@ class AOTSnapshotter { if (fs.file('pubspec.yaml').existsSync()) { flutterProject = await FlutterProject.current(); } + final FlutterEngine engine = FlutterEngine(cache); if (!_isValidAotPlatform(platform, buildMode)) { printError('${getNameForTargetPlatform(platform)} does not support AOT compilation.'); return 1; @@ -186,7 +187,7 @@ class AOTSnapshotter { 'entryPoint': mainPath, 'sharedLib': buildSharedLibrary.toString(), 'extraGenSnapshotOptions': extraGenSnapshotOptions.join(' '), - 'engineHash': Cache.instance.engineRevision, + 'engineHash': engine.version, 'buildersUsed': '${flutterProject != null ? flutterProject.hasBuilders : false}', }, depfilePaths: [], diff --git a/packages/flutter_tools/lib/src/cache.dart b/packages/flutter_tools/lib/src/cache.dart index 99d9cf41c1..618b55c95d 100644 --- a/packages/flutter_tools/lib/src/cache.dart +++ b/packages/flutter_tools/lib/src/cache.dart @@ -15,30 +15,6 @@ import 'base/os.dart'; import 'base/platform.dart'; import 'globals.dart'; -/// A tag for a set of development artifacts that need to be cached. -enum DevelopmentArtifact { - /// Artifacts required for Android development. - android, - - /// Artifacts required for iOS development. - iOS, - - /// Artifacts required for web development, - web, - - /// Artifacts required for desktop macOS. - macOS, - - /// Artifacts required for desktop Windows. - windows, - - /// Artifacts required for desktop linux. - linux, - - /// Artifacts required by all developments. - universal, -} - /// A wrapper around the `bin/cache/` directory. class Cache { /// [rootOverride] is configurable for testing. @@ -46,11 +22,9 @@ class Cache { Cache({ Directory rootOverride, List artifacts }) : _rootOverride = rootOverride { if (artifacts == null) { _artifacts.add(MaterialFonts(this)); - _artifacts.add(AndroidEngineArtifacts(this)); - _artifacts.add(IOSEngineArtifacts(this)); + _artifacts.add(FlutterEngine(this)); _artifacts.add(GradleWrapper(this)); _artifacts.add(FlutterWebSdk(this)); - _artifacts.add(FlutterSdk(this)); } else { _artifacts.addAll(artifacts); } @@ -220,7 +194,7 @@ class Cache { return isOlderThanReference(entity: entity, referenceFile: flutterToolsStamp); } - bool isUpToDate(Set requiredArtifacts) => _artifacts.every((CachedArtifact artifact) => artifact.isUpToDate(requiredArtifacts)); + bool isUpToDate() => _artifacts.every((CachedArtifact artifact) => artifact.isUpToDate()); Future getThirdPartyFile(String urlStr, String serviceName) async { final Uri url = Uri.parse(urlStr); @@ -243,16 +217,13 @@ class Cache { return cachedFile.path; } - /// Update the cache to contain all `requiredArtifacts`. - Future updateAll(Set requiredArtifacts) async { - if (!_lockEnabled) { + Future updateAll() async { + if (!_lockEnabled) return; - } try { for (CachedArtifact artifact in _artifacts) { - if (!artifact.isUpToDate(requiredArtifacts)) { + if (!artifact.isUpToDate()) await artifact.update(); - } } } on SocketException catch (e) { if (_hostsBlockedInChina.contains(e.address?.host)) { @@ -266,34 +237,15 @@ class Cache { rethrow; } } - - Future areRemoteArtifactsAvailable({ - String engineVersion, - bool includeAllPlatforms = true, - }) async { - final bool includeAllPlatformsState = cache.includeAllPlatforms; - bool allAvailible = true; - cache.includeAllPlatforms = includeAllPlatforms; - for (CachedArtifact cachedArtifact in _artifacts) { - if (cachedArtifact is EngineCachedArtifact) { - allAvailible &= await cachedArtifact.checkForArtifacts(engineVersion); - } - } - cache.includeAllPlatforms = includeAllPlatformsState; - return allAvailible; - } } /// An artifact managed by the cache. abstract class CachedArtifact { - CachedArtifact(this.name, this.cache, this.developmentArtifacts); + CachedArtifact(this.name, this.cache); final String name; final Cache cache; - /// All development artifacts this cache provides. - final Set developmentArtifacts; - Directory get location => cache.getArtifactDirectory(name); String get version => cache.getVersionFor(name); @@ -303,25 +255,18 @@ abstract class CachedArtifact { /// starting from scratch. final List _downloadedFiles = []; - bool isUpToDate(Set requiredArtifacts) { - // If the set of required artifacts does not include any from this cache, - // then we can claim we are up to date to skip downloading. - if (!requiredArtifacts.any(developmentArtifacts.contains)) { - return true; - } - if (!location.existsSync()) { + bool isUpToDate() { + if (!location.existsSync()) return false; - } - if (version != cache.getStampFor(name)) { + if (version != cache.getStampFor(name)) return false; - } return isUpToDateInner(); } Future update() async { - if (!location.existsSync()) { - location.createSync(recursive: true); - } + if (location.existsSync()) + location.deleteSync(recursive: true); + location.createSync(recursive: true); await updateInner(); cache.setStampFor(name, version); _removeDownloadedFiles(); @@ -410,11 +355,7 @@ void _maybeWarnAboutStorageOverride(String overrideUrl) { /// A cached artifact containing fonts used for Material Design. class MaterialFonts extends CachedArtifact { - MaterialFonts(Cache cache) : super( - 'material_fonts', - cache, - const { DevelopmentArtifact.universal }, - ); + MaterialFonts(Cache cache) : super('material_fonts', cache); @override Future updateInner() { @@ -428,11 +369,7 @@ class MaterialFonts extends CachedArtifact { /// /// This SDK references code within the regular Dart sdk to reduce download size. class FlutterWebSdk extends CachedArtifact { - FlutterWebSdk(Cache cache) : super( - 'flutter_web_sdk', - cache, - const { DevelopmentArtifact.web }, - ); + FlutterWebSdk(Cache cache) : super('flutter_web_sdk', cache); @override Directory get location => cache.getWebSdkDirectory(); @@ -468,37 +405,130 @@ class FlutterWebSdk extends CachedArtifact { } } -abstract class EngineCachedArtifact extends CachedArtifact { - EngineCachedArtifact( - Cache cache, - Set requiredArtifacts, - ) : super('engine', cache, requiredArtifacts); +/// A cached artifact containing the Flutter engine binaries. +class FlutterEngine extends CachedArtifact { + FlutterEngine(Cache cache) : super('engine', cache); - /// Return a list of (directory path, download URL path) tuples. - List> getBinaryDirs(); + List _getPackageDirs() => const ['sky_engine']; - /// A list of cache directory paths to which the LICENSE file should be copied. - List getLicenseDirs(); + // Return a list of (cache directory path, download URL path) tuples. + List> _getBinaryDirs() { + final List> binaryDirs = >[]; - /// A list of the dart package directories to download. - List getPackageDirs(); + binaryDirs.add(['common', 'flutter_patched_sdk.zip']); + + if (cache.includeAllPlatforms) + binaryDirs + ..addAll(_osxBinaryDirs) + ..addAll(_linuxBinaryDirs) + ..addAll(_windowsBinaryDirs) + ..addAll(_androidBinaryDirs) + ..addAll(_iosBinaryDirs) + ..addAll(_dartSdks); + else if (platform.isLinux) + binaryDirs + ..addAll(_linuxBinaryDirs) + ..addAll(_androidBinaryDirs); + else if (platform.isMacOS) + binaryDirs + ..addAll(_osxBinaryDirs) + ..addAll(_androidBinaryDirs) + ..addAll(_iosBinaryDirs); + else if (platform.isWindows) + binaryDirs + ..addAll(_windowsBinaryDirs) + ..addAll(_androidBinaryDirs); + + return binaryDirs; + } + + List> get _osxBinaryDirs => >[ + ['darwin-x64', 'darwin-x64/artifacts.zip'], + ['android-arm-profile/darwin-x64', 'android-arm-profile/darwin-x64.zip'], + ['android-arm-release/darwin-x64', 'android-arm-release/darwin-x64.zip'], + ['android-arm64-profile/darwin-x64', 'android-arm64-profile/darwin-x64.zip'], + ['android-arm64-release/darwin-x64', 'android-arm64-release/darwin-x64.zip'], + ['android-arm-dynamic-profile/darwin-x64', 'android-arm-dynamic-profile/darwin-x64.zip'], + ['android-arm-dynamic-release/darwin-x64', 'android-arm-dynamic-release/darwin-x64.zip'], + ['android-arm64-dynamic-profile/darwin-x64', 'android-arm64-dynamic-profile/darwin-x64.zip'], + ['android-arm64-dynamic-release/darwin-x64', 'android-arm64-dynamic-release/darwin-x64.zip'], + ]; + + List> get _linuxBinaryDirs => >[ + ['linux-x64', 'linux-x64/artifacts.zip'], + ['android-arm-profile/linux-x64', 'android-arm-profile/linux-x64.zip'], + ['android-arm-release/linux-x64', 'android-arm-release/linux-x64.zip'], + ['android-arm64-profile/linux-x64', 'android-arm64-profile/linux-x64.zip'], + ['android-arm64-release/linux-x64', 'android-arm64-release/linux-x64.zip'], + ['android-arm-dynamic-profile/linux-x64', 'android-arm-dynamic-profile/linux-x64.zip'], + ['android-arm-dynamic-release/linux-x64', 'android-arm-dynamic-release/linux-x64.zip'], + ['android-arm64-dynamic-profile/linux-x64', 'android-arm64-dynamic-profile/linux-x64.zip'], + ['android-arm64-dynamic-release/linux-x64', 'android-arm64-dynamic-release/linux-x64.zip'], + ]; + + List> get _windowsBinaryDirs => >[ + ['windows-x64', 'windows-x64/artifacts.zip'], + ['android-arm-profile/windows-x64', 'android-arm-profile/windows-x64.zip'], + ['android-arm-release/windows-x64', 'android-arm-release/windows-x64.zip'], + ['android-arm64-profile/windows-x64', 'android-arm64-profile/windows-x64.zip'], + ['android-arm64-release/windows-x64', 'android-arm64-release/windows-x64.zip'], + ['android-arm-dynamic-profile/windows-x64', 'android-arm-dynamic-profile/windows-x64.zip'], + ['android-arm-dynamic-release/windows-x64', 'android-arm-dynamic-release/windows-x64.zip'], + ['android-arm64-dynamic-profile/windows-x64', 'android-arm64-dynamic-profile/windows-x64.zip'], + ['android-arm64-dynamic-release/windows-x64', 'android-arm64-dynamic-release/windows-x64.zip'], + ]; + + List> get _androidBinaryDirs => >[ + ['android-x86', 'android-x86/artifacts.zip'], + ['android-x64', 'android-x64/artifacts.zip'], + ['android-arm', 'android-arm/artifacts.zip'], + ['android-arm-profile', 'android-arm-profile/artifacts.zip'], + ['android-arm-release', 'android-arm-release/artifacts.zip'], + ['android-arm64', 'android-arm64/artifacts.zip'], + ['android-arm64-profile', 'android-arm64-profile/artifacts.zip'], + ['android-arm64-release', 'android-arm64-release/artifacts.zip'], + ['android-arm-dynamic-profile', 'android-arm-dynamic-profile/artifacts.zip'], + ['android-arm-dynamic-release', 'android-arm-dynamic-release/artifacts.zip'], + ['android-arm64-dynamic-profile', 'android-arm64-dynamic-profile/artifacts.zip'], + ['android-arm64-dynamic-release', 'android-arm64-dynamic-release/artifacts.zip'], + ]; + + List> get _iosBinaryDirs => >[ + ['ios', 'ios/artifacts.zip'], + ['ios-profile', 'ios-profile/artifacts.zip'], + ['ios-release', 'ios-release/artifacts.zip'], + ]; + + List> get _dartSdks => > [ + ['darwin-x64', 'dart-sdk-darwin-x64.zip'], + ['linux-x64', 'dart-sdk-linux-x64.zip'], + ['windows-x64', 'dart-sdk-windows-x64.zip'], + ]; + + // A list of cache directory paths to which the LICENSE file should be copied. + List _getLicenseDirs() { + if (cache.includeAllPlatforms || platform.isMacOS) { + return const ['ios', 'ios-profile', 'ios-release']; + } + return const []; + } @override bool isUpToDateInner() { final Directory pkgDir = cache.getCacheDir('pkg'); - for (String pkgName in getPackageDirs()) { + for (String pkgName in _getPackageDirs()) { final String pkgPath = fs.path.join(pkgDir.path, pkgName); if (!fs.directory(pkgPath).existsSync()) return false; } - for (List toolsDir in getBinaryDirs()) { + for (List toolsDir in _getBinaryDirs()) { final Directory dir = fs.directory(fs.path.join(location.path, toolsDir[0])); if (!dir.existsSync()) return false; } - for (String licenseDir in getLicenseDirs()) { + for (String licenseDir in _getLicenseDirs()) { final File file = fs.file(fs.path.join(location.path, licenseDir, 'LICENSE')); if (!file.existsSync()) return false; @@ -511,16 +541,15 @@ abstract class EngineCachedArtifact extends CachedArtifact { final String url = '$_storageBaseUrl/flutter_infra/flutter/$version/'; final Directory pkgDir = cache.getCacheDir('pkg'); - for (String pkgName in getPackageDirs()) { + for (String pkgName in _getPackageDirs()) { final String pkgPath = fs.path.join(pkgDir.path, pkgName); final Directory dir = fs.directory(pkgPath); - if (dir.existsSync()) { + if (dir.existsSync()) dir.deleteSync(recursive: true); - } await _downloadZipArchive('Downloading package $pkgName...', Uri.parse(url + pkgName + '.zip'), pkgDir); } - for (List toolsDir in getBinaryDirs()) { + for (List toolsDir in _getBinaryDirs()) { final String cacheDir = toolsDir[0]; final String urlPath = toolsDir[1]; final Directory dir = fs.directory(fs.path.join(location.path, cacheDir)); @@ -537,35 +566,48 @@ abstract class EngineCachedArtifact extends CachedArtifact { } final File licenseSource = fs.file(fs.path.join(Cache.flutterRoot, 'LICENSE')); - for (String licenseDir in getLicenseDirs()) { + for (String licenseDir in _getLicenseDirs()) { final String licenseDestinationPath = fs.path.join(location.path, licenseDir, 'LICENSE'); await licenseSource.copy(licenseDestinationPath); } } - Future checkForArtifacts(String engineVersion) async { - engineVersion ??= version; - final String url = '$_storageBaseUrl/flutter_infra/flutter/$engineVersion/'; + Future areRemoteArtifactsAvailable({ + String engineVersion, + bool includeAllPlatforms = true, + }) async { + final bool includeAllPlatformsState = cache.includeAllPlatforms; + cache.includeAllPlatforms = includeAllPlatforms; - bool exists = false; - for (String pkgName in getPackageDirs()) { - exists = await _doesRemoteExist('Checking package $pkgName is available...', - Uri.parse(url + pkgName + '.zip')); - if (!exists) { - return false; + Future checkForArtifacts(String engineVersion) async { + engineVersion ??= version; + final String url = '$_storageBaseUrl/flutter_infra/flutter/$engineVersion/'; + + bool exists = false; + for (String pkgName in _getPackageDirs()) { + exists = await _doesRemoteExist('Checking package $pkgName is available...', + Uri.parse(url + pkgName + '.zip')); + if (!exists) { + return false; + } } + + for (List toolsDir in _getBinaryDirs()) { + final String cacheDir = toolsDir[0]; + final String urlPath = toolsDir[1]; + exists = await _doesRemoteExist('Checking $cacheDir tools are available...', + Uri.parse(url + urlPath)); + if (!exists) { + return false; + } + } + + return true; } - for (List toolsDir in getBinaryDirs()) { - final String cacheDir = toolsDir[0]; - final String urlPath = toolsDir[1]; - exists = await _doesRemoteExist('Checking $cacheDir tools are available...', - Uri.parse(url + urlPath)); - if (!exists) { - return false; - } - } - return true; + final bool result = await checkForArtifacts(engineVersion); + cache.includeAllPlatforms = includeAllPlatformsState; + return result; } @@ -580,123 +622,9 @@ abstract class EngineCachedArtifact extends CachedArtifact { } } - -/// A cached artifact containing the dart:ui source code. -class FlutterSdk extends EngineCachedArtifact { - FlutterSdk(Cache cache) : super( - cache, - const { DevelopmentArtifact.universal }, - ); - - @override - List getPackageDirs() => const ['sky_engine']; - - @override - List> getBinaryDirs() { - final List> binaryDirs = >[ - ['common', 'flutter_patched_sdk.zip'], - ]; - if (cache.includeAllPlatforms) { - binaryDirs.addAll(>[ - ['windows-x64', 'windows-x64/artifacts.zip'], - ['linux-x64', 'linux-x64/artifacts.zip'], - ['darwin-x64', 'darwin-x64/artifacts.zip'], - ]); - } else if (platform.isWindows) { - binaryDirs.addAll(>[ - ['windows-x64', 'windows-x64/artifacts.zip'], - ]); - } else if (platform.isMacOS) { - binaryDirs.addAll(>[ - ['darwin-x64', 'darwin-x64/artifacts.zip'], - ]); - } else if (platform.isLinux) { - binaryDirs.addAll(>[ - ['linux-x64', 'linux-x64/artifacts.zip'], - ]); - } - return binaryDirs; - } - - @override - List getLicenseDirs() => const []; -} - -class AndroidEngineArtifacts extends EngineCachedArtifact { - AndroidEngineArtifacts(Cache cache) : super( - cache, - const { DevelopmentArtifact.android }, - ); - - @override - List getPackageDirs() => const []; - - @override - List> getBinaryDirs() { - final List> binaryDirs = >[]; - if (cache.includeAllPlatforms) { - binaryDirs - ..addAll(_osxBinaryDirs) - ..addAll(_linuxBinaryDirs) - ..addAll(_windowsBinaryDirs) - ..addAll(_androidBinaryDirs) - ..addAll(_dartSdks); - } else if (platform.isWindows) { - binaryDirs - ..addAll(_windowsBinaryDirs) - ..addAll(_androidBinaryDirs); - } else if (platform.isMacOS) { - binaryDirs - ..addAll(_osxBinaryDirs) - ..addAll(_androidBinaryDirs); - } else if (platform.isLinux) { - binaryDirs - ..addAll(_linuxBinaryDirs) - ..addAll(_androidBinaryDirs); - } - return binaryDirs; - } - - @override - List getLicenseDirs() { return []; } -} - -class IOSEngineArtifacts extends EngineCachedArtifact { - IOSEngineArtifacts(Cache cache) : super( - cache, - { DevelopmentArtifact.iOS }, - ); - - @override - List> getBinaryDirs() { - final List> binaryDirs = >[]; - if (platform.isMacOS || cache.includeAllPlatforms) { - binaryDirs.addAll(_iosBinaryDirs); - } - return binaryDirs; - } - - @override - List getLicenseDirs() { - if (cache.includeAllPlatforms || platform.isMacOS) { - return const ['ios', 'ios-profile', 'ios-release']; - } - return const []; - } - - @override - List getPackageDirs() { - return []; - } -} - /// A cached artifact containing Gradle Wrapper scripts and binaries. class GradleWrapper extends CachedArtifact { - GradleWrapper(Cache cache) : super( - 'gradle_wrapper', - cache, - const { DevelopmentArtifact.android }, - ); + GradleWrapper(Cache cache) : super('gradle_wrapper', cache); List get _gradleScripts => ['gradlew', 'gradlew.bat']; @@ -716,9 +644,8 @@ class GradleWrapper extends CachedArtifact { @override bool isUpToDateInner() { final Directory wrapperDir = cache.getCacheDir(fs.path.join('artifacts', 'gradle_wrapper')); - if (!fs.directory(wrapperDir).existsSync()) { + if (!fs.directory(wrapperDir).existsSync()) return false; - } for (String scriptName in _gradleScripts) { final File scriptFile = fs.file(fs.path.join(wrapperDir.path, scriptName)); if (!scriptFile.existsSync()) @@ -779,67 +706,6 @@ Future _doesRemoteExist(String message, Uri url) async { /// Create the given [directory] and parents, as necessary. void _ensureExists(Directory directory) { - if (!directory.existsSync()) { + if (!directory.existsSync()) directory.createSync(recursive: true); - } } - -const List> _osxBinaryDirs = >[ - ['android-arm-profile/darwin-x64', 'android-arm-profile/darwin-x64.zip'], - ['android-arm-release/darwin-x64', 'android-arm-release/darwin-x64.zip'], - ['android-arm64-profile/darwin-x64', 'android-arm64-profile/darwin-x64.zip'], - ['android-arm64-release/darwin-x64', 'android-arm64-release/darwin-x64.zip'], - ['android-arm-dynamic-profile/darwin-x64', 'android-arm-dynamic-profile/darwin-x64.zip'], - ['android-arm-dynamic-release/darwin-x64', 'android-arm-dynamic-release/darwin-x64.zip'], - ['android-arm64-dynamic-profile/darwin-x64', 'android-arm64-dynamic-profile/darwin-x64.zip'], - ['android-arm64-dynamic-release/darwin-x64', 'android-arm64-dynamic-release/darwin-x64.zip'], -]; - -const List> _linuxBinaryDirs = >[ - ['android-arm-profile/linux-x64', 'android-arm-profile/linux-x64.zip'], - ['android-arm-release/linux-x64', 'android-arm-release/linux-x64.zip'], - ['android-arm64-profile/linux-x64', 'android-arm64-profile/linux-x64.zip'], - ['android-arm64-release/linux-x64', 'android-arm64-release/linux-x64.zip'], - ['android-arm-dynamic-profile/linux-x64', 'android-arm-dynamic-profile/linux-x64.zip'], - ['android-arm-dynamic-release/linux-x64', 'android-arm-dynamic-release/linux-x64.zip'], - ['android-arm64-dynamic-profile/linux-x64', 'android-arm64-dynamic-profile/linux-x64.zip'], - ['android-arm64-dynamic-release/linux-x64', 'android-arm64-dynamic-release/linux-x64.zip'], -]; - -const List> _windowsBinaryDirs = >[ - ['android-arm-profile/windows-x64', 'android-arm-profile/windows-x64.zip'], - ['android-arm-release/windows-x64', 'android-arm-release/windows-x64.zip'], - ['android-arm64-profile/windows-x64', 'android-arm64-profile/windows-x64.zip'], - ['android-arm64-release/windows-x64', 'android-arm64-release/windows-x64.zip'], - ['android-arm-dynamic-profile/windows-x64', 'android-arm-dynamic-profile/windows-x64.zip'], - ['android-arm-dynamic-release/windows-x64', 'android-arm-dynamic-release/windows-x64.zip'], - ['android-arm64-dynamic-profile/windows-x64', 'android-arm64-dynamic-profile/windows-x64.zip'], - ['android-arm64-dynamic-release/windows-x64', 'android-arm64-dynamic-release/windows-x64.zip'], -]; - -const List> _androidBinaryDirs = >[ - ['android-x86', 'android-x86/artifacts.zip'], - ['android-x64', 'android-x64/artifacts.zip'], - ['android-arm', 'android-arm/artifacts.zip'], - ['android-arm-profile', 'android-arm-profile/artifacts.zip'], - ['android-arm-release', 'android-arm-release/artifacts.zip'], - ['android-arm64', 'android-arm64/artifacts.zip'], - ['android-arm64-profile', 'android-arm64-profile/artifacts.zip'], - ['android-arm64-release', 'android-arm64-release/artifacts.zip'], - ['android-arm-dynamic-profile', 'android-arm-dynamic-profile/artifacts.zip'], - ['android-arm-dynamic-release', 'android-arm-dynamic-release/artifacts.zip'], - ['android-arm64-dynamic-profile', 'android-arm64-dynamic-profile/artifacts.zip'], - ['android-arm64-dynamic-release', 'android-arm64-dynamic-release/artifacts.zip'], -]; - -const List> _iosBinaryDirs = >[ - ['ios', 'ios/artifacts.zip'], - ['ios-profile', 'ios-profile/artifacts.zip'], - ['ios-release', 'ios-release/artifacts.zip'], -]; - -const List> _dartSdks = > [ - ['darwin-x64', 'dart-sdk-darwin-x64.zip'], - ['linux-x64', 'dart-sdk-linux-x64.zip'], - ['windows-x64', 'dart-sdk-windows-x64.zip'], -]; diff --git a/packages/flutter_tools/lib/src/commands/analyze.dart b/packages/flutter_tools/lib/src/commands/analyze.dart index 1a015ae701..5cbc68ba56 100644 --- a/packages/flutter_tools/lib/src/commands/analyze.dart +++ b/packages/flutter_tools/lib/src/commands/analyze.dart @@ -64,11 +64,6 @@ class AnalyzeCommand extends FlutterCommand { @override String get description => "Analyze the project's Dart code."; - @override - Set get requiredArtifacts => const { - DevelopmentArtifact.universal, - }; - @override bool get shouldRunPub { // If they're not analyzing the current project. diff --git a/packages/flutter_tools/lib/src/commands/build_web.dart b/packages/flutter_tools/lib/src/commands/build_web.dart index 42ce09872c..af43d1fd4a 100644 --- a/packages/flutter_tools/lib/src/commands/build_web.dart +++ b/packages/flutter_tools/lib/src/commands/build_web.dart @@ -8,7 +8,7 @@ import '../base/common.dart'; import '../base/logger.dart'; import '../build_info.dart'; import '../globals.dart'; -import '../runner/flutter_command.dart' show DevelopmentArtifact, FlutterCommandResult; +import '../runner/flutter_command.dart' show FlutterCommandResult; import '../web/compile.dart'; import 'build.dart'; @@ -19,12 +19,6 @@ class BuildWebCommand extends BuildSubCommand { defaultBuildMode = BuildMode.release; } - @override - Set get requiredArtifacts => const { - DevelopmentArtifact.universal, - DevelopmentArtifact.web, - }; - @override final String name = 'web'; diff --git a/packages/flutter_tools/lib/src/commands/create.dart b/packages/flutter_tools/lib/src/commands/create.dart index 17fffae8c1..c11fecc01a 100644 --- a/packages/flutter_tools/lib/src/commands/create.dart +++ b/packages/flutter_tools/lib/src/commands/create.dart @@ -245,7 +245,7 @@ class CreateCommand extends FlutterCommand { throwToolExit('Neither the --flutter-root command line flag nor the FLUTTER_ROOT environment ' 'variable was specified. Unable to find package:flutter.', exitCode: 2); - await Cache.instance.updateAll({ DevelopmentArtifact.universal }); + await Cache.instance.updateAll(); final String flutterRoot = fs.path.absolute(Cache.flutterRoot); diff --git a/packages/flutter_tools/lib/src/commands/ide_config.dart b/packages/flutter_tools/lib/src/commands/ide_config.dart index 2a64070add..2e14108c02 100644 --- a/packages/flutter_tools/lib/src/commands/ide_config.dart +++ b/packages/flutter_tools/lib/src/commands/ide_config.dart @@ -223,7 +223,7 @@ class IdeConfigCommand extends FlutterCommand { throwToolExit('Currently, the only supported IDE is IntelliJ\n$usage', exitCode: 2); } - await Cache.instance.updateAll({ DevelopmentArtifact.universal }); + await Cache.instance.updateAll(); if (argResults['update-templates']) { _handleTemplateUpdate(); diff --git a/packages/flutter_tools/lib/src/commands/precache.dart b/packages/flutter_tools/lib/src/commands/precache.dart index 405d8c32e6..b1fc4dcc77 100644 --- a/packages/flutter_tools/lib/src/commands/precache.dart +++ b/packages/flutter_tools/lib/src/commands/precache.dart @@ -4,7 +4,6 @@ import 'dart:async'; -import '../cache.dart'; import '../globals.dart'; import '../runner/flutter_command.dart'; @@ -12,12 +11,6 @@ class PrecacheCommand extends FlutterCommand { PrecacheCommand() { argParser.addFlag('all-platforms', abbr: 'a', negatable: false, help: 'Precache artifacts for all platforms.'); - argParser.addFlag('android', negatable: true, defaultsTo: true, - help: 'Precache artifacts for Android development'); - argParser.addFlag('ios', negatable: true, defaultsTo: true, - help: 'Precache artifacts for iOS developemnt'); - argParser.addFlag('web', negatable: true, defaultsTo: false, - help: 'Precache artifacts for web development'); } @override @@ -31,25 +24,14 @@ class PrecacheCommand extends FlutterCommand { @override Future runCommand() async { - if (argResults['all-platforms']) { + if (argResults['all-platforms']) cache.includeAllPlatforms = true; - } - final Set requiredArtifacts = { DevelopmentArtifact.universal }; - if (argResults['android']) { - requiredArtifacts.add(DevelopmentArtifact.android); - } - if (argResults['ios']) { - requiredArtifacts.add(DevelopmentArtifact.iOS); - } - if (argResults['web']) { - requiredArtifacts.add(DevelopmentArtifact.web); - } - if (cache.isUpToDate(requiredArtifacts)) { + if (cache.isUpToDate()) printStatus('Already up-to-date.'); - } else { - await cache.updateAll(requiredArtifacts); - } + else + await cache.updateAll(); + return null; } } diff --git a/packages/flutter_tools/lib/src/compile.dart b/packages/flutter_tools/lib/src/compile.dart index f2c15f9278..4ba74eb666 100644 --- a/packages/flutter_tools/lib/src/compile.dart +++ b/packages/flutter_tools/lib/src/compile.dart @@ -232,6 +232,7 @@ class KernelCompiler { if (fs.file('pubspec.yaml').existsSync()) { flutterProject = await FlutterProject.current(); } + final FlutterEngine engine = FlutterEngine(cache); // TODO(cbracken): eliminate pathFilter. // Currently the compiler emits buildbot paths for the core libs in the @@ -245,7 +246,7 @@ class KernelCompiler { 'entryPoint': mainPath, 'trackWidgetCreation': trackWidgetCreation.toString(), 'linkPlatformKernelIn': linkPlatformKernelIn.toString(), - 'engineHash': Cache.instance.engineRevision, + 'engineHash': engine.version, 'buildersUsed': '${flutterProject != null ? flutterProject.hasBuilders : false}', }, depfilePaths: [depFilePath], diff --git a/packages/flutter_tools/lib/src/doctor.dart b/packages/flutter_tools/lib/src/doctor.dart index 0e9d7934c7..962bba65c0 100644 --- a/packages/flutter_tools/lib/src/doctor.dart +++ b/packages/flutter_tools/lib/src/doctor.dart @@ -170,7 +170,9 @@ class Doctor { } Future checkRemoteArtifacts(String engineRevision) async { - return Cache.instance.areRemoteArtifactsAvailable(engineVersion: engineRevision); + final Cache cache = Cache(); + final FlutterEngine engine = FlutterEngine(cache); + return await engine.areRemoteArtifactsAvailable(engineVersion: engineRevision); } /// Print information about the state of installed tooling. diff --git a/packages/flutter_tools/lib/src/runner/flutter_command.dart b/packages/flutter_tools/lib/src/runner/flutter_command.dart index 4341b1d6f8..4c80af5a9f 100644 --- a/packages/flutter_tools/lib/src/runner/flutter_command.dart +++ b/packages/flutter_tools/lib/src/runner/flutter_command.dart @@ -19,7 +19,6 @@ import '../base/user_messages.dart'; import '../base/utils.dart'; import '../build_info.dart'; import '../bundle.dart' as bundle; -import '../cache.dart'; import '../dart/package_map.dart'; import '../dart/pub.dart'; import '../device.dart'; @@ -29,8 +28,6 @@ import '../project.dart'; import '../usage.dart'; import 'flutter_command_runner.dart'; -export '../cache.dart' show DevelopmentArtifact; - enum ExitStatus { success, warning, @@ -533,9 +530,8 @@ abstract class FlutterCommand extends Command { // Populate the cache. We call this before pub get below so that the sky_engine // package is available in the flutter cache for pub to find. - if (shouldUpdateCache) { - await cache.updateAll(requiredArtifacts); - } + if (shouldUpdateCache) + await cache.updateAll(); if (shouldRunPub) { await pubGet(context: PubContext.getVerifyContext(name)); @@ -553,16 +549,6 @@ abstract class FlutterCommand extends Command { return await runCommand(); } - /// The set of development artifacts required for this command. - /// - /// Defaults to [DevelopmentArtifact.universal], - /// [DevelopmentArtifact.android], and [DevelopmentArtifact.iOS]. - Set get requiredArtifacts => const { - DevelopmentArtifact.universal, - DevelopmentArtifact.iOS, - DevelopmentArtifact.android, - }; - /// Subclasses must implement this to execute the command. /// Optionally provide a [FlutterCommandResult] to send more details about the /// execution for analytics. diff --git a/packages/flutter_tools/test/cache_test.dart b/packages/flutter_tools/test/cache_test.dart index cb75ede5a4..1e7916f361 100644 --- a/packages/flutter_tools/test/cache_test.dart +++ b/packages/flutter_tools/test/cache_test.dart @@ -84,34 +84,34 @@ void main() { test('should not be up to date, if some cached artifact is not', () { final CachedArtifact artifact1 = MockCachedArtifact(); final CachedArtifact artifact2 = MockCachedArtifact(); - when(artifact1.isUpToDate(const {})).thenReturn(true); - when(artifact2.isUpToDate(const {})).thenReturn(false); + when(artifact1.isUpToDate()).thenReturn(true); + when(artifact2.isUpToDate()).thenReturn(false); final Cache cache = Cache(artifacts: [artifact1, artifact2]); - expect(cache.isUpToDate(const {}), isFalse); + expect(cache.isUpToDate(), isFalse); }); test('should be up to date, if all cached artifacts are', () { final CachedArtifact artifact1 = MockCachedArtifact(); final CachedArtifact artifact2 = MockCachedArtifact(); - when(artifact1.isUpToDate(const {})).thenReturn(true); - when(artifact2.isUpToDate(const {})).thenReturn(true); + when(artifact1.isUpToDate()).thenReturn(true); + when(artifact2.isUpToDate()).thenReturn(true); final Cache cache = Cache(artifacts: [artifact1, artifact2]); - expect(cache.isUpToDate(const {}), isTrue); + expect(cache.isUpToDate(), isTrue); }); test('should update cached artifacts which are not up to date', () async { final CachedArtifact artifact1 = MockCachedArtifact(); final CachedArtifact artifact2 = MockCachedArtifact(); - when(artifact1.isUpToDate(const {})).thenReturn(true); - when(artifact2.isUpToDate(const {})).thenReturn(false); + when(artifact1.isUpToDate()).thenReturn(true); + when(artifact2.isUpToDate()).thenReturn(false); final Cache cache = Cache(artifacts: [artifact1, artifact2]); - await cache.updateAll(const {}); + await cache.updateAll(); verifyNever(artifact1.update()); verify(artifact2.update()); }); testUsingContext('failed storage.googleapis.com download shows China warning', () async { final CachedArtifact artifact1 = MockCachedArtifact(); final CachedArtifact artifact2 = MockCachedArtifact(); - when(artifact1.isUpToDate(const {})).thenReturn(false); - when(artifact2.isUpToDate(const {})).thenReturn(false); + when(artifact1.isUpToDate()).thenReturn(false); + when(artifact2.isUpToDate()).thenReturn(false); final MockInternetAddress address = MockInternetAddress(); when(address.host).thenReturn('storage.googleapis.com'); when(artifact1.update()).thenThrow(SocketException( @@ -120,7 +120,7 @@ void main() { )); final Cache cache = Cache(artifacts: [artifact1, artifact2]); try { - await cache.updateAll(const {}); + await cache.updateAll(); fail('Mock thrown exception expected'); } catch (e) { verify(artifact1.update()); diff --git a/packages/flutter_tools/test/runner/flutter_command_test.dart b/packages/flutter_tools/test/runner/flutter_command_test.dart index e1cfc2ac7b..f98371a095 100644 --- a/packages/flutter_tools/test/runner/flutter_command_test.dart +++ b/packages/flutter_tools/test/runner/flutter_command_test.dart @@ -42,7 +42,7 @@ void main() { testUsingContext('honors shouldUpdateCache true', () async { final DummyFlutterCommand flutterCommand = DummyFlutterCommand(shouldUpdateCache: true); await flutterCommand.run(); - verify(cache.updateAll(any)).called(1); + verify(cache.updateAll()).called(1); }, overrides: { Cache: () => cache,