build.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import subprocess
  2. import os
  3. import datetime
  4. import shutil
  5. import re
  6. import yaml
  7. # 项目根目录
  8. PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
  9. # APK 目录
  10. APK_DIR = os.path.join(PROJECT_ROOT, "build", "app", "outputs", "flutter-apk")
  11. RENAMED_DIR = os.path.join(PROJECT_ROOT,"build", "app", "outputs", "renamed")
  12. def get_version_name():
  13. # 2. 读取 Flutter 版本号(pubspec.yaml)
  14. with open("pubspec.yaml", "r", encoding="utf-8") as f:
  15. pubspec = yaml.safe_load(f)
  16. version_string = pubspec.get("version", "1.0.0+1")
  17. version_name = version_string.split('+')[0] # e.g. "1.0.3"
  18. return version_name
  19. # 删除旧 APK 文件
  20. def clean_old_apks():
  21. if not os.path.exists(APK_DIR):
  22. return
  23. for filename in os.listdir(APK_DIR):
  24. if filename.endswith(".apk"):
  25. file_path = os.path.join(APK_DIR, filename)
  26. try:
  27. os.remove(file_path)
  28. print(f"🗑️ 已删除旧 APK:{file_path}")
  29. except Exception as e:
  30. print(f"⚠️ 删除失败:{file_path} -> {e}")
  31. def clean_renamed_apks():
  32. if not os.path.exists(RENAMED_DIR):
  33. return
  34. for file in os.listdir(RENAMED_DIR):
  35. if file.endswith(".apk"):
  36. file_path = os.path.join(RENAMED_DIR, file)
  37. try:
  38. os.remove(file_path)
  39. print(f"🗑️ 删除重命名目录中的旧 APK:{file_path}")
  40. except Exception as e:
  41. print(f"⚠️ 删除失败:{file_path} -> {e}")
  42. # 执行 flutter build 命令
  43. def build_apk():
  44. result = subprocess.run(["flutter", "build", "apk", "--release"], shell=True)
  45. if result.returncode != 0:
  46. raise Exception("Flutter build failed")
  47. # 重命名 APK
  48. def rename_apk(version_name):
  49. timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
  50. src = "build/app/outputs/flutter-apk/app-release.apk"
  51. if not os.path.exists(src):
  52. raise FileNotFoundError(f"未找到 {src}")
  53. # 输出目录
  54. dst_dir = "build/app/outputs/renamed/"
  55. os.makedirs(dst_dir, exist_ok=True)
  56. dst = os.path.join(dst_dir, f"app_{version_name}_{timestamp}.apk")
  57. shutil.copy(src, dst)
  58. print(f"✅ 已生成 APK:{dst}")
  59. if __name__ == "__main__":
  60. try:
  61. version = get_version_name()
  62. print(f"📦 版本号: {version}")
  63. clean_old_apks()
  64. clean_renamed_apks()
  65. print("🚀 开始构建 APK ...")
  66. build_apk()
  67. rename_apk(version)
  68. except Exception as e:
  69. print(f"❌ 出错啦: {e}")