网上有很多类似的文章 按照步骤 操作后 发现不能很好的解决,大概率跟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
写在最后
以上内容是 参考多篇博客文章 加上自己开发环境的实际情况 总结出来的 在自己环境中切实 可用的 方式,若是上述内容有侵权问题 联系 马上删除,
对上述操作步骤 有疑问、操作中遇到问题 欢迎交流