@IT·互联网

Flutter + Android Studio 实现多渠道打包

2023-12-22  本文已影响0人  黑炭长

网上有很多类似的文章 按照步骤 操作后 发现不能很好的解决,大概率跟java版本 gtadle版本有一定的关系,这里总结自己的实现过程,有问题欢迎留言交流

本文主要解决的问题

1、flutter 一键多渠道打包
2、分渠道导出包
3、安卓原生代码 同时可获取相应渠道标识(友盟初始化 需要在 MainActivity中预先初始化,此时需要使用渠道标识)
话不多说 直接进入正题

Flutter层面

1、获取渠道

const String.fromEnvironment('APP_CHANNEL',defaultValue: 'guanfang-app');

安卓原生

1、获取渠道配置在 app/gradle中

def dartEnvironmentVariables = [
        APP_CHANNEL: 'guanfang-app',
]
if (project.hasProperty('dart-defines')) {
    dartEnvironmentVariables = dartEnvironmentVariables + project.property('dart-defines')
            .split(',')
            .collectEntries { entry ->
//     弃用           def pair = URLDecoder.decode(entry,"UTF-8").split('=')
                def pair = new String(entry.decodeBase64(), 'UTF-8').split('=')
                [(pair.first()): pair.last()]
            }
}

2、可打印相关的数据

println("${project.property('dart-defines')}")
println project.hasProperty('dart-defines')
println dartEnvironmentVariables

3、设置渠道到本地 并 设置获取名称

defaultConfig {
  resValue("string","app_channel","${dartEnvironmentVariables.APP_CHANNEL}"
}

4、MainActivity中获取渠道

override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
        super.onCreate(savedInstanceState, persistentState)
        UMConfigure.preInit(applicationContext,"1234567890",resources.getString(R.string.app_channel));

    }

打包

1、打包和测试命令

# 调试例子1:设置渠道为应用宝。
flutter run --dart-define=CHANNEL=YYB

# 调试例子2:设置渠道为应用宝。DEBUG参数是Y
flutter run --dart-define=CHANNEL=YYB --dart-define=DEBUG=Y

#打包例子1:打包应用宝渠道包
flutter build apk --dart-define=CHANNEL=YYB

#打包例子2:打包应用宝渠道包,DEBUG参数是Y
flutter build apk --dart-define=CHANNEL=YYB --dart-define=DEBUG=Y

2、打包脚本 需要的自取

#!/bin/sh

#---------------------必须修改:渠道数组----------------#
channels=(xiaomi huawei vivo oppo yingyongbao)
# channels=(xiaomi huawei)

#当前工程绝对路径
project_path=$(pwd)

#安卓包product文件夹路径
prod_path=${project_path}/prod/apk/
#Flutter打包生成的最初地址
release_path=${project_path}/build/app/outputs/apk/release/

clean_tips="执行flutter clean(默认:n) [ y/n ]"
echo $clean_tips
read  -t 5 is_clean
if [  ! -n "${is_clean}" ];then
    is_clean="n"
fi
while([[ $is_clean != "y" ]] && [[ $is_clean != "n" ]])
do
  echo "错误!只能输入[ y/n ] !!!"
  echo $clean_tips
  read is_clean
done

tips="请输入选择渠道(默认:0) [ ALL: 0 "
c_length=${#channels[@]};
for(( i=0; i<$c_length; i++)) do
  if (($i < $c_length-1 )); then
    tips="${tips}${channels[i]}: $((i+1)) "
  else
    tips="${tips}${channels[i]}: $((i+1)) ]"
  fi
done;

echo $tips
read  -t 5 number
if [  ! -n "${number}" ];then
    number=0
fi
while(( $number < "0" || $number > $c_length ))
do
  echo "错误!只能输入0到${c_length} !!!"
  echo $tips
  read number
done

#如果有product/apk文件夹则删除,然后再创建一个空文件夹
if [ -d ${prod_path} ]; then
  rm -rf ${prod_path}
fi
#创建目录
mkdir -p ${prod_path}

if [ ${is_clean} = "y" ];then
  echo "=============== 开始清理 ==============="
    flutter clean
fi

if (($number == 0 )); then
  echo "=============== 开始构建:全部渠道包 ==============="
  for(( i=0;i<${c_length};i++)) do
    echo "正在构建:${channels[$i]} 渠道包"
    flutter build apk --no-shrink --dart-define=APP_CHANNEL=${channels[$i]}
    cp -R ${release_path}*.apk ${prod_path}
  done;
else
  echo "=============== 正在构建:${channels[$((number-1))]} 渠道包 ==============="
  flutter build apk --no-shrink --dart-define=APP_CHANNEL=${channels[$((number-1))]}
  cp -R ${release_path}*.apk ${prod_path}
fi

#判断apk目录下是否有文件
if [ "$(ls -A $prod_path)" ]; then
  echo "=============== APK包已导出:$prod_path ==============="
  open $prod_path
else
  echo '=============== APK包导出失败 ==============='
  exit 1
fi
exit 0

写在最后

以上内容是 参考多篇博客文章 加上自己开发环境的实际情况 总结出来的 在自己环境中切实 可用的 方式,若是上述内容有侵权问题 联系 马上删除,
对上述操作步骤 有疑问、操作中遇到问题 欢迎交流

上一篇下一篇

猜你喜欢

热点阅读