美文网首页@IT·互联网
Flutter + Android Studio 实现多渠道打包

Flutter + Android Studio 实现多渠道打包

作者: 黑炭长 | 来源:发表于2023-12-22 21:07 被阅读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
    

    写在最后

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

    相关文章

      网友评论

        本文标题:Flutter + Android Studio 实现多渠道打包

        本文链接:https://www.haomeiwen.com/subject/yijqndtx.html