Update for flutter 3.10.0 (#182)

Signed-off-by: Hidenori Matsubayashi <hidenori.matsubayashi@gmail.com>
This commit is contained in:
Hidenori Matsubayashi
2023-05-20 04:58:32 +09:00
committed by GitHub
parent de7b47e54f
commit 070d039f2d
22 changed files with 336 additions and 392 deletions
+1 -3
View File
@@ -1,10 +1,8 @@
// Copyright 2021 Sony Group Corporation. All rights reserved.
// Copyright 2023 Sony Group Corporation. All rights reserved.
// Copyright 2020 Samsung Electronics Co., Ltd. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter_elinux/executable.dart' as executable;
void main(List<String> args) {
+1 -1
View File
@@ -1 +1 @@
1a65d409c7a1438a34d21b60bf30a6fd5db59314
d44b5a94c976fbb65815374f61ab5392a220b084
+1 -1
View File
@@ -1 +1 @@
4d9e56e694b656610ab87fcf2efbcd226e0ed8cf
84a1e904f44f9b0e9c4510138010edcc653163f8
+11 -7
View File
@@ -1,10 +1,8 @@
// Copyright 2022 Sony Group Corporation. All rights reserved.
// Copyright 2023 Sony Group Corporation. All rights reserved.
// Copyright 2020 Samsung Electronics Co., Ltd. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter_tools/src/commands/analyze.dart';
import 'package:flutter_tools/src/globals.dart' as globals;
import 'package:flutter_tools/src/project_validator.dart';
@@ -12,17 +10,23 @@ import 'package:flutter_tools/src/project_validator.dart';
import '../elinux_plugins.dart';
class ELinuxAnalyzeCommand extends AnalyzeCommand with ELinuxExtension {
ELinuxAnalyzeCommand({bool verboseHelp = false})
ELinuxAnalyzeCommand({super.verboseHelp})
: super(
verboseHelp: verboseHelp,
fileSystem: globals.fs,
platform: globals.platform,
processManager: globals.processManager,
logger: globals.logger,
terminal: globals.terminal,
artifacts: globals.artifacts,
artifacts: globals.artifacts!,
// new ProjectValidators should be added here for the --suggestions to run
allProjectValidators: <ProjectValidator>[
GeneralInfoProjectValidator()
GeneralInfoProjectValidator(),
VariableDumpMachineProjectValidator(
logger: globals.logger,
fileSystem: globals.fs,
platform: globals.platform,
),
],
suppressAnalytics: globals.flutterUsage.suppressAnalytics,
);
}
+4 -10
View File
@@ -3,8 +3,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter_tools/src/android/build_validation.dart' as android;
import 'package:flutter_tools/src/base/analyze_size.dart';
import 'package:flutter_tools/src/base/common.dart';
@@ -57,7 +55,6 @@ class BuildPackageCommand extends BuildSubCommand
);
argParser.addOption(
'target-compiler-triple',
defaultsTo: null,
help: 'Target compiler triple for which the app is compiled. '
'e.g. aarch64-linux-gnu',
);
@@ -70,12 +67,10 @@ class BuildPackageCommand extends BuildSubCommand
);
argParser.addOption(
'target-toolchain',
defaultsTo: null,
help: 'The toolchain path for Clang.',
);
argParser.addOption(
'system-include-directories',
defaultsTo: null,
help:
'The additional system include paths to cross-compile for target platform. '
'This option is valid only '
@@ -83,7 +78,6 @@ class BuildPackageCommand extends BuildSubCommand
);
argParser.addOption(
'target-compiler-flags',
defaultsTo: null,
help: 'The extra compile flags to be applied to C and C++ compiler',
);
}
@@ -118,7 +112,7 @@ class BuildPackageCommand extends BuildSubCommand
@override
Future<FlutterCommandResult> runCommand() async {
// Not supported cross-building for x64 on arm64.
final String targetArch = stringArg('target-arch');
final String? targetArch = stringArg('target-arch');
final String hostArch = _getCurrentHostPlatformArchName();
if (hostArch != targetArch && hostArch == 'arm64') {
globals.logger
@@ -129,10 +123,10 @@ class BuildPackageCommand extends BuildSubCommand
final BuildInfo buildInfo = await getBuildInfo();
final ELinuxBuildInfo eLinuxBuildInfo = ELinuxBuildInfo(
buildInfo,
targetArch: targetArch,
targetBackendType: stringArg('target-backend-type'),
targetArch: targetArch!,
targetBackendType: stringArg('target-backend-type')!,
targetCompilerTriple: stringArg('target-compiler-triple'),
targetSysroot: stringArg('target-sysroot'),
targetSysroot: stringArg('target-sysroot')!,
targetCompilerFlags: stringArg('target-compiler-flags'),
targetToolchain: stringArg('target-toolchain'),
systemIncludeDirectories: stringArg('system-include-directories'),
+3 -5
View File
@@ -1,10 +1,8 @@
// Copyright 2021 Sony Group Corporation. All rights reserved.
// Copyright 2023 Sony Group Corporation. All rights reserved.
// Copyright 2020 Samsung Electronics Co., Ltd. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:file/file.dart';
import 'package:flutter_tools/src/base/logger.dart';
import 'package:flutter_tools/src/commands/clean.dart';
@@ -16,7 +14,7 @@ import 'package:path/path.dart';
import '../elinux_cmake_project.dart';
class ELinuxCleanCommand extends CleanCommand {
ELinuxCleanCommand({bool verbose = false}) : super(verbose: verbose);
ELinuxCleanCommand({super.verbose});
/// See: [CleanCommand.runCommand] in `clean.dart`
@override
@@ -48,7 +46,7 @@ class ELinuxCleanCommand extends CleanCommand {
} on FileSystemException catch (error) {
globals.printError('Failed to remove $path: $error');
} finally {
status?.stop();
status.stop();
}
}
}
+10 -13
View File
@@ -1,11 +1,9 @@
// Copyright 2022 Sony Group Corporation. All rights reserved.
// Copyright 2023 Sony Group Corporation. All rights reserved.
// Copyright 2020 Samsung Electronics Co., Ltd. All rights reserved.
// 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.
// @dart = 2.8
import 'dart:io';
import 'package:flutter_tools/src/base/common.dart';
@@ -30,11 +28,10 @@ const List<String> _kAvailablePlatforms = <String>[
];
class ELinuxCreateCommand extends CreateCommand {
ELinuxCreateCommand({bool verboseHelp = false})
: super(verboseHelp: verboseHelp);
ELinuxCreateCommand({super.verboseHelp});
@override
void addPlatformsOptions({String customHelp}) {
void addPlatformsOptions({String? customHelp}) {
argParser.addMultiOption(
'platforms',
help: customHelp,
@@ -47,7 +44,7 @@ class ELinuxCreateCommand extends CreateCommand {
Future<int> renderTemplate(
String templateName,
Directory directory,
Map<String, Object> context, {
Map<String, Object?> context, {
bool overwrite = false,
bool printStatusWhenWriting = true,
}) async {
@@ -67,7 +64,7 @@ class ELinuxCreateCommand extends CreateCommand {
Future<int> renderMerged(
List<String> names,
Directory directory,
Map<String, Object> context, {
Map<String, Object?> context, {
bool overwrite = false,
bool printStatusWhenWriting = true,
}) async {
@@ -79,14 +76,14 @@ class ELinuxCreateCommand extends CreateCommand {
fileSystem: globals.fs,
logger: globals.logger,
templateRenderer: globals.templateRenderer,
templateManifest: null,
templateManifest: <Uri>{},
);
return template.render(directory, context, overwriteExisting: overwrite);
}
/// See: [CreateCommand._getProjectType] in `create.dart`
bool get _shouldGeneratePlugin {
if (argResults['template'] != null) {
if (argResults!['template'] != null) {
return stringArg('template') == 'plugin';
} else if (projectDir.existsSync() && projectDir.listSync().isNotEmpty) {
return determineTemplateType() == FlutterProjectType.plugin;
@@ -114,7 +111,7 @@ class ELinuxCreateCommand extends CreateCommand {
// The dart project_name is in snake_case, this variable is the Title Case of the Project Name.
final String titleCaseProjectName = snakeCaseToTitleCase(projectName);
final Map<String, Object> templateContext = createTemplateContext(
final Map<String, Object?> templateContext = createTemplateContext(
organization: '',
projectName: projectName,
flutterRoot: '',
@@ -140,12 +137,12 @@ class ELinuxCreateCommand extends CreateCommand {
/// - [Template.render] in `template.dart`
@override
Future<FlutterCommandResult> runCommand() async {
if (argResults.rest.isEmpty) {
if (argResults!.rest.isEmpty) {
return super.runCommand();
}
final List<String> platforms = stringsArg('platforms');
bool shouldRenderELinuxTemplate = platforms.contains('elinux');
if (_shouldGeneratePlugin && !argResults.wasParsed('platforms')) {
if (_shouldGeneratePlugin && !argResults!.wasParsed('platforms')) {
shouldRenderELinuxTemplate = false;
}
if (!shouldRenderELinuxTemplate) {
+1 -4
View File
@@ -3,8 +3,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter_tools/src/commands/drive.dart';
import 'package:flutter_tools/src/globals.dart' as globals;
@@ -13,9 +11,8 @@ import '../elinux_plugins.dart';
class ELinuxDriveCommand extends DriveCommand
with ELinuxExtension, ELinuxRequiredArtifacts {
ELinuxDriveCommand({bool verboseHelp = false})
ELinuxDriveCommand({super.verboseHelp})
: super(
verboseHelp: verboseHelp,
fileSystem: globals.fs,
logger: globals.logger,
platform: globals.platform,
+20 -21
View File
@@ -1,13 +1,12 @@
// Copyright 2021 Sony Group Corporation. All rights reserved.
// Copyright 2023 Sony Group Corporation. All rights reserved.
// Copyright 2020 Samsung Electronics Co., Ltd. All rights reserved.
// 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.
// @dart = 2.8
import 'package:flutter_tools/src/base/os.dart';
import 'package:flutter_tools/src/commands/packages.dart';
import 'package:flutter_tools/src/dart/pub.dart';
import 'package:flutter_tools/src/globals.dart' as globals;
import 'package:flutter_tools/src/project.dart';
import 'package:flutter_tools/src/runner/flutter_command.dart';
@@ -21,13 +20,18 @@ import '../elinux_plugins.dart';
/// Source: [PackagesCommand] in `packages.dart`
class ELinuxPackagesCommand extends FlutterCommand {
ELinuxPackagesCommand() {
addSubcommand(ELinuxPackagesGetCommand('get', false));
addSubcommand(ELinuxPackagesInteractiveGetCommand('upgrade',
"Upgrade the current package's dependencies to latest versions."));
addSubcommand(ELinuxPackagesInteractiveGetCommand(
'add', 'Add a dependency to pubspec.yaml.'));
addSubcommand(ELinuxPackagesInteractiveGetCommand(
'remove', 'Removes a dependency from the current package.'));
addSubcommand(ELinuxPackagesGetCommand(
'get', "Get the current package's dependencies.", PubContext.pubGet));
addSubcommand(ELinuxPackagesGetCommand(
'upgrade',
"Upgrade the current package's dependencies to latest versions.",
PubContext.pubUpgrade));
addSubcommand(ELinuxPackagesGetCommand(
'add', 'Add a dependency to pubspec.yaml.', PubContext.pubAdd));
addSubcommand(ELinuxPackagesGetCommand(
'remove',
'Removes a dependency from the current package.',
PubContext.pubRemove));
addSubcommand(PackagesTestCommand());
addSubcommand(PackagesForwardCommand(
'publish', 'Publish the current package to pub.dartlang.org',
@@ -65,18 +69,13 @@ class ELinuxPackagesCommand extends FlutterCommand {
final String description = 'Commands for managing Flutter packages.';
@override
Future<FlutterCommandResult> runCommand() async => null;
Future<FlutterCommandResult> runCommand() async =>
FlutterCommandResult.fail();
}
class ELinuxPackagesGetCommand extends PackagesGetCommand
with _PostRunPluginInjection {
ELinuxPackagesGetCommand(String name, bool upgrade) : super(name, upgrade);
}
class ELinuxPackagesInteractiveGetCommand extends PackagesInteractiveGetCommand
with _PostRunPluginInjection {
ELinuxPackagesInteractiveGetCommand(String commandName, String description)
: super(commandName, description);
ELinuxPackagesGetCommand(super.commandName, super.description, super.context);
}
mixin _PostRunPluginInjection on FlutterCommand {
@@ -86,9 +85,9 @@ mixin _PostRunPluginInjection on FlutterCommand {
final FlutterCommandResult result = await super.runCommand();
if (result == FlutterCommandResult.success()) {
final String workingDirectory =
argResults.rest.isNotEmpty ? argResults.rest[0] : null;
final String target = findProjectRoot(globals.fs, workingDirectory);
final String? workingDirectory =
argResults!.rest.isNotEmpty ? argResults!.rest[0] : null;
final String? target = findProjectRoot(globals.fs, workingDirectory);
if (target == null) {
return result;
}
+9 -24
View File
@@ -1,41 +1,26 @@
// Copyright 2021 Sony Group Corporation. All rights reserved.
// Copyright 2023 Sony Group Corporation. All rights reserved.
// Copyright 2021 Samsung Electronics Co., Ltd. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter_tools/src/base/logger.dart';
import 'package:flutter_tools/src/base/platform.dart';
import 'package:flutter_tools/src/cache.dart';
import 'package:flutter_tools/src/commands/precache.dart';
import 'package:flutter_tools/src/features.dart';
import 'package:flutter_tools/src/runner/flutter_command.dart';
import 'package:meta/meta.dart';
import '../elinux_cache.dart';
class ELinuxPrecacheCommand extends PrecacheCommand {
ELinuxPrecacheCommand({
bool verboseHelp = false,
@required Cache cache,
@required Platform platform,
@required Logger logger,
@required FeatureFlags featureFlags,
super.verboseHelp,
required super.cache,
required super.platform,
required super.logger,
required super.featureFlags,
}) : _cache = cache,
_platform = platform,
super(
verboseHelp: verboseHelp,
cache: cache,
platform: platform,
logger: logger,
featureFlags: featureFlags,
) {
_platform = platform {
argParser.addFlag(
'elinux',
negatable: true,
defaultsTo: false,
help: 'Precache artifacts for Embedded Linux development.',
);
}
@@ -46,7 +31,7 @@ class ELinuxPrecacheCommand extends PrecacheCommand {
bool get _includeOtherPlatforms =>
boolArg('android') ||
DevelopmentArtifact.values.any((DevelopmentArtifact artifact) =>
boolArg(artifact.name) && argResults.wasParsed(artifact.name));
boolArg(artifact.name) && argResults!.wasParsed(artifact.name));
@override
Future<FlutterCommandResult> runCommand() async {
@@ -73,7 +58,7 @@ class ELinuxPrecacheCommand extends PrecacheCommand {
if (includeAllPlatforms || includeDefaults || _includeOtherPlatforms) {
// If the '--force' option is used, the super.runCommand() will delete
// the elinux's stamp file. It should be restored.
final String elinuxStamp = _cache.getStampFor(elinuxStampName);
final String? elinuxStamp = _cache.getStampFor(elinuxStampName);
final FlutterCommandResult result = await super.runCommand();
if (elinuxStamp != null) {
_cache.setStampFor(elinuxStampName, elinuxStamp);
+2 -5
View File
@@ -1,10 +1,8 @@
// Copyright 2021 Sony Group Corporation. All rights reserved.
// Copyright 2023 Sony Group Corporation. All rights reserved.
// Copyright 2020 Samsung Electronics Co., Ltd. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter_tools/src/base/os.dart';
import 'package:flutter_tools/src/build_info.dart';
import 'package:flutter_tools/src/cache.dart';
@@ -15,8 +13,7 @@ import '../elinux_plugins.dart';
class ELinuxRunCommand extends RunCommand
with ELinuxExtension, ELinuxRequiredArtifacts {
ELinuxRunCommand({bool verboseHelp = false})
: super(verboseHelp: verboseHelp);
ELinuxRunCommand({super.verboseHelp});
@override
Future<Set<DevelopmentArtifact>> get requiredArtifacts async =>
+2 -5
View File
@@ -1,15 +1,12 @@
// Copyright 2021 Sony Group Corporation. All rights reserved.
// Copyright 2023 Sony Group Corporation. All rights reserved.
// Copyright 2021 Samsung Electronics Co., Ltd. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter_tools/src/commands/test.dart';
import '../elinux_plugins.dart';
class ELinuxTestCommand extends TestCommand with ELinuxExtension {
ELinuxTestCommand({bool verboseHelp = false})
: super(verboseHelp: verboseHelp);
ELinuxTestCommand({super.verboseHelp});
}
+21 -23
View File
@@ -3,8 +3,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'dart:convert';
import 'dart:core';
@@ -24,8 +22,8 @@ import 'package:meta/meta.dart';
/// Source: [UpgradeCommand] in `upgrade.dart`
class ELinuxUpgradeCommand extends UpgradeCommand {
ELinuxUpgradeCommand({
@required bool verboseHelp,
}) : super(verboseHelp: verboseHelp);
required super.verboseHelp,
});
@override
Future<FlutterCommandResult> runCommand() {
@@ -50,25 +48,25 @@ class ELinuxGitTagVersion {
);
/// The git hash (or an abbreviation thereof) for this commit.
final String hash;
final String? hash;
/// The git short hash (or an abbreviation thereof) for this commit.
final String hashShort;
/// The git tag that is this version's closest ancestor.
final String gitTag;
final String? gitTag;
}
/// Source: [UpgradeCommandRunner] in `upgrade.dart`
@visibleForTesting
class ELinuxUpgradeCommandRunner {
String workingDirectory;
String? workingDirectory;
Future<FlutterCommandResult> runCommand({
@required bool force,
@required bool continueFlow,
@required bool testFlow,
@required bool verifyOnly,
required bool force,
required bool continueFlow,
required bool testFlow,
required bool verifyOnly,
}) async {
if (!continueFlow) {
await runCommandFirstHalf(
@@ -83,9 +81,9 @@ class ELinuxUpgradeCommandRunner {
}
Future<void> runCommandFirstHalf({
@required bool force,
@required bool testFlow,
@required bool verifyOnly,
required bool force,
required bool testFlow,
required bool verifyOnly,
}) async {
ELinuxGitTagVersion upstreamVersion = await fetchTaggedLatestVersion();
final ELinuxGitTagVersion currentVersion = await fetchCurrentVersion();
@@ -98,7 +96,7 @@ class ELinuxUpgradeCommandRunner {
if (currentVersion.hash == upstreamVersion.hash) {
globals.printStatus('flutter-elinux is already up to date');
globals.printStatus(upstreamVersion.gitTag);
globals.printStatus(upstreamVersion.gitTag!);
return;
}
@@ -206,8 +204,8 @@ class ELinuxUpgradeCommandRunner {
}
Future<ELinuxGitTagVersion> fetchCurrentVersion() async {
String tag;
String latestRevision;
String? tag;
String? latestRevision;
try {
RunResult result = await globals.processUtils.run(
<String>['git', 'rev-parse', '--verify', 'HEAD'],
@@ -243,14 +241,14 @@ class ELinuxUpgradeCommandRunner {
}
}
return ELinuxGitTagVersion(
latestRevision, latestRevision.substring(0, 10), tag);
latestRevision, latestRevision!.substring(0, 10), tag);
}
/// Source: [attemptReset] in `upgrade.dart` (exact copy)
Future<void> attemptReset(String newRevision) async {
Future<void> attemptReset(String? newRevision) async {
try {
await globals.processUtils.run(
<String>['git', 'reset', '--hard', newRevision],
<String>['git', 'reset', '--hard', newRevision!],
throwOnError: true,
workingDirectory: workingDirectory,
);
@@ -280,12 +278,12 @@ class ELinuxUpgradeCommandRunner {
/// Source: [runCommandSecondHalf] in `upgrade.dart`
Future<void> runCommandSecondHalf() async {
// Make sure the welcome message re-display is delayed until the end.
globals.persistentToolState.setShouldRedisplayWelcomeMessage(false);
globals.persistentToolState?.setShouldRedisplayWelcomeMessage(false);
await precacheArtifacts();
await updatePackages();
await runDoctor();
// Force the welcome message to re-display following the upgrade.
globals.persistentToolState.setShouldRedisplayWelcomeMessage(true);
globals.persistentToolState?.setShouldRedisplayWelcomeMessage(true);
}
/// Source: [precacheArtifacts] in `upgrade.dart`
@@ -311,7 +309,7 @@ class ELinuxUpgradeCommandRunner {
/// Source: [updatePackages] in `upgrade.dart`
Future<void> updatePackages() async {
globals.printStatus('');
final String projectRoot = findProjectRoot(globals.fs);
final String? projectRoot = findProjectRoot(globals.fs);
if (projectRoot != null) {
globals.printStatus('');
await pub.get(
+53 -53
View File
@@ -1,11 +1,9 @@
// Copyright 2022 Sony Group Corporation. All rights reserved.
// Copyright 2023 Sony Group Corporation. All rights reserved.
// Copyright 2020 Samsung Electronics Co., Ltd. All rights reserved.
// 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.
// @dart = 2.8
import 'dart:io';
import 'package:flutter_tools/src/artifacts.dart';
@@ -29,7 +27,6 @@ import 'package:flutter_tools/src/project.dart';
import 'elinux_builder.dart';
import 'elinux_cmake_project.dart';
import 'elinux_plugins.dart';
/// Prepares the pre-built flutter bundle.
///
@@ -67,7 +64,7 @@ abstract class ELinuxAssetBundle extends Target {
throw MissingDefineException(kBuildMode, name);
}
final BuildMode buildMode =
getBuildModeForName(environment.defines[kBuildMode]);
getBuildModeForName(environment.defines[kBuildMode]!);
final Directory outputDirectory = environment.outputDir
.childDirectory('flutter_assets')
..createSync(recursive: true);
@@ -111,7 +108,7 @@ abstract class ELinuxAssetBundle extends Target {
/// Source: [DebugAndroidApplication] in `android.dart`
class DebugELinuxApplication extends ELinuxAssetBundle {
DebugELinuxApplication(ELinuxBuildInfo buildInfo) : super(buildInfo);
DebugELinuxApplication(super.buildInfo);
@override
String get name => 'debug_elinux_application';
@@ -142,7 +139,7 @@ class DebugELinuxApplication extends ELinuxAssetBundle {
/// See: [ReleaseAndroidApplication] in `android.dart`
class ReleaseELinuxApplication extends ELinuxAssetBundle {
ReleaseELinuxApplication(ELinuxBuildInfo buildInfo) : super(buildInfo);
ReleaseELinuxApplication(super.buildInfo);
@override
String get name => 'release_elinux_application';
@@ -150,7 +147,9 @@ class ReleaseELinuxApplication extends ELinuxAssetBundle {
@override
List<Target> get dependencies => <Target>[
...super.dependencies,
ELinuxAotElf(),
ELinuxAotElf(buildInfo.targetArch == 'arm64'
? TargetPlatform.linux_arm64
: TargetPlatform.linux_x64),
ELinuxPlugins(buildInfo),
];
}
@@ -191,20 +190,23 @@ class ELinuxPlugins extends Target {
///
/// Source: [AotElfRelease] in `common.dart`
class ELinuxAotElf extends AotElfBase {
ELinuxAotElf();
const ELinuxAotElf(this.targetPlatform);
@override
String get name => 'elinux_aot_elf';
@override
List<Source> get inputs => <Source>[
const Source.pattern(
'{FLUTTER_ROOT}/packages/flutter_tools/lib/src/build_system/targets/common.dart'),
const Source.pattern('{BUILD_DIR}/app.dill'),
const Source.hostArtifact(HostArtifact.engineDartBinary),
const Source.artifact(Artifact.engineDartBinary),
const Source.artifact(Artifact.skyEnginePath),
// Any type of gen_snapshot is applicable here because engine artifacts
// are assumed to be updated at once, not one by one for each platform
// or build mode.
const Source.artifact(Artifact.genSnapshot, mode: BuildMode.release),
Source.artifact(
Artifact.genSnapshot,
platform: targetPlatform,
mode: BuildMode.release,
),
];
@override
@@ -216,13 +218,15 @@ class ELinuxAotElf extends AotElfBase {
List<Target> get dependencies => const <Target>[
KernelSnapshot(),
];
final TargetPlatform targetPlatform;
}
class NativeBundle {
NativeBundle(this.buildInfo, this.targetFile);
final ELinuxBuildInfo buildInfo;
final String targetFile;
final ELinuxBuildInfo? buildInfo;
final String? targetFile;
final ProcessUtils _processUtils = ProcessUtils(
logger: globals.logger, processManager: globals.processManager);
@@ -234,9 +238,9 @@ class NativeBundle {
// Clean up the intermediate and output directories.
final Directory eLinuxDir = eLinuxProject.editableDirectory;
final BuildMode buildMode = buildInfo.buildInfo.mode;
final BuildMode buildMode = buildInfo!.buildInfo.mode;
final Directory outputDir = environment.outputDir
.childDirectory(buildInfo.targetArch)
.childDirectory(buildInfo!.targetArch)
.childDirectory(buildMode.toString());
if (outputDir.existsSync()) {
outputDir.deleteSync(recursive: true);
@@ -264,20 +268,20 @@ class NativeBundle {
// Copy necessary files
final Directory engineDir =
_getEngineArtifactsDirectory(buildInfo.targetArch, buildMode);
_getEngineArtifactsDirectory(buildInfo!.targetArch, buildMode);
final Directory commonDir =
engineDir.parent.childDirectory('elinux-common');
final File engineBinary = engineDir.childFile('libflutter_engine.so');
// libflutter_elinux_*.so in profile mode is under the debug mode's directory.
final Directory embedderDir = _getEngineArtifactsDirectory(
buildInfo.targetArch,
buildInfo!.targetArch,
buildMode.isRelease ? buildMode : BuildMode.fromName('debug'));
final File embedder =
embedderDir.childFile(buildInfo.targetBackendType == 'gbm'
embedderDir.childFile(buildInfo!.targetBackendType == 'gbm'
? 'libflutter_elinux_gbm.so'
: buildInfo.targetBackendType == 'eglstream'
: buildInfo!.targetBackendType == 'eglstream'
? 'libflutter_elinux_eglstream.so'
: buildInfo.targetBackendType == 'x11'
: buildInfo!.targetBackendType == 'x11'
? 'libflutter_elinux_x11.so'
: 'libflutter_elinux_wayland.so');
final Directory clientWrapperDir =
@@ -302,9 +306,6 @@ class NativeBundle {
// Copy necessary files.
{
if (flutterEphemeralDir.existsSync()) {
flutterEphemeralDir.deleteSync(recursive: true);
}
flutterEphemeralDir.createSync(recursive: true);
flutterEphemeralDir
.childDirectory('cpp_client_wrapper')
@@ -335,41 +336,40 @@ class NativeBundle {
// Build the environment that needs to be set for the re-entrant flutter build
// step.
{
final Map<String, String> environment = <String, String>{
if (targetFile != null) 'FLUTTER_TARGET': targetFile,
...buildInfo.buildInfo.toEnvironmentConfig(),
};
if (globals.artifacts is LocalEngineArtifacts) {
final LocalEngineArtifacts localEngineArtifacts =
globals.artifacts as LocalEngineArtifacts;
final String engineOutPath = localEngineArtifacts.engineOutPath;
environment['FLUTTER_ENGINE'] =
final Map<String, String> environmentConfig =
buildInfo!.buildInfo.toEnvironmentConfig();
environmentConfig['FLUTTER_TARGET'] = targetFile!;
final LocalEngineInfo? localEngineInfo =
globals.artifacts?.localEngineInfo;
if (localEngineInfo != null) {
final String engineOutPath = localEngineInfo.engineOutPath;
environmentConfig['FLUTTER_ENGINE'] =
globals.fs.path.dirname(globals.fs.path.dirname(engineOutPath));
environment['LOCAL_ENGINE'] = globals.fs.path.basename(engineOutPath);
environmentConfig['LOCAL_ENGINE'] = localEngineInfo.localEngineName;
}
writeGeneratedCmakeConfig(
Cache.flutterRoot, eLinuxProject, buildInfo.buildInfo, environment);
await refreshELinuxPluginsList(eLinuxProject.parent);
writeGeneratedCmakeConfig(Cache.flutterRoot!, eLinuxProject,
buildInfo!.buildInfo, environmentConfig);
}
// Run the native build.
final String cmakeBuildType = buildMode.isPrecompiled ? 'Release' : 'Debug';
final String targetArch =
buildInfo.targetArch == 'arm64' ? 'aarch64' : 'x86_64';
buildInfo!.targetArch == 'arm64' ? 'aarch64' : 'x86_64';
final String hostArch = _getCurrentHostPlatformArchName();
final String targetCompilerTriple = buildInfo.targetCompilerTriple;
final String targetSysroot = buildInfo.targetSysroot;
final String targetCompilerFlags = buildInfo.targetCompilerFlags;
final String targetToolchain = buildInfo.targetToolchain;
final String systemIncludeDirectories = buildInfo.systemIncludeDirectories;
final String? targetCompilerTriple = buildInfo!.targetCompilerTriple;
final String targetSysroot = buildInfo!.targetSysroot;
final String? targetCompilerFlags = buildInfo!.targetCompilerFlags;
final String? targetToolchain = buildInfo!.targetToolchain;
final String? systemIncludeDirectories =
buildInfo!.systemIncludeDirectories;
RunResult result = await _processUtils.run(
<String>[
'cmake',
'-DCMAKE_BUILD_TYPE=$cmakeBuildType',
'-DFLUTTER_TARGET_BACKEND_TYPE=${buildInfo.targetBackendType}',
'-DFLUTTER_TARGET_PLATFORM=elinux-${buildInfo.targetArch}',
'-DFLUTTER_TARGET_BACKEND_TYPE=${buildInfo!.targetBackendType}',
'-DFLUTTER_TARGET_PLATFORM=elinux-${buildInfo!.targetArch}',
if (targetSysroot != '/') '-DCMAKE_SYSROOT=$targetSysroot',
if (buildInfo.targetArch != hostArch)
if (buildInfo!.targetArch != hostArch)
'-DCMAKE_SYSTEM_PROCESSOR=$targetArch',
if (systemIncludeDirectories != null)
'-DFLUTTER_SYSTEM_INCLUDE_DIRECTORIES=$systemIncludeDirectories',
@@ -394,9 +394,9 @@ class NativeBundle {
throwToolExit('Failed to cmake:\n$result');
}
final procResult = await Process.run('nproc', []);
final ProcessResult procResult = await Process.run('nproc', []);
final numProc = procResult.stdout.toString().trim();
final String numProc = procResult.stdout.toString().trim();
result = await _processUtils.run(
<String>[
@@ -470,13 +470,13 @@ String getUnixPath(String path) {
/// On Windows, appends the msys2 executables directory to PATH and returns.
String getDefaultPathVariable() {
final Map<String, String> variables = globals.platform.environment;
return variables.containsKey('PATH') ? variables['PATH'] : '';
return variables.containsKey('PATH') ? variables['PATH']! : '';
}
/// See: [CachedArtifacts._getEngineArtifactsPath]
Directory _getEngineArtifactsDirectory(String arch, BuildMode mode) {
Directory _getEngineArtifactsDirectory(String arch, BuildMode? mode) {
assert(mode != null, 'Need to specify a build mode.');
return globals.cache
.getArtifactDirectory('engine')
.childDirectory('elinux-$arch-${mode.name}');
.childDirectory('elinux-$arch-${mode!.name}');
}
+21 -26
View File
@@ -1,11 +1,9 @@
// Copyright 2021 Sony Group Corporation. All rights reserved.
// Copyright 2023 Sony Group Corporation. All rights reserved.
// Copyright 2020 Samsung Electronics Co., Ltd. All rights reserved.
// 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.
// @dart = 2.8
import 'dart:convert';
import 'package:file/file.dart';
@@ -23,7 +21,6 @@ import 'package:flutter_tools/src/commands/build_ios_framework.dart';
import 'package:flutter_tools/src/globals.dart' as globals;
import 'package:flutter_tools/src/linux/build_linux.dart';
import 'package:flutter_tools/src/project.dart';
import 'package:meta/meta.dart';
import 'elinux_build_target.dart';
import 'elinux_cmake_project.dart';
@@ -35,24 +32,23 @@ const String kTargetBackendType = 'TargetBackendType';
class ELinuxBuildInfo {
const ELinuxBuildInfo(
this.buildInfo, {
@required this.targetArch,
@required this.targetBackendType,
@required this.targetCompilerTriple,
@required this.targetSysroot,
@required this.targetCompilerFlags,
@required this.targetToolchain,
@required this.systemIncludeDirectories,
}) : assert(targetArch != null),
assert(targetBackendType != null);
required this.targetArch,
required this.targetBackendType,
required this.targetCompilerTriple,
required this.targetSysroot,
required this.targetCompilerFlags,
required this.targetToolchain,
required this.systemIncludeDirectories,
});
final BuildInfo buildInfo;
final String targetArch;
final String targetBackendType;
final String targetCompilerTriple;
final String? targetCompilerTriple;
final String targetSysroot;
final String targetCompilerFlags;
final String targetToolchain;
final String systemIncludeDirectories;
final String? targetCompilerFlags;
final String? targetToolchain;
final String? systemIncludeDirectories;
}
// ignore: avoid_classes_with_only_static_members
@@ -64,10 +60,10 @@ class ELinuxBuildInfo {
/// - [buildLinux] in `build_linux.dart` (code size)
class ELinuxBuilder {
static Future<void> buildBundle({
@required FlutterProject project,
@required ELinuxBuildInfo eLinuxBuildInfo,
@required String targetFile,
SizeAnalyzer sizeAnalyzer,
required FlutterProject project,
required ELinuxBuildInfo eLinuxBuildInfo,
required String targetFile,
SizeAnalyzer? sizeAnalyzer,
}) async {
final ELinuxProject elinuxProject = ELinuxProject.fromFlutter(project);
if (!elinuxProject.existsSync()) {
@@ -100,14 +96,12 @@ class ELinuxBuilder {
...buildInfo.toBuildSystemEnvironment(),
kTargetBackendType: eLinuxBuildInfo.targetBackendType,
},
inputs: <String, String>{
kBundleSkSLPath: buildInfo.bundleSkSLPath,
},
artifacts: globals.artifacts,
artifacts: globals.artifacts!,
fileSystem: globals.fs,
logger: globals.logger,
processManager: globals.processManager,
platform: globals.platform,
usage: globals.flutterUsage,
);
final Target target = buildInfo.isDebug
@@ -151,7 +145,7 @@ class ELinuxBuilder {
final File precompilerTrace = globals.fs
.directory(buildInfo.codeSizeDirectory)
.childFile('trace.$genSnapshotPlatform.json');
final Map<String, Object> output = await sizeAnalyzer.analyzeAotSnapshot(
final Map<String, Object?> output = await sizeAnalyzer.analyzeAotSnapshot(
aotSnapshot: codeSizeFile,
// This analysis is only supported for release builds.
outputDirectory: globals.fs.directory(
@@ -212,6 +206,7 @@ String _getTargetPlatformPlatformName(TargetPlatform targetPlatform) {
return 'linux-x64';
case TargetPlatform.android_arm64:
return 'android-arm64';
// ignore: no_default_cases
default:
return 'android-x64';
}
-2
View File
@@ -3,8 +3,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'package:flutter_tools/src/base/file_system.dart';
import 'package:flutter_tools/src/project.dart';
+69 -68
View File
@@ -3,8 +3,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'dart:async';
import 'dart:io';
@@ -20,7 +18,6 @@ import 'package:flutter_tools/src/device_port_forwarder.dart';
import 'package:flutter_tools/src/project.dart';
import 'package:flutter_tools/src/protocol_discovery.dart';
import 'package:meta/meta.dart';
import 'package:process/process.dart';
import 'elinux_builder.dart';
@@ -32,15 +29,15 @@ import 'elinux_remote_device_config.dart';
/// See: [DesktopDevice] in `desktop_device.dart`
class ELinuxDevice extends Device {
ELinuxDevice(
String id, {
@required ELinuxRemoteDeviceConfig config,
@required bool desktop,
@required String backendType,
@required String targetArch,
super.id, {
required ELinuxRemoteDeviceConfig? config,
required bool desktop,
required String backendType,
required String targetArch,
String sdkNameAndVersion = '',
@required Logger logger,
@required ProcessManager processManager,
@required OperatingSystemUtils operatingSystemUtils,
required Logger logger,
required ProcessManager processManager,
required OperatingSystemUtils operatingSystemUtils,
}) : _config = config,
_desktop = desktop,
_backendType = backendType,
@@ -54,18 +51,18 @@ class ELinuxDevice extends Device {
portForwarder = config != null && config.usesPortForwarding
? CustomDevicePortForwarder(
deviceName: config.label,
forwardPortCommand: config.forwardPortCommand,
forwardPortSuccessRegex: config.forwardPortSuccessRegex,
forwardPortCommand: config.forwardPortCommand!,
forwardPortSuccessRegex: config.forwardPortSuccessRegex!,
processManager: processManager,
logger: logger,
)
: const NoOpDevicePortForwarder(),
super(id,
super(
category: desktop ? Category.desktop : Category.mobile,
platformType: PlatformType.custom,
ephemeral: true);
final ELinuxRemoteDeviceConfig _config;
final ELinuxRemoteDeviceConfig? _config;
final bool _desktop;
final String _backendType;
final String _targetArch;
@@ -77,14 +74,14 @@ class ELinuxDevice extends Device {
final Set<Process> _runningProcesses = <Process>{};
final ELinuxLogReader _logReader = ELinuxLogReader();
int _forwardedHostPort;
int? _forwardedHostPort;
BuildMode _buildMode = BuildMode.debug;
@override
Future<bool> get isLocalEmulator async => false;
@override
Future<String> get emulatorId async => null;
Future<String?> get emulatorId async => null;
@override
Future<TargetPlatform> get targetPlatform async {
@@ -108,44 +105,47 @@ class ELinuxDevice extends Device {
String get name => 'eLinux';
@override
Future<bool> isAppInstalled(ELinuxApp app, {String userIdentifier}) async {
Future<bool> isAppInstalled(covariant ELinuxApp app,
{String? userIdentifier}) async {
return false;
}
@override
Future<bool> isLatestBuildInstalled(ELinuxApp app) async {
Future<bool> isLatestBuildInstalled(covariant ELinuxApp app) async {
return false;
}
@override
Future<bool> installApp(ELinuxApp app, {String userIdentifier}) async {
if (!await tryUninstall(appName: app.name)) {
Future<bool> installApp(covariant ELinuxApp app,
{String? userIdentifier}) async {
if (!await tryUninstall(appName: app.name!)) {
return false;
}
final String bundlePath = app.outputDirectory(_buildMode, _targetArch);
final bool result =
await tryInstall(localPath: bundlePath, appName: app.name);
await tryInstall(localPath: bundlePath, appName: app.name!);
return result;
}
@override
Future<bool> uninstallApp(ELinuxApp app, {String userIdentifier}) async {
return tryUninstall(appName: app.name);
Future<bool> uninstallApp(covariant ELinuxApp app,
{String? userIdentifier}) async {
return tryUninstall(appName: app.name!);
}
/// Source: [AndroidDevice.startApp] in `android_device.dart`
@override
Future<LaunchResult> startApp(
ELinuxApp package, {
String mainPath,
String route,
DebuggingOptions debuggingOptions,
Map<String, dynamic> platformArgs,
String? mainPath,
String? route,
DebuggingOptions? debuggingOptions,
Map<String, Object?> platformArgs = const <String, Object>{},
bool prebuiltApplication = false,
bool ipv6 = false,
String userIdentifier,
String? userIdentifier,
}) async {
if (!_desktop) {
if (!await installApp(package)) {
@@ -153,15 +153,15 @@ class ELinuxDevice extends Device {
}
final List<String> interpolated = interpolateCommand(
_config.runDebugCommand,
<String, String>{'remotePath': '/tmp/', 'appName': package.name});
_config!.runDebugCommand,
<String, String>{'remotePath': '/tmp/', 'appName': package.name!});
_logger.printStatus('Launch $package.name on ${_config.id}');
_logger.printStatus('Launch $package.name on ${_config!.id}');
final Process process = await _processManager.start(interpolated);
final ProtocolDiscovery discovery = ProtocolDiscovery.observatory(
final ProtocolDiscovery discovery = ProtocolDiscovery.vmService(
_logReader,
portForwarder: _config.usesPortForwarding ? portForwarder : null,
portForwarder: _config!.usesPortForwarding ? portForwarder : null,
hostPort: debuggingOptions?.hostVmServicePort,
devicePort: debuggingOptions?.deviceVmServicePort,
logger: _logger,
@@ -170,11 +170,11 @@ class ELinuxDevice extends Device {
_logReader.initializeProcess(process);
final Uri observatoryUri = await discovery.uri;
final Uri? observatoryUri = await discovery.uri;
await discovery.cancel();
if (_config.usesPortForwarding) {
_forwardedHostPort = observatoryUri.port;
if (_config!.usesPortForwarding) {
_forwardedHostPort = observatoryUri!.port;
}
return LaunchResult.succeeded(observatoryUri: observatoryUri);
@@ -185,27 +185,27 @@ class ELinuxDevice extends Device {
_logger.printTrace('Building app');
await buildForDevice(
package,
buildInfo: debuggingOptions.buildInfo,
buildInfo: debuggingOptions!.buildInfo,
mainPath: mainPath,
);
}
// Ensure that the executable is locatable.
final BuildMode buildMode = debuggingOptions?.buildInfo?.mode;
final bool traceStartup = platformArgs['trace-startup'] as bool ?? false;
final BuildMode buildMode = debuggingOptions!.buildInfo.mode;
final bool traceStartup = platformArgs['trace-startup'] as bool? ?? false;
final String executable = executablePathForDevice(package, buildMode);
const String executableOptions = '--bundle=./';
if (executable == null) {
_logger.printError('Unable to find executable to run');
return LaunchResult.failed();
}
//if (executable == null) {
// _logger.printError('Unable to find executable to run');
// return LaunchResult.failed();
//}
final Process process = await _processManager.start(
<String>[
executable,
executableOptions,
if (_desktop && _backendType == 'wayland') '-d',
...?debuggingOptions?.dartEntrypointArgs,
...debuggingOptions.dartEntrypointArgs,
],
environment: _computeEnvironment(debuggingOptions, traceStartup, route),
);
@@ -213,19 +213,18 @@ class ELinuxDevice extends Device {
unawaited(process.exitCode.then((_) => _runningProcesses.remove(process)));
_logReader.initializeProcess(process);
if (debuggingOptions?.buildInfo?.isRelease == true) {
if (debuggingOptions.buildInfo.isRelease == true) {
return LaunchResult.succeeded();
}
final ProtocolDiscovery observatoryDiscovery =
ProtocolDiscovery.observatory(
final ProtocolDiscovery observatoryDiscovery = ProtocolDiscovery.vmService(
_logReader,
devicePort: debuggingOptions?.deviceVmServicePort,
hostPort: debuggingOptions?.hostVmServicePort,
devicePort: debuggingOptions.deviceVmServicePort,
hostPort: debuggingOptions.hostVmServicePort,
ipv6: ipv6,
logger: _logger,
);
try {
final Uri observatoryUri = await observatoryDiscovery.uri;
final Uri? observatoryUri = await observatoryDiscovery.uri;
if (observatoryUri != null) {
onAttached(package, buildMode, process);
return LaunchResult.succeeded(observatoryUri: observatoryUri);
@@ -243,7 +242,8 @@ class ELinuxDevice extends Device {
}
@override
Future<bool> stopApp(ELinuxApp app, {String userIdentifier}) async {
Future<bool> stopApp(covariant ELinuxApp? app,
{String? userIdentifier}) async {
_maybeUnforwardPort();
bool succeeded = true;
@@ -260,7 +260,7 @@ class ELinuxDevice extends Device {
@override
FutureOr<DeviceLogReader> getLogReader({
ELinuxApp app,
covariant ELinuxApp? app,
bool includePastLogs = false,
}) =>
_logReader;
@@ -285,14 +285,14 @@ class ELinuxDevice extends Device {
Future<void> buildForDevice(
ELinuxApp package, {
String mainPath,
BuildInfo buildInfo,
String? mainPath,
BuildInfo? buildInfo,
}) async {
final FlutterProject project = FlutterProject.current();
// TODO(hidenori): change the fixed values (|targetSysroot|, |systemIncludeDirectories| and |targetCompilerTriple|)
// to the values from user-specified custom-devices feilds.
final ELinuxBuildInfo eLinuxBuildInfo = ELinuxBuildInfo(
buildInfo,
buildInfo!,
targetArch: _targetArch,
targetBackendType: _backendType,
targetCompilerTriple: null,
@@ -303,7 +303,7 @@ class ELinuxDevice extends Device {
);
await ELinuxBuilder.buildBundle(
project: project,
targetFile: mainPath,
targetFile: mainPath!,
eLinuxBuildInfo: eLinuxBuildInfo,
);
package = ELinuxApp.fromELinuxProject(project);
@@ -317,7 +317,7 @@ class ELinuxDevice extends Device {
/// Source: [DesktopDevice._computeEnvironment] in `desktop_device.dart`
Map<String, String> _computeEnvironment(
DebuggingOptions debuggingOptions, bool traceStartup, String route) {
DebuggingOptions debuggingOptions, bool traceStartup, String? route) {
int flags = 0;
final Map<String, String> environment = <String, String>{};
@@ -401,22 +401,22 @@ class ELinuxDevice extends Device {
/// Source: [tryUninstall] in `custom_device.dart`
Future<bool> tryUninstall(
{@required String appName,
Duration timeout,
{required String appName,
Duration? timeout,
Map<String, String> additionalReplacementValues =
const <String, String>{}}) async {
if (_config == null || _config.uninstallCommand == null) {
if (_config == null || _config!.uninstallCommand.isEmpty) {
// do nothing if uninstall command is not defined.
_logger.printTrace('uninstall command is not defined.');
return true;
}
final List<String> interpolated = interpolateCommand(
_config.uninstallCommand, <String, String>{'appName': appName},
_config!.uninstallCommand, <String, String>{'appName': appName},
additionalReplacementValues: additionalReplacementValues);
try {
_logger.printStatus('Uninstall $appName from ${_config.id}.');
_logger.printStatus('Uninstall $appName from ${_config!.id}.');
await _processUtils.run(interpolated,
throwOnError: true, timeout: timeout);
_logger.printStatus('Uninstallation Success');
@@ -430,17 +430,18 @@ class ELinuxDevice extends Device {
/// Source: [tryInstall] in `custom_device.dart`
Future<bool> tryInstall(
{@required String localPath,
@required String appName,
Duration timeout,
{required String localPath,
required String appName,
Duration? timeout,
Map<String, String> additionalReplacementValues =
const <String, String>{}}) async {
final List<String> interpolated = interpolateCommand(_config.installCommand,
final List<String> interpolated = interpolateCommand(
_config!.installCommand,
<String, String>{'localPath': localPath, 'appName': appName},
additionalReplacementValues: additionalReplacementValues);
try {
_logger.printStatus('Install $appName ($localPath) to ${_config.id}');
_logger.printStatus('Install $appName ($localPath) to ${_config!.id}');
await _processUtils.run(interpolated,
throwOnError: true, timeout: timeout);
_logger.printStatus('Installation Success');
+26 -29
View File
@@ -4,8 +4,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'dart:io';
import 'package:flutter_tools/src/android/android_workflow.dart';
@@ -23,7 +21,6 @@ import 'package:flutter_tools/src/fuchsia/fuchsia_workflow.dart';
import 'package:flutter_tools/src/globals.dart' as globals;
import 'package:flutter_tools/src/macos/macos_workflow.dart';
import 'package:flutter_tools/src/windows/windows_workflow.dart';
import 'package:meta/meta.dart';
import 'package:process/process.dart';
import 'elinux_device.dart';
@@ -40,19 +37,19 @@ class ELinuxDeviceManager extends FlutterDeviceManager {
processManager: globals.processManager,
platform: globals.platform,
androidSdk: globals.androidSdk,
iosSimulatorUtils: globals.iosSimulatorUtils,
iosSimulatorUtils: globals.iosSimulatorUtils!,
featureFlags: featureFlags,
fileSystem: globals.fs,
iosWorkflow: globals.iosWorkflow,
artifacts: globals.artifacts,
iosWorkflow: globals.iosWorkflow!,
artifacts: globals.artifacts!,
flutterVersion: globals.flutterVersion,
androidWorkflow: androidWorkflow,
fuchsiaWorkflow: fuchsiaWorkflow,
xcDevice: globals.xcdevice,
androidWorkflow: androidWorkflow!,
fuchsiaWorkflow: fuchsiaWorkflow!,
xcDevice: globals.xcdevice!,
userMessages: globals.userMessages,
windowsWorkflow: windowsWorkflow,
macOSWorkflow: context.get<MacOSWorkflow>(),
fuchsiaSdk: globals.fuchsiaSdk,
windowsWorkflow: windowsWorkflow!,
macOSWorkflow: context.get<MacOSWorkflow>()!,
fuchsiaSdk: globals.fuchsiaSdk!,
operatingSystemUtils: globals.os,
customDevicesConfig: CustomDevicesConfig(
fileSystem: globals.fs,
@@ -62,7 +59,7 @@ class ELinuxDeviceManager extends FlutterDeviceManager {
);
final ELinuxDeviceDiscovery _eLinuxDeviceDiscovery = ELinuxDeviceDiscovery(
eLinuxWorkflow: eLinuxWorkflow,
eLinuxWorkflow: eLinuxWorkflow!,
logger: globals.logger,
processManager: globals.processManager,
);
@@ -77,9 +74,9 @@ class ELinuxDeviceManager extends FlutterDeviceManager {
/// Device discovery for eLinux devices.
class ELinuxDeviceDiscovery extends PollingDeviceDiscovery {
ELinuxDeviceDiscovery({
@required ELinuxWorkflow eLinuxWorkflow,
@required ProcessManager processManager,
@required Logger logger,
required ELinuxWorkflow eLinuxWorkflow,
required ProcessManager processManager,
required Logger logger,
}) : _eLinuxWorkflow = eLinuxWorkflow,
_logger = logger,
_processManager = processManager,
@@ -105,7 +102,7 @@ class ELinuxDeviceDiscovery extends PollingDeviceDiscovery {
bool get canListAnything => _eLinuxWorkflow.canListDevices;
@override
Future<List<Device>> pollingGetDevices({Duration timeout}) async {
Future<List<Device>> pollingGetDevices({Duration? timeout}) async {
if (!canListAnything) {
return const <Device>[];
}
@@ -119,11 +116,11 @@ class ELinuxDeviceDiscovery extends PollingDeviceDiscovery {
desktop: true,
targetArch: _getCurrentHostPlatformArchName(),
backendType: 'wayland',
logger: _logger ?? globals.logger,
processManager: _processManager ?? globals.processManager,
logger: _logger,
processManager: _processManager,
operatingSystemUtils: OperatingSystemUtils(
fileSystem: globals.fs,
logger: _logger ?? globals.logger,
logger: _logger,
platform: globals.platform,
processManager: const LocalProcessManager(),
)),
@@ -134,11 +131,11 @@ class ELinuxDeviceDiscovery extends PollingDeviceDiscovery {
desktop: true,
targetArch: _getCurrentHostPlatformArchName(),
backendType: 'x11',
logger: _logger ?? globals.logger,
processManager: _processManager ?? globals.processManager,
logger: _logger,
processManager: _processManager,
operatingSystemUtils: OperatingSystemUtils(
fileSystem: globals.fs,
logger: _logger ?? globals.logger,
logger: _logger,
platform: globals.platform,
processManager: const LocalProcessManager(),
)),
@@ -163,18 +160,18 @@ class ELinuxDeviceDiscovery extends PollingDeviceDiscovery {
}
if (result.exitCode == 0 &&
stdout.contains(remoteDevice.pingSuccessRegex)) {
stdout.contains(remoteDevice.pingSuccessRegex!)) {
final ELinuxDevice device = ELinuxDevice(remoteDevice.id,
config: remoteDevice,
desktop: false,
targetArch: remoteDevice.platform,
backendType: remoteDevice.backend,
targetArch: remoteDevice.platform!,
backendType: remoteDevice.backend!,
sdkNameAndVersion: remoteDevice.sdkNameAndVersion,
logger: _logger ?? globals.logger,
processManager: _processManager ?? globals.processManager,
logger: _logger,
processManager: _processManager,
operatingSystemUtils: OperatingSystemUtils(
fileSystem: globals.fs,
logger: _logger ?? globals.logger,
logger: _logger,
platform: globals.platform,
processManager: const LocalProcessManager(),
));
+30 -29
View File
@@ -1,10 +1,8 @@
// Copyright 2022 Sony Group Corporation. All rights reserved.
// Copyright 2023 Sony Group Corporation. All rights reserved.
// Copyright 2020 Samsung Electronics Co., Ltd. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'dart:io';
import 'package:flutter_tools/src/base/context.dart';
@@ -13,12 +11,11 @@ import 'package:flutter_tools/src/base/user_messages.dart';
import 'package:flutter_tools/src/base/version.dart';
import 'package:flutter_tools/src/doctor.dart';
import 'package:flutter_tools/src/doctor_validator.dart';
import 'package:meta/meta.dart';
import 'package:process/process.dart';
ELinuxWorkflow get eLinuxWorkflow => context.get<ELinuxWorkflow>();
ELinuxValidator get eLinuxValidator => context.get<ELinuxValidator>();
ELinuxWorkflow? get eLinuxWorkflow => context.get<ELinuxWorkflow>();
ELinuxValidator? get eLinuxValidator => context.get<ELinuxValidator>();
/// See: [_DefaultDoctorValidatorsProvider] in `doctor.dart`
class ELinuxDoctorValidatorsProvider implements DoctorValidatorsProvider {
@@ -28,7 +25,7 @@ class ELinuxDoctorValidatorsProvider implements DoctorValidatorsProvider {
DoctorValidatorsProvider.defaultInstance.validators;
return <DoctorValidator>[
validators.first,
eLinuxValidator,
eLinuxValidator!,
...validators.sublist(1)
];
}
@@ -36,28 +33,28 @@ class ELinuxDoctorValidatorsProvider implements DoctorValidatorsProvider {
@override
List<Workflow> get workflows => <Workflow>[
...DoctorValidatorsProvider.defaultInstance.workflows,
eLinuxWorkflow,
eLinuxWorkflow!,
];
}
/// See: [_VersionInfo] in `linux_doctor.dart`
class _VersionInfo {
_VersionInfo(this.description) {
final String versionString = RegExp(r'[0-9]+\.[0-9]+(?:\.[0-9]+)?')
final String? versionString = RegExp(r'[0-9]+\.[0-9]+(?:\.[0-9]+)?')
.firstMatch(description)
?.group(0);
number = Version.parse(versionString);
}
String description;
Version number;
Version? number;
}
/// See: [LinuxDoctorValidator] in `linux_doctor.dart`
class ELinuxValidator extends DoctorValidator {
ELinuxValidator({
@required ProcessManager processManager,
@required UserMessages userMessages,
required ProcessManager processManager,
required UserMessages userMessages,
}) : _processManager = processManager,
_userMessages = userMessages,
super('eLinux toolchain - develop for embedded Linux devices');
@@ -85,10 +82,11 @@ class ELinuxValidator extends DoctorValidator {
@override
Future<ValidationResult> validate() async {
ValidationType validationType = ValidationType.installed;
ValidationType validationType = ValidationType.success;
final List<ValidationMessage> messages = <ValidationMessage>[];
final Map<String, _VersionInfo> installedVersions = <String, _VersionInfo>{
final Map<String, _VersionInfo?> installedVersions =
<String, _VersionInfo?>{
// Sort the check to make the call order predictable for unit tests.
for (String binary in _requiredBinaryVersions.keys.toList()..sort())
binary: await _getBinaryVersion(binary)
@@ -96,23 +94,24 @@ class ELinuxValidator extends DoctorValidator {
// Determine overall validation level.
if (installedVersions.values
.any((_VersionInfo versionInfo) => versionInfo?.number == null)) {
.any((_VersionInfo? versionInfo) => versionInfo?.number == null)) {
validationType = ValidationType.missing;
} else if (installedVersions.keys.any((String binary) =>
installedVersions[binary].number < _requiredBinaryVersions[binary])) {
installedVersions[binary]!.number! <
_requiredBinaryVersions[binary]!)) {
validationType = ValidationType.partial;
}
// Message for Clang.
{
final _VersionInfo version = installedVersions[kClangBinary];
final _VersionInfo? version = installedVersions[kClangBinary];
if (version == null || version.number == null) {
messages.add(ValidationMessage.error(_userMessages.clangMissing));
} else {
assert(_requiredBinaryVersions.containsKey(kClangBinary));
messages.add(ValidationMessage(version.description));
final Version requiredVersion = _requiredBinaryVersions[kClangBinary];
if (version.number < requiredVersion) {
final Version requiredVersion = _requiredBinaryVersions[kClangBinary]!;
if (version.number! < requiredVersion) {
messages.add(ValidationMessage.error(
_userMessages.clangTooOld(requiredVersion.toString())));
}
@@ -121,14 +120,14 @@ class ELinuxValidator extends DoctorValidator {
// Message for CMake.
{
final _VersionInfo version = installedVersions[kCmakeBinary];
final _VersionInfo? version = installedVersions[kCmakeBinary];
if (version == null || version.number == null) {
messages.add(ValidationMessage.error(_userMessages.cmakeMissing));
} else {
assert(_requiredBinaryVersions.containsKey(kCmakeBinary));
messages.add(ValidationMessage(version.description));
final Version requiredVersion = _requiredBinaryVersions[kCmakeBinary];
if (version.number < requiredVersion) {
final Version requiredVersion = _requiredBinaryVersions[kCmakeBinary]!;
if (version.number! < requiredVersion) {
messages.add(ValidationMessage.error(
_userMessages.cmakeTooOld(requiredVersion.toString())));
}
@@ -137,7 +136,7 @@ class ELinuxValidator extends DoctorValidator {
// Message for pkg-config.
{
final _VersionInfo version = installedVersions[kPkgConfigBinary];
final _VersionInfo? version = installedVersions[kPkgConfigBinary];
if (version == null || version.number == null) {
messages.add(ValidationMessage.error(_userMessages.pkgConfigMissing));
} else {
@@ -146,8 +145,8 @@ class ELinuxValidator extends DoctorValidator {
messages.add(ValidationMessage(
_userMessages.pkgConfigVersion(version.description)));
final Version requiredVersion =
_requiredBinaryVersions[kPkgConfigBinary];
if (version.number < requiredVersion) {
_requiredBinaryVersions[kPkgConfigBinary]!;
if (version.number! < requiredVersion) {
messages.add(ValidationMessage.error(
_userMessages.pkgConfigTooOld(requiredVersion.toString())));
}
@@ -174,8 +173,8 @@ class ELinuxValidator extends DoctorValidator {
}
/// See: [_getBinaryVersion] in `linux_doctor.dart`
Future<_VersionInfo> _getBinaryVersion(String binary) async {
ProcessResult result;
Future<_VersionInfo?> _getBinaryVersion(String binary) async {
ProcessResult? result;
try {
result = await _processManager.run(<String>[
binary,
@@ -183,6 +182,8 @@ class ELinuxValidator extends DoctorValidator {
]);
} on ArgumentError {
// ignore error.
} on ProcessException {
// ignore error.
}
if (result == null || result.exitCode != 0) {
return null;
@@ -193,7 +194,7 @@ class ELinuxValidator extends DoctorValidator {
/// See: [_libraryIsPresent] in `linux_doctor.dart`
Future<bool> _libraryIsPresent(String library) async {
ProcessResult result;
ProcessResult? result;
try {
result = await _processManager.run(<String>[
'pkg-config',
@@ -212,7 +213,7 @@ class ELinuxValidator extends DoctorValidator {
/// See: [AndroidWorkflow] in `android_workflow.dart`
class ELinuxWorkflow extends Workflow {
ELinuxWorkflow({
@required OperatingSystemUtils operatingSystemUtils,
required OperatingSystemUtils operatingSystemUtils,
}) : _operatingSystemUtils = operatingSystemUtils;
final OperatingSystemUtils _operatingSystemUtils;
+9 -12
View File
@@ -1,10 +1,8 @@
// Copyright 2021 Sony Group Corporation. All rights reserved.
// Copyright 2023 Sony Group Corporation. All rights reserved.
// 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.
// @dart = 2.8
import 'package:file/file.dart';
import 'package:flutter_tools/src/application_package.dart';
import 'package:flutter_tools/src/base/file_system.dart';
@@ -13,7 +11,6 @@ import 'package:flutter_tools/src/cmake.dart';
import 'package:flutter_tools/src/flutter_application_package.dart';
import 'package:flutter_tools/src/globals.dart' as globals;
import 'package:flutter_tools/src/project.dart';
import 'package:meta/meta.dart';
import 'elinux_cmake_project.dart';
@@ -28,10 +25,10 @@ class ELinuxApplicationPackageFactory extends FlutterApplicationPackageFactory {
);
@override
Future<ApplicationPackage> getPackageForPlatform(
Future<ApplicationPackage?> getPackageForPlatform(
TargetPlatform platform, {
BuildInfo buildInfo,
File applicationBinary,
BuildInfo? buildInfo,
File? applicationBinary,
}) async {
if (platform == TargetPlatform.tester) {
return applicationBinary == null
@@ -44,7 +41,7 @@ class ELinuxApplicationPackageFactory extends FlutterApplicationPackageFactory {
}
abstract class ELinuxApp extends ApplicationPackage {
ELinuxApp({@required String projectBundleId}) : super(id: projectBundleId);
ELinuxApp({required String projectBundleId}) : super(id: projectBundleId);
factory ELinuxApp.fromELinuxProject(FlutterProject project) {
return BuildableELinuxApp(
@@ -69,8 +66,8 @@ abstract class ELinuxApp extends ApplicationPackage {
class PrebuiltELinuxApp extends ELinuxApp {
PrebuiltELinuxApp({
@required String executable,
@required String outputDirectory,
required String executable,
required String outputDirectory,
}) : _executable = executable,
_outputDirectory = outputDirectory,
super(projectBundleId: executable);
@@ -90,14 +87,14 @@ class PrebuiltELinuxApp extends ELinuxApp {
}
class BuildableELinuxApp extends ELinuxApp {
BuildableELinuxApp({@required this.project})
BuildableELinuxApp({required this.project})
: super(projectBundleId: project.parent.manifest.appName);
final ELinuxProject project;
@override
String executable(BuildMode buildMode, String targetArch) {
final String binaryName = getCmakeExecutableName(project);
final String? binaryName = getCmakeExecutableName(project);
return globals.fs.path.join(
'build/elinux/',
targetArch,
+40 -47
View File
@@ -1,11 +1,9 @@
// Copyright 2022 Sony Group Corporation. All rights reserved.
// Copyright 2023 Sony Group Corporation. All rights reserved.
// Copyright 2020 Samsung Electronics Co., Ltd. All rights reserved.
// 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.
// @dart = 2.8
import 'dart:convert';
import 'package:file/file.dart';
@@ -23,7 +21,6 @@ import 'package:flutter_tools/src/plugins.dart';
import 'package:flutter_tools/src/project.dart';
import 'package:flutter_tools/src/runner/flutter_command.dart';
import 'package:meta/meta.dart';
import 'package:package_config/package_config.dart';
import 'package:path/path.dart' as path;
import 'package:yaml/yaml.dart';
@@ -33,8 +30,8 @@ import 'elinux_cmake_project.dart';
/// Source: [LinuxPlugin] in `platform_plugins.dart`
class ELinuxPlugin extends PluginPlatform implements NativeOrDartPlugin {
ELinuxPlugin({
@required this.name,
@required this.directory,
required this.name,
required this.directory,
this.pluginClass,
this.dartPluginClass,
this.ffiPlugin,
@@ -49,24 +46,21 @@ class ELinuxPlugin extends PluginPlatform implements NativeOrDartPlugin {
List<String> dependencies) {
assert(validate(yaml));
// Treat 'none' as not present. See https://github.com/flutter/flutter/issues/57497.
String pluginClass = yaml[kPluginClass] as String;
String? pluginClass = yaml[kPluginClass] as String;
if (pluginClass == 'none') {
pluginClass = null;
}
return ELinuxPlugin(
name: name,
directory: directory,
pluginClass: yaml[kPluginClass] as String,
dartPluginClass: yaml[kDartPluginClass] as String,
ffiPlugin: yaml[kFfiPlugin] as bool,
defaultPackage: yaml[kDefaultPackage] as String,
pluginClass: yaml[kPluginClass] as String?,
dartPluginClass: yaml[kDartPluginClass] as String?,
ffiPlugin: yaml[kFfiPlugin] as bool?,
defaultPackage: yaml[kDefaultPackage] as String?,
dependencies: dependencies);
}
static bool validate(YamlMap yaml) {
if (yaml == null) {
return false;
}
return yaml[kPluginClass] is String ||
yaml[kDartPluginClass] is String ||
yaml[kFfiPlugin] == true ||
@@ -77,11 +71,11 @@ class ELinuxPlugin extends PluginPlatform implements NativeOrDartPlugin {
final String name;
final Directory directory;
final String pluginClass;
final String dartPluginClass;
final List<String> dependencies;
final bool ffiPlugin;
final String defaultPackage;
final String? pluginClass;
final String? dartPluginClass;
final List<String>? dependencies;
final bool? ffiPlugin;
final String? defaultPackage;
@override
bool hasMethodChannel() => pluginClass != null;
@@ -97,9 +91,9 @@ class ELinuxPlugin extends PluginPlatform implements NativeOrDartPlugin {
return <String, dynamic>{
'name': name,
if (pluginClass != null) 'class': pluginClass,
if (pluginClass != null) 'filename': _filenameForCppClass(pluginClass),
if (pluginClass != null) 'filename': _filenameForCppClass(pluginClass!),
if (dartPluginClass != null) 'dartPluginClass': dartPluginClass,
if (ffiPlugin != null && ffiPlugin) kFfiPlugin: true,
if (ffiPlugin != null && ffiPlugin!) kFfiPlugin: true,
if (defaultPackage != null) kDefaultPackage: defaultPackage,
};
}
@@ -116,12 +110,12 @@ String _filenameForCppClass(String className) {
/// See: [FlutterCommand.verifyThenRunCommand] in `flutter_command.dart`
mixin ELinuxExtension on FlutterCommand {
String _entrypoint;
String? _entrypoint;
bool get _usesTargetOption => argParser.options.containsKey('target');
@override
Future<FlutterCommandResult> verifyThenRunCommand(String commandPath) async {
Future<FlutterCommandResult> verifyThenRunCommand(String? commandPath) async {
if (super.shouldRunPub) {
// TODO(swift-kim): Should run pub get first before injecting plugins.
await ensureReadyForELinuxTooling(FlutterProject.current());
@@ -164,7 +158,7 @@ Future<String> _createEntrypoint(
final LanguageVersion languageVersion = determineLanguageVersion(
globals.fs.file(targetFile),
packageConfig[flutterProject.manifest.appName],
Cache.flutterRoot,
Cache.flutterRoot!,
);
final Uri mainUri = globals.fs.file(targetFile).absolute.uri;
@@ -261,7 +255,7 @@ bool _writeELinuxFlutterPluginsListLegacy(
flutterPluginsBuffer
.write('${plugin.name}=${globals.fsUtils.escapePath(plugin.path)}\n');
}
final String oldPluginFileContent = _readFileContent(pluginsFile);
final String? oldPluginFileContent = _readFileContent(pluginsFile);
final String pluginFileContent = flutterPluginsBuffer.toString();
pluginsFile.writeAsStringSync(pluginFileContent, flush: true);
@@ -361,7 +355,7 @@ List<Map<String, Object>> _filterELinuxPluginsByPlatform(
_kFlutterPluginsNameKey: plugin.name,
_kFlutterPluginsPathKey: globals.fsUtils.escapePath(plugin.path),
_kFlutterPluginsDependenciesKey: <String>[
...plugin.dependencies.where(pluginNames.contains)
...plugin.dependencies!.where(pluginNames.contains)
],
});
}
@@ -379,7 +373,7 @@ List<Object> _createPluginLegacyDependencyGraph(List<ELinuxPlugin> plugins) {
'name': plugin.name,
// Extract the plugin dependencies which happen to be plugins.
'dependencies': <String>[
...plugin.dependencies.where(pluginNames.contains)
...plugin.dependencies!.where(pluginNames.contains)
],
});
}
@@ -429,7 +423,7 @@ Future<List<ELinuxPlugin>> findELinuxPlugins(
);
for (final Package package in packageConfig.packages) {
final Uri packageRoot = package.packageUriRoot.resolve('..');
final ELinuxPlugin plugin = _pluginFromPackage(package.name, packageRoot);
final ELinuxPlugin? plugin = _pluginFromPackage(package.name, packageRoot);
if (plugin == null) {
continue;
} else if (nativeOnly &&
@@ -444,7 +438,7 @@ Future<List<ELinuxPlugin>> findELinuxPlugins(
}
/// Source: [_pluginFromPackage] in `plugins.dart`
ELinuxPlugin _pluginFromPackage(String name, Uri packageRoot) {
ELinuxPlugin? _pluginFromPackage(String name, Uri packageRoot) {
final String pubspecPath =
globals.fs.path.fromUri(packageRoot.resolve('pubspec.yaml'));
if (!globals.fs.isFileSync(pubspecPath)) {
@@ -469,11 +463,11 @@ ELinuxPlugin _pluginFromPackage(String name, Uri packageRoot) {
globals.printTrace('Found plugin $name at ${packageDir.path}');
final YamlMap pluginYaml = flutterConfig['plugin'] as YamlMap;
if (pluginYaml == null || pluginYaml['platforms'] == null) {
if (pluginYaml['platforms'] == null) {
return null;
}
final YamlMap platformsYaml = pluginYaml['platforms'] as YamlMap;
if (platformsYaml == null || platformsYaml[ELinuxPlugin.kConfigKey] == null) {
if (platformsYaml[ELinuxPlugin.kConfigKey] == null) {
return null;
}
final YamlMap dependencies = pubspec['dependencies'] as YamlMap;
@@ -481,9 +475,7 @@ ELinuxPlugin _pluginFromPackage(String name, Uri packageRoot) {
name,
packageDir.childDirectory('elinux'),
platformsYaml[ELinuxPlugin.kConfigKey] as YamlMap,
dependencies == null
? <String>[]
: <String>[...dependencies.keys.cast<String>()],
<String>[...dependencies.keys.cast<String>()],
);
}
@@ -627,29 +619,29 @@ void _renderTemplateToFile(String template, dynamic context, String filePath) {
/// Source: [createPluginSymlinks] in `flutter_plugins.dart`
void createPluginSymlinks(FlutterProject project, {bool force = false}) {
Map<String, Object> platformPlugins;
final String pluginFileContent =
Map<String, Object?>? platformPlugins;
final String? pluginFileContent =
_readFileContent(project.flutterPluginsDependenciesFile);
if (pluginFileContent != null) {
final Map<String, Object> pluginInfo =
json.decode(pluginFileContent) as Map<String, Object>;
final Map<String, Object?>? pluginInfo =
json.decode(pluginFileContent) as Map<String, Object?>?;
platformPlugins =
pluginInfo[_kFlutterPluginsPluginListKey] as Map<String, Object>;
pluginInfo?[_kFlutterPluginsPluginListKey] as Map<String, Object?>?;
}
platformPlugins ??= <String, Object>{};
platformPlugins ??= <String, Object?>{};
final ELinuxProject eLinuxProject = ELinuxProject.fromFlutter(project);
if (eLinuxProject.existsSync()) {
_createPlatformPluginSymlinks(
eLinuxProject.pluginSymlinkDirectory,
platformPlugins[eLinuxProject.pluginConfigKey] as List<Object>,
platformPlugins[eLinuxProject.pluginConfigKey] as List<Object?>?,
force: force,
);
}
}
/// Returns the contents of [File] or [null] if that file does not exist.
String _readFileContent(File file) {
String? _readFileContent(File file) {
return file.existsSync() ? file.readAsStringSync() : null;
}
@@ -657,7 +649,7 @@ String _readFileContent(File file) {
///
/// If [force] is true, the directory will be created only if missing.
void _createPlatformPluginSymlinks(
Directory symlinkDirectory, List<Object> platformPlugins,
Directory symlinkDirectory, List<Object?>? platformPlugins,
{bool force = false}) {
if (force && symlinkDirectory.existsSync()) {
// Start fresh to avoid stale links.
@@ -667,10 +659,10 @@ void _createPlatformPluginSymlinks(
if (platformPlugins == null) {
return;
}
for (final Map<String, Object> pluginInfo
in platformPlugins.cast<Map<String, Object>>()) {
final String name = pluginInfo[_kFlutterPluginsNameKey] as String;
final String path = pluginInfo[_kFlutterPluginsPathKey] as String;
for (final Map<String, Object?> pluginInfo
in platformPlugins.cast<Map<String, Object?>>()) {
final String name = pluginInfo[_kFlutterPluginsNameKey]! as String;
final String path = pluginInfo[_kFlutterPluginsPathKey]! as String;
final Link link = symlinkDirectory.childLink(name);
if (link.existsSync()) {
continue;
@@ -678,6 +670,7 @@ void _createPlatformPluginSymlinks(
try {
link.createSync(path);
} on FileSystemException catch (e) {
// ignore: invalid_use_of_visible_for_testing_member
handleSymlinkException(e,
platform: globals.platform,
os: globals.os,
+2 -4
View File
@@ -4,8 +4,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'dart:io';
import 'package:flutter_tools/executable.dart' as flutter;
@@ -88,11 +86,11 @@ Future<void> main(List<String> args) async {
DevicesCommand(verboseHelp: verboseHelp),
DoctorCommand(verbose: verbose),
EmulatorsCommand(),
FormatCommand(verboseHelp: verbose),
FormatCommand(),
GenerateLocalizationsCommand(
fileSystem: globals.fs,
logger: globals.logger,
artifacts: globals.artifacts,
artifacts: globals.artifacts!,
processManager: globals.processManager,
),
InstallCommand(verboseHelp: verboseHelp),