Files

131 lines
4.0 KiB
Dart
Raw Permalink Normal View History

2026-07-14 11:11:36 +08:00
import 'dart:convert';
import 'dart:io';
const _pinnedMdkVersion = '0.37.0';
Future<void> main(List<String> arguments) async {
try {
final projectRoot = _parseProjectRoot(arguments);
await _invalidateStaleFvpAndroidSdk(projectRoot);
} on FormatException catch (error) {
stderr.writeln('error: ${error.message}');
exitCode = 2;
} on FileSystemException catch (error) {
stderr.writeln('error: ${error.message}');
exitCode = 1;
} on StateError catch (error) {
stderr.writeln('error: ${error.message}');
exitCode = 1;
}
}
String _parseProjectRoot(List<String> arguments) {
if (arguments.isEmpty) return _defaultProjectRoot;
if (arguments.length == 2 && arguments.first == '--project-root') {
return Directory(arguments.last).absolute.path;
}
throw const FormatException(
'Usage: dart scripts/prepare_fvp_android_deps.dart '
'[--project-root <path>]',
);
}
Future<void> _invalidateStaleFvpAndroidSdk(String projectRoot) async {
final packageConfigFile = File(
'$projectRoot${Platform.pathSeparator}.dart_tool'
'${Platform.pathSeparator}package_config.json',
);
if (!await packageConfigFile.exists()) {
throw StateError(
'package_config.json not found: ${packageConfigFile.path} '
'(run flutter pub get first)',
);
}
final packageConfig = jsonDecode(await packageConfigFile.readAsString());
if (packageConfig is! Map<String, dynamic>) {
throw StateError('Invalid package_config.json root object');
}
final packages = packageConfig['packages'];
if (packages is! List) {
throw StateError('Invalid package_config.json packages list');
}
Map<String, dynamic>? fvpPackage;
for (final package in packages) {
if (package is Map<String, dynamic> && package['name'] == 'fvp') {
fvpPackage = package;
break;
}
}
if (fvpPackage == null) {
throw StateError('Package fvp not found in package_config.json');
}
final rootUriValue = fvpPackage['rootUri'];
if (rootUriValue is! String || rootUriValue.isEmpty) {
throw StateError('Package fvp has an invalid rootUri');
}
final fvpRootUri = packageConfigFile.uri.resolve(rootUriValue);
if (fvpRootUri.scheme != 'file') {
throw StateError('Unsupported fvp rootUri: $rootUriValue');
}
final fvpRootDirectory = Directory.fromUri(fvpRootUri);
final fvpAndroidDirectory = Directory(
'${fvpRootDirectory.path}${Platform.pathSeparator}android',
);
if (!await fvpAndroidDirectory.exists()) {
throw StateError(
'fvp Android directory not found: ${fvpAndroidDirectory.path}',
);
}
final sdkDirectory = Directory(
'${fvpAndroidDirectory.path}${Platform.pathSeparator}mdk-sdk',
);
final sdkArchive = File(
'${fvpAndroidDirectory.path}${Platform.pathSeparator}mdk-sdk-android.7z',
);
final versionMarker = File(
'${fvpAndroidDirectory.path}'
'${Platform.pathSeparator}.smplayer-mdk-version',
);
final findMdkFile = File(
'${sdkDirectory.path}${Platform.pathSeparator}lib'
'${Platform.pathSeparator}cmake'
'${Platform.pathSeparator}FindMDK.cmake',
);
final installedVersion = await versionMarker.exists()
? (await versionMarker.readAsString()).trim()
: '';
final sdkIsReady =
installedVersion == _pinnedMdkVersion && await findMdkFile.exists();
if (sdkIsReady) {
stdout.writeln(
'[fvp-android] mdk-sdk v$_pinnedMdkVersion is ready: '
'${sdkDirectory.path}',
);
return;
}
final displayVersion = installedVersion.isEmpty
? 'unknown'
: installedVersion;
stdout.writeln(
'[fvp-android] Invalidating cached mdk-sdk v$displayVersion; '
'the next Flutter build will download v$_pinnedMdkVersion.',
);
if (await sdkDirectory.exists()) {
await sdkDirectory.delete(recursive: true);
}
if (await sdkArchive.exists()) {
await sdkArchive.delete();
}
await versionMarker.writeAsString(_pinnedMdkVersion, flush: true);
}
String get _defaultProjectRoot =>
File.fromUri(Platform.script).parent.parent.absolute.path;