You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

120 lines
3.5 KiB

import 'dart:io';
import 'dart:convert';
void main(List<String> arguments) async {
print('🚀 开始构建Flutter Android应用...');
// 默认构建 ARM64 + ARM32(推荐)
final targetPlatform = arguments.contains('--arm64-only')
? 'android-arm64'
: 'android-arm64,android-arm';
try {
// 检查Flutter环境
await checkFlutterEnvironment();
// 构建Flutter Android应用
final apkPath = await buildFlutterApp(targetPlatform);
// 生成version.json文件
await generateVersionJson(apkPath, targetPlatform);
print('✅ 构建完成!');
print('📦 APK位置: $apkPath');
} catch (e) {
print('❌ 构建过程中出现错误: $e');
exit(1);
}
}
Future<String> buildFlutterApp(String targetPlatform) async {
print('📱 正在构建Flutter Android应用...');
print('🎯 目标平台: $targetPlatform');
// 清理构建缓存
print('🧹 清理构建缓存...');
await runFlutterCommand(['clean']);
// 获取pub依赖
print('📦 获取依赖...');
await runFlutterCommand(['pub', 'get']);
// 构建APK(指定目标平台)
print('🔨 构建Release APK...');
await runFlutterCommand([
'build',
'apk',
'--release',
'--target-platform=$targetPlatform',
]);
print('✅ Flutter应用构建成功!');
// 根据目标平台生成对应的APK文件名
String apkName;
if (targetPlatform == 'android-arm64') {
apkName = 'app-arm64-release.apk';
} else if (targetPlatform == 'android-arm') {
apkName = 'app-arm-release.apk';
} else {
apkName = 'app-release.apk';
}
return 'build/app/outputs/flutter-apk/$apkName';
}
Future<void> runFlutterCommand(List<String> args) async {
final result = await Process.run('flutter', args, runInShell: true);
if (result.exitCode != 0) {
throw Exception('Flutter命令执行失败: ${result.stderr}');
}
}
Future<void> generateVersionJson(String apkPath, String targetPlatform) async {
print('📄 正在生成version.json文件...');
final apkFile = File(apkPath);
String fileSize = '未知';
if (await apkFile.exists()) {
final apkSize = await apkFile.length();
fileSize = '${(apkSize / (1024 * 1024)).toStringAsFixed(1)}MB';
print('📦 APK文件大小: $fileSize');
}
final now = DateTime.now();
final buildTime =
'${now.year}-${now.month.toString().padLeft(2, '0')}-${now.day.toString().padLeft(2, '0')} ${now.hour.toString().padLeft(2, '0')}:${now.minute.toString().padLeft(2, '0')}';
final versionInfo = {
"version": "1.0.1",
"build_number": getBuildNumber(),
"build_time": buildTime,
"target_platform": targetPlatform,
"file_size": fileSize,
"url": "http://xhota.anxincloud.cn/problem/app-release.apk",
"description": "1. 修复了xxx bug。\n2. 新增了xxx功能。\n3. 优化了用户体验。",
"platform": "android",
};
final jsonFile = File('build/app/outputs/flutter-apk/version.json');
await jsonFile.writeAsString(
const JsonEncoder.withIndent(' ').convert(versionInfo),
);
print('✅ version.json文件生成成功!');
}
String getBuildNumber() {
final now = DateTime.now();
return '${now.year}${now.month.toString().padLeft(2, '0')}${now.day.toString().padLeft(2, '0')}${now.hour.toString().padLeft(2, '0')}${now.minute.toString().padLeft(2, '0')}';
}
Future<void> checkFlutterEnvironment() async {
final result = await Process.run('flutter', ['--version'], runInShell: true);
if (result.exitCode != 0) {
throw Exception('Flutter环境检查失败');
}
print('✅ Flutter环境正常');
}