flutter 一键打包多渠道

windows下打包python脚本,支持自定义参数

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import subprocess
import datetime
import shutil
import sys

# ---------- 配置 ----------
# Flutter 路径,修改为你本地 Flutter 安装路径
FLUTTER_PATH = r"D:\flutter-3.29.2\flutter_windows_3.29.2-stable\flutter\bin\flutter.bat"

# 支持的渠道
CHANNELS = ["tencent", "h5"]

# 输出目录
OUTPUT_DIR = os.path.join("build", "app", "outputs", "flutter-apk")


# ---------- 工具函数 ----------
def run_flutter_command(cmd):
    """
    在控制台执行 Flutter 命令,直接显示输出,避免 UnicodeDecodeError
    """
    try:
        process = subprocess.Popen(cmd)
        process.wait()
        return process.returncode
    except FileNotFoundError:
        print(f"错误: 未找到 Flutter 可执行文件 {FLUTTER_PATH}")
        return -1


# ---------- 主流程 ----------
def build_channels():
    now = datetime.datetime.now()
    build_time = now.strftime("%Y-%m-%d-%H%M")

    print("开始打包多渠道APK,时间:", build_time)
    print("支持的渠道:", ", ".join(CHANNELS))

    # 确保输出目录存在
    os.makedirs(OUTPUT_DIR, exist_ok=True)

    success_count = 0

    for channel in CHANNELS:
        print("\n正在打包渠道:", channel)

        # 默认环境为 prod
        env = "prod"

        if len(sys.argv) > 1:
            env = sys.argv[1]  # 第一个参数作为环境,例如 python build_channels.py dev

        print("当前打包环境:", env)

        cmd = [
            FLUTTER_PATH,
            "build",
            "apk",
            f"--dart-define=ENV={env}",
            f"--dart-define=CHANNEL={channel}",
            "--release",
        ]

        print("执行命令:", " ".join(cmd))
        ret = subprocess.run(cmd, check=False, text=True, encoding="utf-8")

        if ret.returncode != 0:
            print(f"渠道 {channel} 构建失败,请检查 Flutter 输出")
            continue

        # 原始 APK
        original_apk = os.path.join(OUTPUT_DIR, "app-release.apk")

        if not os.path.exists(original_apk):
            print(f"警告: 未找到构建后的 APK 文件 {original_apk}")
            continue

        # 新 APK 文件名
        new_apk_name = f"turbobun-prod-{channel}-{build_time}.apk"
        new_apk_path = os.path.join(OUTPUT_DIR, new_apk_name)

        # 重命名
        shutil.move(original_apk, new_apk_path)
        print(f"渠道 {channel} APK 已保存为: {new_apk_name}")
        success_count += 1

    print("\n打包完成总结:")
    print(f"成功打包渠道数: {success_count}/{len(CHANNELS)}")
    print(f"构建时间: {build_time}")


def main():
    print("Turbobun 多渠道APK打包工具")
    print("=" * 30)

    # 检查 Flutter 是否存在
    if not os.path.exists(FLUTTER_PATH):
        print(f"错误: 未找到 Flutter 可执行文件 {FLUTTER_PATH}")
        sys.exit(1)

    build_channels()


if __name__ == "__main__":
    main()


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容