blob: 21208979a66b866cbd950ae498ca090358c77795 [file] [log] [blame]
// Copyright 2014 The Flutter 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 'package:meta/meta.dart';
import '../../android/deferred_components_gen_snapshot_validator.dart';
import '../../base/deferred_component.dart';
import '../../build_info.dart';
import '../../project.dart';
import '../build_system.dart';
import '../depfile.dart';
import 'android.dart';
/// Creates a [DeferredComponentsGenSnapshotValidator], runs the checks, and displays the validator
/// output to the developer if changes are recommended.
class DeferredComponentsGenSnapshotValidatorTarget extends Target {
/// Create an [AndroidAotDeferredComponentsBundle] implementation for a given [targetPlatform] and [buildMode].
DeferredComponentsGenSnapshotValidatorTarget({
required this.deferredComponentsDependencies,
required this.nonDeferredComponentsDependencies,
this.title,
this.exitOnFail = true,
});
/// The [AndroidAotDeferredComponentsBundle] derived target instances this rule depends on.
final List<AndroidAotDeferredComponentsBundle> deferredComponentsDependencies;
final List<Target> nonDeferredComponentsDependencies;
/// The title of the [DeferredComponentsGenSnapshotValidator] that is
/// displayed to the developer when logging results.
final String? title;
/// Whether to exit the tool if a recommended change is found by the
/// [DeferredComponentsGenSnapshotValidator].
final bool exitOnFail;
/// The abis to validate.
List<String> get _abis {
final List<String> abis = <String>[];
for (final AndroidAotDeferredComponentsBundle target in deferredComponentsDependencies) {
if (deferredComponentsTargets.contains(target.name)) {
abis.add(
getNameForAndroidArch(getAndroidArchForName(getNameForTargetPlatform(target.dependency.targetPlatform)))
);
}
}
return abis;
}
@override
String get name => 'deferred_components_gen_snapshot_validator';
@override
List<Source> get inputs => const <Source>[];
@override
List<Source> get outputs => const <Source>[];
@override
List<String> get depfiles => <String>[
'flutter_$name.d',
];
@override
List<Target> get dependencies {
final List<Target> deps = <Target>[CompositeTarget(deferredComponentsDependencies)];
deps.addAll(nonDeferredComponentsDependencies);
return deps;
}
@visibleForTesting
DeferredComponentsGenSnapshotValidator? validator;
@override
Future<void> build(Environment environment) async {
final DepfileService depfileService = DepfileService(
fileSystem: environment.fileSystem,
logger: environment.logger,
);
validator = DeferredComponentsGenSnapshotValidator(
environment,
title: title,
exitOnFail: exitOnFail,
);
final List<LoadingUnit> generatedLoadingUnits = LoadingUnit.parseGeneratedLoadingUnits(
environment.outputDir,
environment.logger,
abis: _abis
);
validator!
..checkAppAndroidManifestComponentLoadingUnitMapping(
FlutterProject.current().manifest.deferredComponents ?? <DeferredComponent>[],
generatedLoadingUnits,
)
..checkAgainstLoadingUnitsCache(generatedLoadingUnits)
..writeLoadingUnitsCache(generatedLoadingUnits);
validator!.handleResults();
depfileService.writeToFile(
Depfile(validator!.inputs, validator!.outputs),
environment.buildDir.childFile('flutter_$name.d'),
);
}
}