Remove dependency on [Target] and instead operate on [Architecture] (#159196)

The dart-lang/native repository contains a `Target` class that is almost
not needed anymore. The remaining uses are mainly due to kernel asset
mapping (which we may be able to remove in the future).

This PR removes usages of that `Target` (in favor of `Architecture`)
class in most places in flutter tools.
This makes the code also cleaner because we no longer have an implicit
assumption that
a `List<Target>` all belong to the same operating system.
This commit is contained in:
Martin Kustermann 2024-11-20 13:44:43 +01:00 committed by GitHub
parent 15a03a4ada
commit e2d8121708
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 73 additions and 69 deletions

View File

@ -34,7 +34,7 @@ Future<void> copyNativeCodeAssetsAndroid(
final Uri source = assetMapping.key.file!;
final Uri target = (assetMapping.value.path as KernelAssetAbsolutePath).uri;
final AndroidArch androidArch =
_getAndroidArch(assetMapping.value.target);
_getAndroidArch(assetMapping.value.target.architecture);
final String jniArchDir = androidArch.archName;
final Uri archUri = buildUri.resolve('jniLibs/lib/$jniArchDir/');
final Uri targetUri = archUri.resolveUri(target);
@ -43,25 +43,25 @@ Future<void> copyNativeCodeAssetsAndroid(
}
}
/// Get the [Target] for [androidArch].
Target getNativeAndroidTarget(AndroidArch androidArch) {
/// Get the [Architecture] for [androidArch].
Architecture getNativeAndroidArchitecture(AndroidArch androidArch) {
return switch (androidArch) {
AndroidArch.armeabi_v7a => Target.androidArm,
AndroidArch.arm64_v8a => Target.androidArm64,
AndroidArch.x86 => Target.androidIA32,
AndroidArch.x86_64 => Target.androidX64,
AndroidArch.armeabi_v7a => Architecture.arm,
AndroidArch.arm64_v8a => Architecture.arm64,
AndroidArch.x86 => Architecture.ia32,
AndroidArch.x86_64 => Architecture.x64,
};
}
/// Get the [AndroidArch] for [target].
AndroidArch _getAndroidArch(Target target) {
return switch (target) {
Target.androidArm => AndroidArch.armeabi_v7a,
Target.androidArm64 => AndroidArch.arm64_v8a,
Target.androidIA32 => AndroidArch.x86,
Target.androidX64 => AndroidArch.x86_64,
Target.androidRiscv64 => throwToolExit('Android RISC-V not yet supported.'),
_ => throwToolExit('Invalid target: $target.'),
/// Get the [AndroidArch] for [architecture].
AndroidArch _getAndroidArch(Architecture architecture) {
return switch (architecture) {
Architecture.arm => AndroidArch.armeabi_v7a,
Architecture.arm64 => AndroidArch.arm64_v8a,
Architecture.ia32 => AndroidArch.x86,
Architecture.x64 => AndroidArch.x86_64,
Architecture.riscv64 => throwToolExit('Android RISC-V not yet supported.'),
_ => throwToolExit('Invalid architecture: $architecture.'),
};
}

View File

@ -20,12 +20,12 @@ IOSSdk getIOSSdk(EnvironmentType environmentType) {
};
}
/// Extract the [Target] from a [DarwinArch].
Target getNativeIOSTarget(DarwinArch darwinArch) {
/// Extract the [Architecture] from a [DarwinArch].
Architecture getNativeIOSArchitecture(DarwinArch darwinArch) {
return switch (darwinArch) {
DarwinArch.armv7 => Target.iOSArm,
DarwinArch.arm64 => Target.iOSArm64,
DarwinArch.x86_64 => Target.iOSX64,
DarwinArch.armv7 => Architecture.arm,
DarwinArch.arm64 => Architecture.arm64,
DarwinArch.x86_64 => Architecture.x64,
};
}

View File

@ -13,11 +13,11 @@ import 'native_assets_host.dart';
// TODO(dcharkes): Fetch minimum MacOS version from somewhere. https://github.com/flutter/flutter/issues/145104
const int targetMacOSVersion = 13;
/// Extract the [Target] from a [DarwinArch].
Target getNativeMacOSTarget(DarwinArch darwinArch) {
/// Extract the [Architecture] from a [DarwinArch].
Architecture getNativeMacOSArchitecture(DarwinArch darwinArch) {
return switch (darwinArch) {
DarwinArch.arm64 => Target.macOSArm64,
DarwinArch.x86_64 => Target.macOSX64,
DarwinArch.arm64 => Architecture.arm64,
DarwinArch.x86_64 => Architecture.x64,
DarwinArch.armv7 => throw Exception('Unknown DarwinArch: $darwinArch.'),
};
}

View File

@ -96,16 +96,16 @@ Future<DartBuildResult> runFlutterSpecificDartBuild({
return const DartBuildResult.empty();
}
final build_info.BuildMode buildMode = _getBuildMode(targetPlatform, environmentDefines, flutterTester);
final List<Target> targets = flutterTester
? <Target>[Target.current]
: _targetsForOS(targetPlatform, targetOS, environmentDefines);
final DartBuildResult result = targets.isEmpty
final build_info.BuildMode buildMode = _getBuildMode(environmentDefines, flutterTester);
final List<Architecture> architectures = flutterTester
? <Architecture>[Architecture.current]
: _architecturesForOS(targetPlatform, targetOS, environmentDefines);
final DartBuildResult result = architectures.isEmpty
? const DartBuildResult.empty()
: await _runDartBuild(
environmentDefines: environmentDefines,
buildRunner: buildRunner,
targets: targets,
architectures: architectures,
projectUri: projectUri,
buildMode: _nativeAssetsBuildMode(buildMode),
fileSystem: fileSystem,
@ -124,7 +124,7 @@ Future<void> installCodeAssets({
final OS targetOS = getNativeOSFromTargetPlatfrorm(targetPlatform);
final Uri buildUri = nativeAssetsBuildUri(projectUri, targetOS);
final bool flutterTester = targetPlatform == build_info.TargetPlatform.tester;
final build_info.BuildMode buildMode = _getBuildMode(targetPlatform, environmentDefines, flutterTester);
final build_info.BuildMode buildMode = _getBuildMode(environmentDefines, flutterTester);
final String? codesignIdentity = environmentDefines[build_info.kCodesignIdentity];
final Map<CodeAsset, KernelAsset> assetTargetLocations = assetTargetLocationsForOS(targetOS, dartBuildResult.codeAssets, flutterTester, buildUri);
@ -711,20 +711,23 @@ Future<void> _copyNativeCodeAssetsForOS(
Future<DartBuildResult> _runDartBuild({
required Map<String, String> environmentDefines,
required FlutterNativeAssetsBuildRunner buildRunner,
required List<Target> targets,
required List<Architecture> architectures,
required Uri projectUri,
required BuildMode buildMode,
required FileSystem fileSystem,
required OS targetOS,
required OS? targetOS,
}) async {
final bool linkingEnabled = buildMode == BuildMode.release;
final String targetString = targets.length == 1
? targets.single.toString()
: targets.toList().toString();
final String architectureString = architectures.length == 1
? architectures.single.toString()
: architectures.toList().toString();
globals.logger
.printTrace('Building native assets for $targetString $buildMode.');
.printTrace('Building native assets for $targetOS $architectureString $buildMode.');
final List<EncodedAsset> assets = <EncodedAsset>[];
final Set<Uri> dependencies = <Uri>{};
final build_info.EnvironmentType? environmentType;
if (targetOS == OS.iOS) {
final String? sdkRoot = environmentDefines[build_info.kSdkRoot];
@ -748,12 +751,12 @@ Future<DartBuildResult> _runDartBuild({
final int? macOSVersion = targetOS == OS.macOS ? targetMacOSVersion : null;
final IOSSdk? iOSSdk = targetOS == OS.iOS ? getIOSSdk(environmentType!) : null;
for (final Target target in targets) {
for (final Architecture architecture in architectures) {
final BuildResult? buildResult = await buildRunner.build(
supportedAssetTypes: <String>[CodeAsset.type],
configCreator: () => BuildConfigBuilder()
..setupCodeConfig(
targetArchitecture: target.architecture,
targetArchitecture: architecture,
linkModePreference: LinkModePreference.dynamic,
cCompilerConfig: cCompilerConfig,
targetAndroidNdkApi: androidNdkApi,
@ -770,7 +773,7 @@ Future<DartBuildResult> _runDartBuild({
applicationAssetValidator: (List<EncodedAsset> assets) async => <String>[
...await validateCodeAssetInApplication(assets),
],
targetOS: target.os,
targetOS: targetOS!,
buildMode: buildMode,
workingDirectory: projectUri,
includeParentEnvironment: true,
@ -787,7 +790,7 @@ Future<DartBuildResult> _runDartBuild({
supportedAssetTypes: <String>[CodeAsset.type],
configCreator: () => LinkConfigBuilder()
..setupCodeConfig(
targetArchitecture: target.architecture,
targetArchitecture: architecture,
linkModePreference: LinkModePreference.dynamic,
cCompilerConfig: cCompilerConfig,
targetAndroidNdkApi: androidNdkApi,
@ -823,7 +826,7 @@ Future<DartBuildResult> _runDartBuild({
.map<CodeAsset>(CodeAsset.fromEncoded)
.toList();
globals.logger
.printTrace('Building native assets for $targetString $buildMode done.');
.printTrace('Building native assets for $targetOS $architectureString $buildMode done.');
return DartBuildResult(codeAssets, dependencies.toList());
}
@ -865,13 +868,13 @@ Future<DartBuildResult> _runDartDryRunBuild({
dependencies.toList());
}
List<Target> _targetsForOS(build_info.TargetPlatform targetPlatform,
List<Architecture> _architecturesForOS(build_info.TargetPlatform targetPlatform,
OS targetOS, Map<String, String> environmentDefines) {
switch (targetOS) {
case OS.linux:
return <Target>[_getNativeTarget(targetPlatform)];
return <Architecture>[_getNativeArchitecture(targetPlatform)];
case OS.windows:
return <Target>[_getNativeTarget(targetPlatform)];
return <Architecture>[_getNativeArchitecture(targetPlatform)];
case OS.macOS:
final List<build_info.DarwinArch> darwinArchs =
_emptyToNull(environmentDefines[build_info.kDarwinArchs])
@ -882,7 +885,7 @@ List<Target> _targetsForOS(build_info.TargetPlatform targetPlatform,
build_info.DarwinArch.x86_64,
build_info.DarwinArch.arm64
];
return darwinArchs.map(getNativeMacOSTarget).toList();
return darwinArchs.map(getNativeMacOSArchitecture).toList();
case OS.android:
final String? androidArchsEnvironment =
environmentDefines[build_info.kAndroidArchs];
@ -890,7 +893,7 @@ List<Target> _targetsForOS(build_info.TargetPlatform targetPlatform,
targetPlatform,
androidArchsEnvironment,
);
return androidArchs.map(getNativeAndroidTarget).toList();
return androidArchs.map(getNativeAndroidArchitecture).toList();
case OS.iOS:
final List<build_info.DarwinArch> iosArchs =
_emptyToNull(environmentDefines[build_info.kIosArchs])
@ -898,24 +901,22 @@ List<Target> _targetsForOS(build_info.TargetPlatform targetPlatform,
.map(build_info.getIOSArchForName)
.toList() ??
<build_info.DarwinArch>[build_info.DarwinArch.arm64];
return iosArchs.map(getNativeIOSTarget).toList();
return iosArchs.map(getNativeIOSArchitecture).toList();
default:
// TODO(dacoharkes): Implement other OSes. https://github.com/flutter/flutter/issues/129757
// Write the file we claim to have in the [outputs].
return <Target>[];
return <Architecture>[];
}
}
Target _getNativeTarget(build_info.TargetPlatform targetPlatform) {
Architecture _getNativeArchitecture(build_info.TargetPlatform targetPlatform) {
switch (targetPlatform) {
case build_info.TargetPlatform.linux_x64:
return Target.linuxX64;
case build_info.TargetPlatform.linux_arm64:
return Target.linuxArm64;
case build_info.TargetPlatform.windows_x64:
return Target.windowsX64;
return Architecture.x64;
case build_info.TargetPlatform.linux_arm64:
case build_info.TargetPlatform.windows_arm64:
return Target.windowsArm64;
return Architecture.arm64;
case build_info.TargetPlatform.android:
case build_info.TargetPlatform.ios:
case build_info.TargetPlatform.darwin:
@ -1097,7 +1098,7 @@ const Map<OS, Set<Architecture>> _osTargets = <OS, Set<Architecture>>{
},
};
build_info.BuildMode _getBuildMode(build_info.TargetPlatform targetPlatform, Map<String, String> environmentDefines, bool isFlutterTester) {
build_info.BuildMode _getBuildMode(Map<String, String> environmentDefines, bool isFlutterTester) {
if (isFlutterTester) {
return build_info.BuildMode.debug;
}

View File

@ -111,8 +111,8 @@ void main() {
expect(
(globals.logger as BufferLogger).traceText,
stringContainsInOrder(<String>[
'Building native assets for android_arm64 $buildMode.',
'Building native assets for android_arm64 $buildMode done.',
'Building native assets for android arm64 $buildMode.',
'Building native assets for android arm64 $buildMode done.',
]),
);

View File

@ -216,8 +216,8 @@ void main() {
expect(
(globals.logger as BufferLogger).traceText,
stringContainsInOrder(<String>[
'Building native assets for [ios_arm64, ios_x64] $buildMode.',
'Building native assets for [ios_arm64, ios_x64] $buildMode done.',
'Building native assets for ios [arm64, x64] $buildMode.',
'Building native assets for ios [arm64, x64] $buildMode done.',
]),
);
expect(environment.buildDir.childFile(InstallCodeAssets.nativeAssetsFilename), exists);

View File

@ -323,13 +323,13 @@ void main() {
nativeAssetsFileUri: nativeAssetsFileUri ,
);
final String expectedArchsBeingBuilt = flutterTester
? (isArm64 ? 'macos_arm64' : 'macos_x64')
: '[macos_arm64, macos_x64]';
? (isArm64 ? 'arm64' : 'x64')
: '[arm64, x64]';
expect(
(globals.logger as BufferLogger).traceText,
stringContainsInOrder(<String>[
'Building native assets for $expectedArchsBeingBuilt $buildMode.',
'Building native assets for $expectedArchsBeingBuilt $buildMode done.',
'Building native assets for macos $expectedArchsBeingBuilt $buildMode.',
'Building native assets for macos $expectedArchsBeingBuilt $buildMode done.',
]),
);
final String nativeAssetsFileContent = await fileSystem.file(nativeAssetsFileUri).readAsString();

View File

@ -127,13 +127,16 @@ void main() {
nativeAssetsFileUri: nativeAssetsFileUri,
);
final String expectedOS = flutterTester
? native_assets_cli.Target.current.toString()
: 'windows_x64';
? OS.current.toString()
: 'windows';
final String expectedArch = flutterTester
? Architecture.current.toString()
: 'x64';
expect(
(globals.logger as BufferLogger).traceText,
stringContainsInOrder(<String>[
'Building native assets for $expectedOS $buildMode.',
'Building native assets for $expectedOS $buildMode done.',
'Building native assets for $expectedOS $expectedArch $buildMode.',
'Building native assets for $expectedOS $expectedArch $buildMode done.',
]),
);
expect(