Flutter 项目一键打包多个渠道包的实现

Flutter 项目一键打包多个渠道包的实现

前言

在移动开发中,通常需要对应用进行不同渠道的打包,以满足多平台推广需求。本文将介绍如何通过一键打包脚本,实现 Flutter 项目多渠道打包,并生成指定的渠道 APK 文件。

效果图:

实现步骤

1. 定义渠道索引和名称

首先在代码中定义一个渠道索引和渠道名称的数组,以便在打包时区分不同渠道。Flutter 支持在构建应用时通过 dart-define 传递不同的构建参数,我们可以利用这一特性传递渠道标识。

// 渠道下标——打包时可更改——传给后端 int channelTypeIndex = int.fromEnvironment('CHANNEL_INDEX', defaultValue: 0);

channelTypeIndex 会根据不同的构建命令动态设置值

2. 编写打包脚本 build_channels.sh

在项目根目录新建 build_channels.sh 文件,并编写如下代码:

#!/bin/bash #运行:./build_channels.sh # 定义所有渠道的索引和对应的名称 channels=(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16) names=('官网专业版' '百度竞价1专业版' '百度竞价2专业版' '百度竞价3专业版' '百度竞价4专业版' '百度竞价5专业版' '百度竞价6专业版' '百度信息流2专业版' '360竞价1专业版' '360竞价2专业版' '360竞价3专业版' '神马竞价1专业版' '神马竞价2专业版' '神马竞价3专业版' 'uc信息流1专业版' '百度知识营销专业版' '360品专专业版') # 版本号,这里手动指定版本号,或者从其他地方读取 version="1.0.0" # 遍历每个渠道,进行打包 for i in "${!channels[@]}" do channel=${channels[$i]} name=${names[$i]} echo "Building channel $channel ($name)..." # 执行 flutter build apk 指令,为每个渠道设置不同的渠道下标 flutter build apk --release --no-tree-shake-icons --dart-define=CHANNEL_INDEX=$channel # 找到生成的 APK 并重命名为特定渠道的名称,格式为 test_版本号_渠道名.apk APK_SOURCE_PATH="build/app/outputs/flutter-apk/app-release.apk" APK_TARGET_PATH="build/app/outputs/flutter-apk/test_${version}_${name}.apk" if [ -f "$APK_SOURCE_PATH" ]; then mv "$APK_SOURCE_PATH" "$APK_TARGET_PATH" echo "Channel $channel ($name) APK built successfully and saved to $APK_TARGET_PATH" else echo "Error: APK for channel $channel ($name) not found!" fi done echo "All channels built successfully!"

3. 脚本解读

渠道索引与名称:通过 channels 数组定义了每个渠道的索引,并在 names 数组中定义了渠道名称。

版本号设置:可以在 version 变量中修改版本号,自动生成的 APK 文件将包含此版本号。

遍历打包:通过 for 循环遍历所有渠道,依次运行打包命令。

文件重命名:打包完成后,脚本会将生成的 app-release.apk 重命名为 test_版本号_渠道名.apk,以便区分不同渠道的 APK 文件。

4. 运行脚本

确保脚本具有执行权限,然后在终端运行:

./build_channels.sh

5. 运行结果

运行后,会在 build/app/outputs/flutter-apk/ 目录下生成不同渠道的 APK 文件,文件名格式为 test_1.0.0_<渠道名>.apk。

本文介绍了如何通过 Flutter 和 Shell 脚本实现自动化渠道打包,节省了手动切换渠道标识的时间,方便后续的渠道分发和管理。