前言
本文将通过巧妙的方式,以简单的成本实现flutter
的静态资源多渠道配置。
Flutter多渠道如何配置?请参考往前文章:
Flutter的多渠道多资源配置【Android+iOS】
Flutter多渠道脚本自动化打包
流程分析
在Android
中,我们可以通过配置不同的productFlavors
,通过sourcesets
配置不同渠道引用的静态资源res-channel
目录。最终gradle
会自动帮我们生成assembleChannelRelease
,assembleChannelDebug
的任务。打包时只需要运行相对应的任务即可。
但flutter
里没有gradle
帮我们生成好相关的打包脚本。那一起通过脚本来实现一个简易版的吧
简易版实现流程分析:
1、创建对应渠道的资源文件夹,里面放该渠道的静态资源
2、编写对应的脚本进行资源替换后打包,成功生成apk或xcarchive后,将资源rollback(通过git)。
3、支持渠道资源替换,方便测试。
开始
创建渠道资源文件夹_channelA
。 放入该渠道定制化的图标。_
是为了让渠道资源文件夹靠前,方便查看。
脚本编写
先写打包的主脚本,build_channelA.sh
和 build_channelA_ios.sh
。相当于android
中gradle
的assembleXXXRelease
的task
。
脚本目录:
build_channelA.sh
,用来打包apk包
channel="channelA"
echo ">>>>>当前渠道:$channel"
# 步骤1:clean操作
chmod 777 ./clean_work_space/clean.sh
cd ./clean_work_space
clean.sh
cd ..
# 步骤2:资源替换
chmod 777 ./assets_swap/assets_swap.sh
cd ./assets_swap
assets_swap.sh $channel
cd ..
# 步骤3:打包apk/ios
echo ">>>>>开始编译apk"
flutter build apk --flavor ${channel} --obfuscate --split-debug-info=debugInfo --split-per-abi --dart-define=UMENG_CHANNEL=${channel}
mv ../build/app/outputs/flutter-apk/app-armeabi-v7a-${channel}-release.apk ../output_dir/${channel}.apk
# 步骤4:资源回滚
chmod 777 ./assets_swap/rollback_assets.sh
cd ./assets_swap
rollback_assets.sh $channel
build_channel_ios.sh
,用来打包ios包。步骤是一模一样的,修改打包指令而已
channel="channelA"
echo ">>>>>当前渠道:$channel"
# 步骤1:clean操作
chmod 777 ./clean_work_space/clean.sh
cd ./clean_work_space
clean.sh
cd ..
# 步骤2:资源替换
chmod 777 ./assets_swap/assets_swap.sh
cd ./assets_swap
assets_swap.sh $channel
cd ..
# 步骤3:打包aios
echo ">>>>>开始编译ios"
flutter build ios --release
flutter build ipa --flavor ${channel} --obfuscate --split-debug-info --split-per-abi --dart-define=UMENG_CHANNEL=${channel}
mv ../build/ios/archive/${channel}.xcarchive ../output_dir/${channel}.xcarchive
# 步骤4:资源回滚
chmod 777 ./assets_swap/rollback_assets.sh
cd ./assets_swap
rollback_assets.sh $channel
clean.sh
,进行clean
操作和创建文件夹操作
# 创建文件夹 与 clean操作
if [ ! -d '../../output_dir' ]; then
mkdir '../../output_dir'
fi
rm -rf ../../output_dir/*
echo ">>>>>clean已经完成"
assets_swap.sh
,进行渠道资源替换操作,直接覆盖即可
# 多渠道替换flutter静态资源,用des替换至src
channel="_$1"
echo ">>>>>正在替换渠道资源"
if [ ! -d "../../assets/${channel}" ]; then
echo ">>>>>替换失败,请检查../../assets/${channel},目录是否存在"
else
cp -rf ../../assets/${channel}/ ../../assets/
echo ">>>>>成功替换资源,当前渠道资源:${channel}"
fi
rollback_assets.sh
,进行渠道资源回滚,使用git checkout
指令操作
# 替换资源完成后,打完包后,执行rollback assets 操作,来确保git记录不会修改,
channel="_$1"
# 遍历渠道下的文件,执行checkout回退指令
function rollback(){
for file in `ls $1`
do
if [ -d "$1/$file" ]
then
rollback $1"/"$file
else
local path=$1"/"$file
local delete=$channel"/"
echo ">>>>>需要回滚的图片:${path//$delete}"
git checkout ${path//$channel"/"}
fi
done
}
rollback "../../assets/${channel}"
打包运行
关于调试
在终端运行assets_swap.sh channelA
来切换资源。使用rollback_assets.sh channelA
来回滚资源。
新增一个渠道,需要做什么?
1、按照Flutter的多渠道多资源配置【Android+iOS】配置好。
2、复制一份build_xxx.sh和build_xxx_ios.sh。修改channel即可。
3、自动化打包请参考Flutter多渠道脚本自动化打包。
最后
本文只是用一种比较巧妙的方式来暴力的实现flutter多渠道多资源。
比较简单和成本也相对低。
当然还是有很多可以优化的地方和很多其他实现的方案。
关于flutter的多渠道配置的文章就到结束了。
往期文章:
如何配置 =>
Flutter的多渠道多资源配置【Android+iOS】
自动化打包 =>
Flutter多渠道脚本自动化打包
资源定制 => 极简的成本实现Flutter静态资源多渠道定制(本篇)