1.定义环境变量
// 声明的环境
abstract class EnvName {
// 环境key
static const String envKey = "DART_DEFINE_APP_ENV";
// 环境value
static const String dev = "dev";
static const String test = "test";
static const String pro_test = "pro_test";
static const String pro = "pro";
}
class BuildConfig {
//外网正式:PRO 外网测试:PRO_TEST 内网开发:DEV 测试环境:TEST
static EnvType curEnvType = _curEnvType();
static const appEnv = String.fromEnvironment(EnvName.envKey);
static EnvType _curEnvType() {
switch (appEnv) {
case EnvName.dev:
return EnvType.DEV;
case EnvName.test:
return EnvType.TEST;
case EnvName.pro_test:
return EnvType.PRO_TEST;
case EnvName.pro:
return EnvType.PRO;
default:
return EnvType.PRO_TEST;
}
}
}
2.项目根目录下新建文件
.sh在linux上执行
#!/bin/bash
flutter build apk --dart-define=DARTDEFINE_APP_ENV=$1
#!/bin/bash
source build_env.sh pro_test
.bat文件是在windows上双击执行
@echo off
set DARTDEFINE_APP_ENV=%1
start cmd /k "flutter build apk --dart-define=DARTDEFINE_APP_ENV=%DARTDEFINE_APP_ENV%"
@echo on
call build_env.bat pro_test
3.配置包名
在android/app/build.gradle下
import java.text.SimpleDateFormat
project.archivesBaseName = "项目名称"
/// 设置默认配置参数
def dartEnvironmentVariables = [
DARTDEFINE_APP_ENV: 'dev',
]
if (project.hasProperty('dart-defines')) {
dartEnvironmentVariables = dartEnvironmentVariables + project.property('dart-defines')
.split(',')
.collectEntries { entry ->
def pair = new String(entry.decodeBase64(), "UTF-8").split('=')
[(pair.first()): pair.last()]
}
}
android.applicationVariants.all { variant ->
def buildType = variant.buildType.name
if(buildType=='release'){
def getData = new SimpleDateFormat("YYYYMMddHHmm").format(new Date(System.currentTimeMillis())).toString()
String dartDefines = ""
if(dartEnvironmentVariables.DARTDEFINE_APP_ENV=='dev'){
dartDefines = "内网开发环境"
}else if(dartEnvironmentVariables.DARTDEFINE_APP_ENV=='test'){
dartDefines = "测试环境"
}else if(dartEnvironmentVariables.DARTDEFINE_APP_ENV=='pro_test'){
dartDefines = "外网测试环境"
}else if(dartEnvironmentVariables.DARTDEFINE_APP_ENV=='pro'){
dartDefines = "生产环境"
}
variant.assembleProvider.configure {
def outputApkName = "${project.archivesBaseName}_${variant.versionName}(${variant.versionCode})_${getData}_${dartDefines}.apk"
def outputFileDir = "${project.rootDir.absolutePath}/buildOutApk/"
it.doLast {
variant.outputs.forEach { file ->
copy {
from file.outputFile
into "${outputFileDir}"
rename {
String srcFileName ->
"${outputFileDir}${outputApkName}"
}
}
println("build path:${outputFileDir}${outputApkName}")
}
}
}
}
}
4.进一步优化配置其他参数
#!/bin/bash
echo "请选择环境:"
echo "1. 开发环境 (dev)"
echo "2. 测试环境 (test)"
echo "3. 外网测试环境 (pro_test)"
echo "4. 生产环境 (pro)"
# 选择环境
echo -n "输入对应的数字 (1-4): "
read ENV_CHOICE
case $ENV_CHOICE in
1)
ENV="dev"
;;
2)
ENV="test"
;;
3)
ENV="pro_test"
;;
4)
ENV="pro"
;;
*)
echo "无效的选择,请输入 1 到 4 之间的数字。"
exit 1
;;
esac
echo "你选择的环境是: $ENV"
# 默认值设置为 false
SANDBOX="false"
PASS="false"
LOGUNITY="false"
# 询问用户是否配置其他参数
echo -n "是否配置其他参数 (y/n): "
read CONFIGURE_OTHERS
if [ "$CONFIGURE_OTHERS" = "y" ]; then
# 配置支付宝沙盒环境
echo -n "启用支付宝沙盒环境? (true/false): "
read SANDBOX_CHOICE
if [ "$SANDBOX_CHOICE" = "true" ] || [ "$SANDBOX_CHOICE" = "false" ]; then
SANDBOX=$SANDBOX_CHOICE
fi
# 配置提审版本
echo -n "启用提审版本? (true/false): "
read PASS_CHOICE
if [ "$PASS_CHOICE" = "true" ] || [ "$PASS_CHOICE" = "false" ]; then
PASS=$PASS_CHOICE
fi
# 配置打印Unity日志
echo -n "启用打印Unity日志? (true/false): "
read LOGUNITY_CHOICE
if [ "$LOGUNITY_CHOICE" = "true" ] || [ "$LOGUNITY_CHOICE" = "false" ]; then
LOGUNITY=$LOGUNITY_CHOICE
fi
fi
# 显示最终配置
echo "环境: $ENV"
echo "支付宝沙盒环境: $SANDBOX"
echo "提审版本: $PASS"
echo "打印Unity日志: $LOGUNITY"
# 构建APK
flutter build apk \
--dart-define=appEnv=$ENV \
--dart-define=appIsSandBox=$SANDBOX \
--dart-define=appIsPass=$PASS \
--dart-define=appIsLogUnity=$LOGUNITY