blob: 98336d4034ffe7f198924a05ba361cdd07359b14 [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import '../../artifacts.dart';
import '../../base/file_system.dart';
import '../../build_info.dart';
import '../../globals.dart';
import '../build_system.dart';
import '../depfile.dart';
import '../exceptions.dart';
import 'assets.dart';
import 'dart.dart';
/// Prepares the asset bundle in the format expected by flutter.gradle.
///
/// The vm_snapshot_data, isolate_snapshot_data, and kernel_blob.bin are
/// expected to be in the root output directory.
///
/// All assets and manifests are included from flutter_assets/**.
abstract class AndroidAssetBundle extends Target {
const AndroidAssetBundle();
@override
List<Source> get inputs => const <Source>[
Source.pattern('{BUILD_DIR}/app.dill'),
Source.depfile('flutter_assets.d'),
];
@override
List<Source> get outputs => const <Source>[
Source.depfile('flutter_assets.d'),
];
@override
Future<void> build(Environment environment) async {
if (environment.defines[kBuildMode] == null) {
throw MissingDefineException(kBuildMode, name);
}
final BuildMode buildMode = getBuildModeForName(environment.defines[kBuildMode]);
final Directory outputDirectory = environment.outputDir
.childDirectory('flutter_assets')
..createSync(recursive: true);
// Only copy the prebuilt runtimes and kernel blob in debug mode.
if (buildMode == BuildMode.debug) {
final String vmSnapshotData = artifacts.getArtifactPath(Artifact.vmSnapshotData, mode: BuildMode.debug);
final String isolateSnapshotData = artifacts.getArtifactPath(Artifact.isolateSnapshotData, mode: BuildMode.debug);
environment.buildDir.childFile('app.dill')
.copySync(outputDirectory.childFile('kernel_blob.bin').path);
fs.file(vmSnapshotData)
.copySync(outputDirectory.childFile('vm_snapshot_data').path);
fs.file(isolateSnapshotData)
.copySync(outputDirectory.childFile('isolate_snapshot_data').path);
}
final Depfile assetDepfile = await copyAssets(environment, outputDirectory);
assetDepfile.writeToFile(environment.buildDir.childFile('flutter_assets.d'));
}
@override
List<Target> get dependencies => const <Target>[
KernelSnapshot(),
];
}
/// An implementation of [AndroidAssetBundle] that includes dependencies on vm
/// and isolate data.
class DebugAndroidApplication extends AndroidAssetBundle {
const DebugAndroidApplication();
@override
String get name => 'debug_android_application';
@override
List<Source> get inputs => <Source>[
...super.inputs,
const Source.artifact(Artifact.vmSnapshotData, mode: BuildMode.debug),
const Source.artifact(Artifact.isolateSnapshotData, mode: BuildMode.debug),
];
@override
List<Source> get outputs => <Source>[
...super.outputs,
const Source.pattern('{OUTPUT_DIR}/vm_snapshot_data'),
const Source.pattern('{OUTPUT_DIR}/isolate_snapshot_data'),
const Source.pattern('{OUTPUT_DIR}/kernel_blob.bin'),
];
}
/// An implementation of [AndroidAssetBundle] that only includes assets.
class AotAndroidAssetBundle extends AndroidAssetBundle {
const AotAndroidAssetBundle();
@override
String get name => 'aot_android_asset_bundle';
}
/// Build a profile android application's Dart artifacts.
class ProfileAndroidApplication extends CopyFlutterAotBundle {
const ProfileAndroidApplication();
@override
String get name => 'profile_android_application';
@override
List<Target> get dependencies => const <Target>[
AotElfProfile(),
AotAndroidAssetBundle(),
];
}
/// Build a release android application's Dart artifacts.
class ReleaseAndroidApplication extends CopyFlutterAotBundle {
const ReleaseAndroidApplication();
@override
String get name => 'release_android_application';
@override
List<Target> get dependencies => const <Target>[
AotElfRelease(),
AotAndroidAssetBundle(),
];
}