diff --git a/packages/flutter_tools/lib/src/fuchsia/fuchsia_build.dart b/packages/flutter_tools/lib/src/fuchsia/fuchsia_build.dart index d9752bd7bdc..00d95fa7840 100644 --- a/packages/flutter_tools/lib/src/fuchsia/fuchsia_build.dart +++ b/packages/flutter_tools/lib/src/fuchsia/fuchsia_build.dart @@ -5,10 +5,12 @@ import 'package:meta/meta.dart'; import '../asset.dart'; +import '../base/common.dart'; import '../base/file_system.dart'; import '../base/io.dart'; import '../build_info.dart'; import '../bundle.dart'; +import '../convert.dart'; import '../devfs.dart'; import '../project.dart'; @@ -67,6 +69,31 @@ Future _buildAssets( await outFile.close(); } +void _rewriteCmx(BuildMode mode, File src, File dst) { + final Map cmx = json.decode(src.readAsStringSync()); + // If the app author has already specified the runner in the cmx file, then + // do not override it with something else. + if (cmx.containsKey('runner')) { + dst.writeAsStringSync(json.encode(cmx)); + return; + } + String runner; + switch (mode) { + case BuildMode.debug: + case BuildMode.profile: + runner = 'flutter_jit_runner'; + break; + case BuildMode.release: + runner = 'flutter_jit_product_runner'; + break; + default: + throwToolExit('Fuchsia does not support build mode "$mode"'); + break; + } + cmx['runner'] = 'fuchsia-pkg://fuchsia.com/$runner#meta/$runner.cmx'; + dst.writeAsStringSync(json.encode(cmx)); +} + // TODO(zra): Allow supplying a signing key. Future _buildPackage( FuchsiaProject fuchsiaProject, @@ -85,13 +112,17 @@ Future _buildPackage( pkg.createSync(recursive: true); } + final File srcCmx = + fs.file(fs.path.join(fuchsiaProject.meta.path, '$appName.cmx')); + final File dstCmx = fs.file(fs.path.join(outDir, '$appName.cmx')); + _rewriteCmx(buildInfo.mode, srcCmx, dstCmx); + // Concatenate dilpmanifest and pkgassets into package_manifest. final File manifestFile = fs.file(packageManifest); manifestFile.writeAsStringSync(fs.file(dilpmanifest).readAsStringSync()); manifestFile.writeAsStringSync(fs.file(pkgassets).readAsStringSync(), mode: FileMode.append); - manifestFile.writeAsStringSync( - 'meta/$appName.cmx=${fuchsiaProject.meta.path}/$appName.cmx\n', + manifestFile.writeAsStringSync('meta/$appName.cmx=${dstCmx.path}\n', mode: FileMode.append); manifestFile.writeAsStringSync('meta/package=$pkgDir/meta/package\n', mode: FileMode.append); diff --git a/packages/flutter_tools/test/commands/build_fuchsia_test.dart b/packages/flutter_tools/test/commands/build_fuchsia_test.dart index d67e5433ef2..09145621513 100644 --- a/packages/flutter_tools/test/commands/build_fuchsia_test.dart +++ b/packages/flutter_tools/test/commands/build_fuchsia_test.dart @@ -84,7 +84,8 @@ void main() { const String appName = 'app_name'; fs .file(fs.path.join('fuchsia', 'meta', '$appName.cmx')) - .createSync(recursive: true); + ..createSync(recursive: true) + ..writeAsStringSync('{}'); fs.file('.packages').createSync(); final File pubspecFile = fs.file('pubspec.yaml')..createSync(); pubspecFile.writeAsStringSync('name: $appName'); @@ -105,7 +106,8 @@ void main() { const String appName = 'app_name'; fs .file(fs.path.join('fuchsia', 'meta', '$appName.cmx')) - .createSync(recursive: true); + ..createSync(recursive: true) + ..writeAsStringSync('{}'); fs.file('.packages').createSync(); fs.file(fs.path.join('lib', 'main.dart')).createSync(recursive: true); final File pubspecFile = fs.file('pubspec.yaml')..createSync(); @@ -127,7 +129,8 @@ void main() { const String appName = 'app_name'; fs .file(fs.path.join('fuchsia', 'meta', '$appName.cmx')) - .createSync(recursive: true); + ..createSync(recursive: true) + ..writeAsStringSync('{}'); fs.file('.packages').createSync(); fs.file(fs.path.join('lib', 'main.dart')).createSync(recursive: true); final File pubspecFile = fs.file('pubspec.yaml')..createSync(); diff --git a/packages/flutter_tools/test/fuchsia/fuchsa_device_test.dart b/packages/flutter_tools/test/fuchsia/fuchsa_device_test.dart index 7e10b662303..025857091f7 100644 --- a/packages/flutter_tools/test/fuchsia/fuchsa_device_test.dart +++ b/packages/flutter_tools/test/fuchsia/fuchsa_device_test.dart @@ -434,7 +434,8 @@ void main() { app = FuchsiaApp.fromPrebuiltApp(far); } else { fs.file(fs.path.join('fuchsia', 'meta', '$appName.cmx')) - .createSync(recursive: true); + ..createSync(recursive: true) + ..writeAsStringSync('{}'); fs.file('.packages').createSync(); fs.file(fs.path.join('lib', 'main.dart')).createSync(recursive: true); app = BuildableFuchsiaApp(project: FlutterProject.current().fuchsia);