|
|
|
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环境正常');
|
|
|
|
}
|