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.
119 lines
3.5 KiB
119 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环境正常'); |
|
}
|
|
|