Unverified Commit ca82c572 authored by xster's avatar xster Committed by GitHub

Revert "let NOTICES be double gzip wrapped to reduce on-disk installed space (#71899)" (#72438)

parent a665dd1c
...@@ -2,11 +2,8 @@ ...@@ -2,11 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'dart:typed_data';
import 'package:archive/archive.dart';
import 'package:flutter_devicelab/framework/apk_utils.dart'; import 'package:flutter_devicelab/framework/apk_utils.dart';
import 'package:flutter_devicelab/framework/framework.dart'; import 'package:flutter_devicelab/framework/framework.dart';
import 'package:flutter_devicelab/framework/task_result.dart'; import 'package:flutter_devicelab/framework/task_result.dart';
...@@ -317,24 +314,6 @@ Future<void> main() async { ...@@ -317,24 +314,6 @@ Future<void> main() async {
'lib/armeabi-v7a/libflutter.so', 'lib/armeabi-v7a/libflutter.so',
], await getFilesInApk(releaseHostApk)); ], await getFilesInApk(releaseHostApk));
section('Check the NOTICE file is correct');
await inDirectory(hostApp, () async {
final File apkFile = File(releaseHostApk);
final Archive apk = ZipDecoder().decodeBytes(apkFile.readAsBytesSync());
// Shouldn't be missing since we already checked it exists above.
final ArchiveFile noticesFile = apk.findFile('assets/flutter_assets/NOTICES.Z');
final Uint8List licenseData = noticesFile.content as Uint8List;
if (licenseData == null) {
return TaskResult.failure('Invalid license file.');
}
final String licenseString = utf8.decode(gzip.decode(licenseData));
if (!licenseString.contains('skia') || !licenseString.contains('Flutter Authors')) {
return TaskResult.failure('License content missing.');
}
});
section('Check release AndroidManifest.xml'); section('Check release AndroidManifest.xml');
final String androidManifestRelease = await getAndroidManifest(debugHostApk); final String androidManifestRelease = await getAndroidManifest(debugHostApk);
......
...@@ -2,9 +2,7 @@ ...@@ -2,9 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'dart:typed_data';
import 'package:flutter_devicelab/framework/framework.dart'; import 'package:flutter_devicelab/framework/framework.dart';
import 'package:flutter_devicelab/framework/ios.dart'; import 'package:flutter_devicelab/framework/ios.dart';
...@@ -214,8 +212,6 @@ Future<void> main() async { ...@@ -214,8 +212,6 @@ Future<void> main() async {
final File objectiveCAnalyticsOutputFile = File(path.join(tempDir.path, 'analytics-objc.log')); final File objectiveCAnalyticsOutputFile = File(path.join(tempDir.path, 'analytics-objc.log'));
final Directory objectiveCBuildDirectory = Directory(path.join(tempDir.path, 'build-objc')); final Directory objectiveCBuildDirectory = Directory(path.join(tempDir.path, 'build-objc'));
section('Build iOS Objective-C host app');
await inDirectory(objectiveCHostApp, () async { await inDirectory(objectiveCHostApp, () async {
await exec( await exec(
'pod', 'pod',
...@@ -272,28 +268,6 @@ Future<void> main() async { ...@@ -272,28 +268,6 @@ Future<void> main() async {
'isolate_snapshot_data', 'isolate_snapshot_data',
)); ));
section('Check the NOTICE file is correct');
final String licenseFilePath = path.join(
objectiveCBuildDirectory.path,
'Host.app',
'Frameworks',
'App.framework',
'flutter_assets',
'NOTICES.Z',
);
checkFileExists(licenseFilePath);
await inDirectory(objectiveCBuildDirectory, () async {
final Uint8List licenseData = File(licenseFilePath).readAsBytesSync();
final String licenseString = utf8.decode(gzip.decode(licenseData));
if (!licenseString.contains('skia') || !licenseString.contains('Flutter Authors')) {
return TaskResult.failure('License content missing');
}
});
section('Check that the host build sends the correct analytics');
final String objectiveCAnalyticsOutput = objectiveCAnalyticsOutputFile.readAsStringSync(); final String objectiveCAnalyticsOutput = objectiveCAnalyticsOutputFile.readAsStringSync();
if (!objectiveCAnalyticsOutput.contains('cd24: ios') if (!objectiveCAnalyticsOutput.contains('cd24: ios')
|| !objectiveCAnalyticsOutput.contains('cd25: true') || !objectiveCAnalyticsOutput.contains('cd25: true')
......
...@@ -13,7 +13,7 @@ final String platformLineSep = Platform.isWindows ? '\r\n' : '\n'; ...@@ -13,7 +13,7 @@ final String platformLineSep = Platform.isWindows ? '\r\n' : '\n';
final List<String> flutterAssets = <String>[ final List<String> flutterAssets = <String>[
'assets/flutter_assets/AssetManifest.json', 'assets/flutter_assets/AssetManifest.json',
'assets/flutter_assets/NOTICES.Z', 'assets/flutter_assets/NOTICES',
'assets/flutter_assets/fonts/MaterialIcons-Regular.otf', 'assets/flutter_assets/fonts/MaterialIcons-Regular.otf',
'assets/flutter_assets/packages/cupertino_icons/assets/CupertinoIcons.ttf', 'assets/flutter_assets/packages/cupertino_icons/assets/CupertinoIcons.ttf',
]; ];
......
...@@ -1070,7 +1070,7 @@ class CompileTest { ...@@ -1070,7 +1070,7 @@ class CompileTest {
final _UnzipListEntry libflutter = fileToMetadata['lib/armeabi-v7a/libflutter.so']; final _UnzipListEntry libflutter = fileToMetadata['lib/armeabi-v7a/libflutter.so'];
final _UnzipListEntry libapp = fileToMetadata['lib/armeabi-v7a/libapp.so']; final _UnzipListEntry libapp = fileToMetadata['lib/armeabi-v7a/libapp.so'];
final _UnzipListEntry license = fileToMetadata['assets/flutter_assets/NOTICES.Z']; final _UnzipListEntry license = fileToMetadata['assets/flutter_assets/NOTICES'];
return <String, dynamic>{ return <String, dynamic>{
'libflutter_uncompressed_bytes': libflutter.uncompressedSize, 'libflutter_uncompressed_bytes': libflutter.uncompressedSize,
......
...@@ -46,7 +46,7 @@ class TestAssetBundle extends AssetBundle { ...@@ -46,7 +46,7 @@ class TestAssetBundle extends AssetBundle {
} }
@override @override
Future<String> loadString(String key, { bool cache = true, bool unzip = false }) async { Future<String> loadString(String key, { bool cache = true }) async {
if (key == 'lib/gallery/example_code.dart') if (key == 'lib/gallery/example_code.dart')
return testCodeFile; return testCodeFile;
return ''; return '';
......
...@@ -64,16 +64,7 @@ abstract class AssetBundle { ...@@ -64,16 +64,7 @@ abstract class AssetBundle {
/// caller is going to be doing its own caching. (It might not be cached if /// caller is going to be doing its own caching. (It might not be cached if
/// it's set to true either, that depends on the asset bundle /// it's set to true either, that depends on the asset bundle
/// implementation.) /// implementation.)
/// Future<String> loadString(String key, { bool cache = true }) async {
/// If the `unzip` argument is set to true, it would first unzip file at the
/// specified location before retrieving the string content.
Future<String> loadString(
String key,
{
bool cache = true,
bool unzip = false,
}
) async {
final ByteData data = await load(key); final ByteData data = await load(key);
// Note: data has a non-nullable type, but might be null when running with // Note: data has a non-nullable type, but might be null when running with
// weak checking, so we need to null check it anyway (and ignore the warning // weak checking, so we need to null check it anyway (and ignore the warning
...@@ -82,26 +73,15 @@ abstract class AssetBundle { ...@@ -82,26 +73,15 @@ abstract class AssetBundle {
throw FlutterError('Unable to load asset: $key'); // ignore: dead_code throw FlutterError('Unable to load asset: $key'); // ignore: dead_code
// 50 KB of data should take 2-3 ms to parse on a Moto G4, and about 400 μs // 50 KB of data should take 2-3 ms to parse on a Moto G4, and about 400 μs
// on a Pixel 4. // on a Pixel 4.
if (data.lengthInBytes < 50 * 1024 && !unzip) { if (data.lengthInBytes < 50 * 1024) {
return _utf8Decode(data); return utf8.decode(data.buffer.asUint8List());
} }
// For strings larger than 50 KB, run the computation in an isolate to // For strings larger than 50 KB, run the computation in an isolate to
// avoid causing main thread jank. // avoid causing main thread jank.
return compute( return compute(_utf8decode, data, debugLabel: 'UTF8 decode for "$key"');
unzip ? _utf8ZipDecode : _utf8Decode,
data,
debugLabel: '${unzip ? "Unzip and ": ""}UTF8 decode for "$key"',
);
}
static String _utf8ZipDecode(ByteData data) {
List<int> bytes = data.buffer.asUint8List();
bytes = gzip.decode(bytes);
return utf8.decode(bytes);
} }
static String _utf8Decode(ByteData data) { static String _utf8decode(ByteData data) {
return utf8.decode(data.buffer.asUint8List()); return utf8.decode(data.buffer.asUint8List());
} }
...@@ -183,10 +163,10 @@ abstract class CachingAssetBundle extends AssetBundle { ...@@ -183,10 +163,10 @@ abstract class CachingAssetBundle extends AssetBundle {
final Map<String, Future<dynamic>> _structuredDataCache = <String, Future<dynamic>>{}; final Map<String, Future<dynamic>> _structuredDataCache = <String, Future<dynamic>>{};
@override @override
Future<String> loadString(String key, { bool cache = true, bool unzip = false }) { Future<String> loadString(String key, { bool cache = true }) {
if (cache) if (cache)
return _stringCache.putIfAbsent(key, () => super.loadString(key, unzip: unzip)); return _stringCache.putIfAbsent(key, () => super.loadString(key));
return super.loadString(key, unzip: unzip); return super.loadString(key);
} }
/// Retrieve a string from the asset bundle, parse it with the given function, /// Retrieve a string from the asset bundle, parse it with the given function,
......
...@@ -104,19 +104,7 @@ mixin ServicesBinding on BindingBase, SchedulerBinding { ...@@ -104,19 +104,7 @@ mixin ServicesBinding on BindingBase, SchedulerBinding {
// TODO(ianh): Remove this complexity once these bugs are fixed. // TODO(ianh): Remove this complexity once these bugs are fixed.
final Completer<String> rawLicenses = Completer<String>(); final Completer<String> rawLicenses = Completer<String>();
scheduleTask(() async { scheduleTask(() async {
rawLicenses.complete( rawLicenses.complete(await rootBundle.loadString('NOTICES', cache: false));
await rootBundle.loadString(
// NOTICES for web isn't compressed since we don't have access to
// dart:io on the client side and it's already compressed between
// the server and client.
//
// The compressed version doesn't have a more common .gz extension
// because gradle for Android non-transparently manipulates .gz files.
kIsWeb ? 'NOTICES' : 'NOTICES.Z',
cache: false,
unzip: !kIsWeb,
)
);
}, Priority.animation); }, Priority.animation);
await rawLicenses.future; await rawLicenses.future;
final Completer<List<LicenseEntry>> parsedLicenses = Completer<List<LicenseEntry>>(); final Completer<List<LicenseEntry>> parsedLicenses = Completer<List<LicenseEntry>>();
......
...@@ -3,7 +3,6 @@ ...@@ -3,7 +3,6 @@
// found in the LICENSE file. // found in the LICENSE file.
import 'dart:convert'; import 'dart:convert';
import 'dart:io';
import 'dart:typed_data'; import 'dart:typed_data';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
...@@ -16,13 +15,10 @@ class TestAssetBundle extends CachingAssetBundle { ...@@ -16,13 +15,10 @@ class TestAssetBundle extends CachingAssetBundle {
@override @override
Future<ByteData> load(String key) async { Future<ByteData> load(String key) async {
loadCallCount[key] = loadCallCount[key] ?? 0 + 1;
if (key == 'AssetManifest.json') if (key == 'AssetManifest.json')
return ByteData.view(Uint8List.fromList(const Utf8Encoder().convert('{"one": ["one"]}')).buffer); return ByteData.view(Uint8List.fromList(const Utf8Encoder().convert('{"one": ["one"]}')).buffer);
if (key == 'NOTICES.Z') loadCallCount[key] = loadCallCount[key] ?? 0 + 1;
return ByteData.view(Uint8List.fromList(gzip.encode(utf8.encode('All your base are belong to us'))).buffer);
if (key == 'one') if (key == 'one')
return ByteData(1)..setInt8(0, 49); return ByteData(1)..setInt8(0, 49);
throw FlutterError('key not found'); throw FlutterError('key not found');
...@@ -52,26 +48,6 @@ void main() { ...@@ -52,26 +48,6 @@ void main() {
expect(loadException, isFlutterError); expect(loadException, isFlutterError);
}); });
test('Test loading zipped strings', () async {
final TestAssetBundle bundle = TestAssetBundle();
String assetString = await bundle.loadString('NOTICES.Z', unzip: true);
expect(assetString, equals('All your base are belong to us'));
expect(bundle.loadCallCount['NOTICES.Z'], 1);
assetString = await bundle.loadString('NOTICES.Z', unzip: true);
expect(assetString, equals('All your base are belong to us'));
// Should have been cached and shouldn't retrieve and decode another time.
expect(bundle.loadCallCount['NOTICES.Z'], 1);
}, onPlatform: <String, dynamic>{
'browser': const Skip(
'Skip the NOTICES unzipping test because NOTICES are'
'not zipped for the web'
),
});
test('AssetImage.obtainKey succeeds with ImageConfiguration.empty', () async { test('AssetImage.obtainKey succeeds with ImageConfiguration.empty', () async {
// This is a regression test for https://github.com/flutter/flutter/issues/12392 // This is a regression test for https://github.com/flutter/flutter/issues/12392
final AssetImage assetImage = AssetImage('one', bundle: TestAssetBundle()); final AssetImage assetImage = AssetImage('one', bundle: TestAssetBundle());
......
...@@ -2,8 +2,6 @@ ...@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
import 'dart:convert';
import 'dart:io';
import 'dart:typed_data'; import 'dart:typed_data';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
...@@ -46,10 +44,7 @@ class TestBinding extends BindingBase with SchedulerBinding, ServicesBinding { ...@@ -46,10 +44,7 @@ class TestBinding extends BindingBase with SchedulerBinding, ServicesBinding {
BinaryMessenger createBinaryMessenger() { BinaryMessenger createBinaryMessenger() {
return super.createBinaryMessenger() return super.createBinaryMessenger()
..setMockMessageHandler('flutter/assets', (ByteData? message) async { ..setMockMessageHandler('flutter/assets', (ByteData? message) async {
if (const StringCodec().decodeMessage(message) == 'NOTICES.Z' && !kIsWeb) { if (const StringCodec().decodeMessage(message) == 'NOTICES') {
return Uint8List.fromList(gzip.encode(utf8.encode(licenses))).buffer.asByteData();
}
if (const StringCodec().decodeMessage(message) == 'NOTICES' && kIsWeb) {
return const StringCodec().encodeMessage(licenses); return const StringCodec().encodeMessage(licenses);
} }
return null; return null;
......
...@@ -66,7 +66,7 @@ class TestAssetBundle extends CachingAssetBundle { ...@@ -66,7 +66,7 @@ class TestAssetBundle extends CachingAssetBundle {
} }
@override @override
Future<String> loadString(String key, { bool cache = true, bool unzip = false }) { Future<String> loadString(String key, { bool cache = true }) {
if (key == 'AssetManifest.json') if (key == 'AssetManifest.json')
return SynchronousFuture<String>(manifest); return SynchronousFuture<String>(manifest);
return SynchronousFuture<String>(''); return SynchronousFuture<String>('');
......
...@@ -7,7 +7,6 @@ import 'package:flutter_tools/src/asset.dart' hide defaultManifestPath; ...@@ -7,7 +7,6 @@ import 'package:flutter_tools/src/asset.dart' hide defaultManifestPath;
import 'package:flutter_tools/src/base/context.dart'; import 'package:flutter_tools/src/base/context.dart';
import 'package:flutter_tools/src/base/file_system.dart' as libfs; import 'package:flutter_tools/src/base/file_system.dart' as libfs;
import 'package:flutter_tools/src/base/io.dart'; import 'package:flutter_tools/src/base/io.dart';
import 'package:flutter_tools/src/build_info.dart';
import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/cache.dart';
import 'package:flutter_tools/src/context_runner.dart'; import 'package:flutter_tools/src/context_runner.dart';
import 'package:flutter_tools/src/devfs.dart'; import 'package:flutter_tools/src/devfs.dart';
...@@ -60,7 +59,6 @@ Future<void> run(List<String> args) async { ...@@ -60,7 +59,6 @@ Future<void> run(List<String> args) async {
manifestPath: argResults[_kOptionManifest] as String ?? defaultManifestPath, manifestPath: argResults[_kOptionManifest] as String ?? defaultManifestPath,
assetDirPath: assetDir, assetDirPath: assetDir,
packagesPath: argResults[_kOptionPackages] as String, packagesPath: argResults[_kOptionPackages] as String,
targetPlatform: TargetPlatform.fuchsia_arm64 // This is not arch specific.
); );
if (assets == null) { if (assets == null) {
......
...@@ -7,7 +7,6 @@ import 'package:package_config/package_config.dart'; ...@@ -7,7 +7,6 @@ import 'package:package_config/package_config.dart';
import 'base/context.dart'; import 'base/context.dart';
import 'base/file_system.dart'; import 'base/file_system.dart';
import 'base/io.dart';
import 'base/logger.dart'; import 'base/logger.dart';
import 'base/platform.dart'; import 'base/platform.dart';
import 'build_info.dart'; import 'build_info.dart';
...@@ -73,7 +72,6 @@ abstract class AssetBundle { ...@@ -73,7 +72,6 @@ abstract class AssetBundle {
String manifestPath = defaultManifestPath, String manifestPath = defaultManifestPath,
String assetDirPath, String assetDirPath,
@required String packagesPath, @required String packagesPath,
TargetPlatform targetPlatform,
}); });
} }
...@@ -124,13 +122,6 @@ class ManifestAssetBundle implements AssetBundle { ...@@ -124,13 +122,6 @@ class ManifestAssetBundle implements AssetBundle {
static const String _kAssetManifestJson = 'AssetManifest.json'; static const String _kAssetManifestJson = 'AssetManifest.json';
static const String _kNoticeFile = 'NOTICES'; static const String _kNoticeFile = 'NOTICES';
// Comically, this can't be name with the more common .gz file extension
// because when it's part of an AAR and brought into another APK via gradle,
// gradle individually traverses all the files of the AAR and unzips .gz
// files (b/37117906). A less common .Z extension still describes how the
// file is formatted if users want to manually inspect the application
// bundle and is recognized by default file handlers on OS such as macOS.˚
static const String _kNoticeZippedFile = 'NOTICES.Z';
@override @override
bool wasBuiltOnce() => _lastBuildTimestamp != null; bool wasBuiltOnce() => _lastBuildTimestamp != null;
...@@ -169,7 +160,6 @@ class ManifestAssetBundle implements AssetBundle { ...@@ -169,7 +160,6 @@ class ManifestAssetBundle implements AssetBundle {
String manifestPath = defaultManifestPath, String manifestPath = defaultManifestPath,
String assetDirPath, String assetDirPath,
@required String packagesPath, @required String packagesPath,
TargetPlatform targetPlatform,
}) async { }) async {
assetDirPath ??= getAssetBuildDirectory(); assetDirPath ??= getAssetBuildDirectory();
FlutterProject flutterProject; FlutterProject flutterProject;
...@@ -330,6 +320,7 @@ class ManifestAssetBundle implements AssetBundle { ...@@ -330,6 +320,7 @@ class ManifestAssetBundle implements AssetBundle {
final DevFSStringContent assetManifest = _createAssetManifest(assetVariants); final DevFSStringContent assetManifest = _createAssetManifest(assetVariants);
final DevFSStringContent fontManifest = DevFSStringContent(json.encode(fonts)); final DevFSStringContent fontManifest = DevFSStringContent(json.encode(fonts));
final LicenseResult licenseResult = _licenseCollector.obtainLicenses(packageConfig); final LicenseResult licenseResult = _licenseCollector.obtainLicenses(packageConfig);
final DevFSStringContent licenses = DevFSStringContent(licenseResult.combinedLicenses);
additionalDependencies = licenseResult.dependencies; additionalDependencies = licenseResult.dependencies;
if (wildcardDirectories.isNotEmpty) { if (wildcardDirectories.isNotEmpty) {
...@@ -347,27 +338,7 @@ class ManifestAssetBundle implements AssetBundle { ...@@ -347,27 +338,7 @@ class ManifestAssetBundle implements AssetBundle {
_setIfChanged(_kAssetManifestJson, assetManifest); _setIfChanged(_kAssetManifestJson, assetManifest);
_setIfChanged(kFontManifestJson, fontManifest); _setIfChanged(kFontManifestJson, fontManifest);
if (targetPlatform == TargetPlatform.web_javascript) { _setIfChanged(_kNoticeFile, licenses);
// Don't compress the NOTICES file on web since the client doesn't have
// dart:io to decompress it.
_setIfChanged(_kNoticeFile, DevFSStringContent(licenseResult.combinedLicenses));
} else {
final List<int> licenseBytes = utf8.encode(licenseResult.combinedLicenses);
if (entries[_kNoticeZippedFile] == null ||
gzip.decode((entries[_kNoticeZippedFile] as DevFSByteContent).bytes)
!= licenseBytes) {
entries[_kNoticeZippedFile] = DevFSByteContent(
ZLibEncoder(
// A zlib dictionary is a hinting string sequence with the most
// likely string occurrences at the end. This ends up just being
// common English words with domain specific words like copyright.
dictionary: utf8.encode('copyrightsoftwaretothisinandorofthe'),
gzip: true,
level: 9,
).convert(licenseBytes)
);
}
}
return 0; return 0;
} }
......
...@@ -102,8 +102,7 @@ export 'dart:io' ...@@ -102,8 +102,7 @@ export 'dart:io'
systemEncoding, systemEncoding,
WebSocket, WebSocket,
WebSocketException, WebSocketException,
WebSocketTransformer, WebSocketTransformer;
ZLibEncoder;
/// Exits the process with the given [exitCode]. /// Exits the process with the given [exitCode].
typedef ExitFunction = void Function(int exitCode); typedef ExitFunction = void Function(int exitCode);
......
...@@ -54,7 +54,6 @@ Future<Depfile> copyAssets(Environment environment, Directory outputDirectory, { ...@@ -54,7 +54,6 @@ Future<Depfile> copyAssets(Environment environment, Directory outputDirectory, {
manifestPath: pubspecFile.path, manifestPath: pubspecFile.path,
packagesPath: environment.projectDir.childFile('.packages').path, packagesPath: environment.projectDir.childFile('.packages').path,
assetDirPath: null, assetDirPath: null,
targetPlatform: targetPlatform,
); );
if (resultCode != 0) { if (resultCode != 0) {
throw Exception('Failed to bundle asset files.'); throw Exception('Failed to bundle asset files.');
......
...@@ -192,7 +192,6 @@ Future<AssetBundle> buildAssets({ ...@@ -192,7 +192,6 @@ Future<AssetBundle> buildAssets({
String manifestPath, String manifestPath,
String assetDirPath, String assetDirPath,
@required String packagesPath, @required String packagesPath,
TargetPlatform targetPlatform,
}) async { }) async {
assetDirPath ??= getAssetBuildDirectory(); assetDirPath ??= getAssetBuildDirectory();
packagesPath ??= globals.fs.path.absolute(packagesPath); packagesPath ??= globals.fs.path.absolute(packagesPath);
...@@ -203,7 +202,6 @@ Future<AssetBundle> buildAssets({ ...@@ -203,7 +202,6 @@ Future<AssetBundle> buildAssets({
manifestPath: manifestPath, manifestPath: manifestPath,
assetDirPath: assetDirPath, assetDirPath: assetDirPath,
packagesPath: packagesPath, packagesPath: packagesPath,
targetPlatform: targetPlatform,
); );
if (result != 0) { if (result != 0) {
return null; return null;
......
...@@ -705,10 +705,7 @@ class _ResidentWebRunner extends ResidentWebRunner { ...@@ -705,10 +705,7 @@ class _ResidentWebRunner extends ResidentWebRunner {
final bool rebuildBundle = assetBundle.needsBuild(); final bool rebuildBundle = assetBundle.needsBuild();
if (rebuildBundle) { if (rebuildBundle) {
globals.printTrace('Updating assets'); globals.printTrace('Updating assets');
final int result = await assetBundle.build( final int result = await assetBundle.build(packagesPath: debuggingOptions.buildInfo.packagesPath);
packagesPath: debuggingOptions.buildInfo.packagesPath,
targetPlatform: TargetPlatform.web_javascript,
);
if (result != 0) { if (result != 0) {
return UpdateFSReport(success: false); return UpdateFSReport(success: false);
} }
......
...@@ -88,7 +88,7 @@ flutter: ...@@ -88,7 +88,7 @@ flutter:
expect(fileSystem.file('${environment.buildDir.path}/flutter_assets/AssetManifest.json'), exists); expect(fileSystem.file('${environment.buildDir.path}/flutter_assets/AssetManifest.json'), exists);
expect(fileSystem.file('${environment.buildDir.path}/flutter_assets/FontManifest.json'), exists); expect(fileSystem.file('${environment.buildDir.path}/flutter_assets/FontManifest.json'), exists);
expect(fileSystem.file('${environment.buildDir.path}/flutter_assets/NOTICES.Z'), exists); expect(fileSystem.file('${environment.buildDir.path}/flutter_assets/NOTICES'), exists);
// See https://github.com/flutter/flutter/issues/35293 // See https://github.com/flutter/flutter/issues/35293
expect(fileSystem.file('${environment.buildDir.path}/flutter_assets/assets/foo/bar.png'), exists); expect(fileSystem.file('${environment.buildDir.path}/flutter_assets/assets/foo/bar.png'), exists);
// See https://github.com/flutter/flutter/issues/46163 // See https://github.com/flutter/flutter/issues/46163
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment