极简的成本实现Flutter静态资源多渠道定制

1,554 阅读3分钟

前言

本文将通过巧妙的方式,以简单的成本实现flutter的静态资源多渠道配置。

Flutter多渠道如何配置?请参考往前文章:
Flutter的多渠道多资源配置【Android+iOS】
Flutter多渠道脚本自动化打包

流程分析

Android中,我们可以通过配置不同的productFlavors,通过sourcesets配置不同渠道引用的静态资源res-channel目录。最终gradle会自动帮我们生成assembleChannelReleaseassembleChannelDebug的任务。打包时只需要运行相对应的任务即可。

image.png

flutter里没有gradle帮我们生成好相关的打包脚本。那一起通过脚本来实现一个简易版的吧
简易版实现流程分析:
1、创建对应渠道的资源文件夹,里面放该渠道的静态资源
2、编写对应的脚本进行资源替换后打包,成功生成apk或xcarchive后,将资源rollback(通过git)。
3、支持渠道资源替换,方便测试。

开始

创建渠道资源文件夹_channelA。 放入该渠道定制化的图标。_是为了让渠道资源文件夹靠前,方便查看。

image.png

脚本编写
先写打包的主脚本,build_channelA.shbuild_channelA_ios.sh。相当于androidgradleassembleXXXReleasetask

脚本目录:

image.png 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}"

打包运行

image.png

关于调试

在终端运行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静态资源多渠道定制(本篇)