From 9543366eabffd49df9a181f3b1c244af71b877cb Mon Sep 17 00:00:00 2001 From: John McCutchan Date: Tue, 9 Aug 2016 11:27:12 -0700 Subject: [PATCH] Send asset evictions notices to Flutter framework (#5303) --- packages/flutter_tools/lib/src/devfs.dart | 11 ++++++++++- packages/flutter_tools/lib/src/hot.dart | 16 ++++++++++++++++ packages/flutter_tools/lib/src/observatory.dart | 7 +++++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/packages/flutter_tools/lib/src/devfs.dart b/packages/flutter_tools/lib/src/devfs.dart index ca5b8fd3c49..bc37079ee30 100644 --- a/packages/flutter_tools/lib/src/devfs.dart +++ b/packages/flutter_tools/lib/src/devfs.dart @@ -27,6 +27,7 @@ class DevFSEntry { final String devicePath; final AssetBundleEntry bundleEntry; + String get assetPath => bundleEntry.archivePath; final File file; FileStat _fileStat; @@ -71,6 +72,8 @@ class DevFSEntry { bool get _isSourceEntry => file == null; + bool get _isAssetEntry => bundleEntry != null; + Future> contentsAsBytes() async { if (_isSourceEntry) return bundleEntry.contentsAsBytes(); @@ -246,6 +249,7 @@ class DevFS { final Map _entries = {}; final Set _dirtyEntries = new Set(); final Set _deletedEntries = new Set(); + final Set dirtyAssetEntries = new Set(); final List> _pendingOperations = new List>(); @@ -276,6 +280,8 @@ class DevFS { _dirtyEntries.clear(); // Clear the deleted entries list. _deletedEntries.clear(); + // Clear the dirty asset entries. + dirtyAssetEntries.clear(); } Future update({ DevFSProgressReporter progressReporter, @@ -422,8 +428,11 @@ class DevFS { } bool needsWrite = entry.isModified; if (needsWrite) { - if (_dirtyEntries.add(entry)) + if (_dirtyEntries.add(entry)) { _bytes += entry.size; + if (entry._isAssetEntry) + dirtyAssetEntries.add(entry); + } } } diff --git a/packages/flutter_tools/lib/src/hot.dart b/packages/flutter_tools/lib/src/hot.dart index 3b69b2d8711..8dbdb591fef 100644 --- a/packages/flutter_tools/lib/src/hot.dart +++ b/packages/flutter_tools/lib/src/hot.dart @@ -272,6 +272,21 @@ class HotRunner extends ResidentRunner { return true; } + Future _evictDirtyAssets() async { + if (_devFS == null) { + return; + } + if (_devFS.dirtyAssetEntries.length == 0) { + return; + } + if (serviceProtocol.firstIsolateId == null) + throw 'Application isolate not found'; + for (DevFSEntry entry in _devFS.dirtyAssetEntries) { + await serviceProtocol.flutterEvictAsset(serviceProtocol.firstIsolateId, + entry.assetPath); + } + } + Future _cleanupDevFS() async { if (_devFS != null) { // Cleanup the devFS. @@ -384,6 +399,7 @@ class HotRunner extends ResidentRunner { printError('Hot reload failed:\n$errorMessage'); return false; } + await _evictDirtyAssets(); Status reassembleStatus = logger.startProgress('Reassembling application...'); try { diff --git a/packages/flutter_tools/lib/src/observatory.dart b/packages/flutter_tools/lib/src/observatory.dart index 07965509494..bcbb52d2d03 100644 --- a/packages/flutter_tools/lib/src/observatory.dart +++ b/packages/flutter_tools/lib/src/observatory.dart @@ -267,6 +267,13 @@ class Observatory { }).then((dynamic result) => new Response(result)); } + Future flutterEvictAsset(String isolateId, String assetPath) { + return peer.sendRequest('ext.flutter.evict', { + 'isolateId': isolateId, + 'value': assetPath + }).then((dynamic result) => new Response(result)); + } + Future flutterExit(String isolateId) { return peer .sendRequest('ext.flutter.exit', { 'isolateId': isolateId })