继续创作,加快成长!这是我参与「日新方案 10 月更文挑战」的第5天,点击检查活动详情

总算有时间,能够安安静静地写点东西了,把解放双手系列给续下去了.好了,废话少说,直接开端.

您能在这儿看到啥

  1. 温故知新
  2. android打包流程
  3. android项目装备
  4. android终究打包
  5. DEMO
  6. 脚本地址

温故知新

往期文章

Flutter 解放双手-Shell自动化打包之概要

Flutter 解放双手-Shell自动化打包之装备

第一篇文章中,咱们学习到打包全体流程图,以及脚本目录解说.如下所示

流程图如下所示
Flutter 解放双手-Shell自动化打包之APK
脚本目录如下所示
Flutter 解放双手-Shell自动化打包之APK

第二篇文章中,咱们学习到参数装备缓存装备构建装备,到这儿基本上,咱们自动化打包的前期准备工作,基本上是完结,剩余的便是关键的打包环节.这儿咱们解说一下APK是怎样打包完结的.


android 打包流程

Flutter 解放双手-Shell自动化打包之APK

经过咱们分析完结后,总结出以上流程,这样更便利在编写代码的时分,减少出错率. 此刻,咱们再来看一下pack_apk.sh文件,看看里边的履行办法吧

# 履行打包指令
flutterBuild()
# 构建途径包
apkBuild()
# 终究履行打包apk悉数流程
buildApk()

这三个办法,就完结了完好的打包流程,详细里边的细节,咱们渐渐展开来讲.

  • buildApk()
    • 展开代码咱们来看一下里边详细的内容
      buildApk() {
         # 1.履行打包
         mycmd=apkBuild
         echo "$mycmd"
         # 2. 判别打包是否成功
         if $mycmd; then
             if [ "$project_build_type" == 1 ]; then
                 expord_path="$export_apk_release_path"
             else
                 expord_path="$export_apk_debug_path"
             fi
             echomsg "$upload_type"
             # 3. 打包成功后,判别上传类型
             if [ "$upload_type" == 2 ]; then
                 # 开端上传蒲公英
                 for f in "$expord_path"*.apk; do
                     [[ -e "$f" ]] || break
                     echo "$f"
                     uploadPgyer "$api_key" "$f"
                 done
             else
                 # 翻开apk 途径
                 echomsg "apk 打包成功"
                 open "$export_apk_release_path"
             fi
         else
             echomsg "apk 打包失败"
         fi
      }
      

从代码流程中,咱们再来总结一下

  1. 履行打包
  2. 判别打包是否成功
  3. 打包成功后,判别上传类型
  4. 开端上传蒲公英
  5. 翻开apk途径
  6. 完结apk打包
是的,没有一点问题,完全符合流程图.下面咱们再翻开剩余的两个办法吧
  apkBuild()
  flutterBuild()

这儿咱们直接跳到终究落地打包的办法里,因为apkBuild(),仅仅做了一个简略构建版别的逻辑处理,终究仍是flutterBuild() 抗下了所有(all in)

  • flutterBuild()
    • 展开代码咱们来看一下里边详细的内容
    flutterBuild() {
        echo "$build_type"
        echomsg "$upload_type"
        # 终究履行打包指令,展现出来了.
        flutter build apk --no-shrink --dart-define=CHANNEL="$1" --dart-define=DEBUG="$build_type" --"$build_type"
        if [[ $project_build_type == 1 ]]; then
            cp -R "$flutter_release_apk_path"*.apk "$export_apk_release_path"
        else
            cp -R "$flutter_debug_apk_path"*.apk "$export_apk_debug_path"
        fi
    }
    

从上面的代码中,咱们总算看到了终究的打包指令

flutter build apk --no-shrink --dart-define=CHANNEL="$1" --dart-define=DEBUG="$build_type" --"$build_type"

这个指令,一共分为三个部分

  • flutter build
    构建app系统类型,分apk,ios等等类型.
    eg: flutter build apk –release(默许类型,能够不用写)
  • –no-shrink
    不运用混杂
    如果你想运用混杂,请手动删除即可.
  • –darf-define(重点要讲)
    能够用于和项目传参数,这样就能够让咱们,最起码完成多途径分发的功能
    eg: –darf-define=name=params
    eg: 多个参数便是–darf-define=name=params –darf-define=name=params 即可

下面咱们来讲一下和 –darf-define 相互配合的便是android项目装备

android 项目装备

–dart-define=CHANNEL=”1″−−dart−define=DEBUG=”1″ –dart-define=DEBUG=”build_type”

那咱们怎样让安卓项目接收这些参数呢,下面咱们先看一下,不装备后面参数的时分,咱们来看下,打包成功后,显示的原始apk姓名.

  • flutter build apk
    • 履行脚本如下
      Flutter 解放双手-Shell自动化打包之APK

    如图所示,默许情况下咱们打包的环境的release,所以flutter自己导出的apk,默许便是app+budiltype.apk,即app-release.apk.那咱们怎样修改打包出的apk姓名呢.

  1. 修改android原生中gradle中的装备,增加修改apk姓名的代码.如下所示
    Flutter 解放双手-Shell自动化打包之APK

对应的代码如下所示

applicationVariants.all { variant ->
    variant.outputs.all { output ->
        // 设置新名称
        println(dartEnvironmentVariables.DEBUG)
        println(dartEnvironmentVariables)
        println(variant.buildType.name)
        def newApkName ="APP_${dartEnvironmentVariables.CHANNEL}_${dartEnvironmentVariables.DEBUG}_${flutterVersionName}_${flutterVersionCode.toInteger()}.apk"
        outputFileName = new File(newApkName)
    }
}

这样咱们就能够去界说apk的姓名了.细心的你会发现,上面的代码中有几个和dart有关的参数.

 dartEnvironmentVariables
 flutterVersionName
 flutterVersionCode
  • dartEnvironmentVariables
    这个是我在buidl.gradle中,界说的一个特点.来咱们也看一下,它详细做了些什么呢
    Flutter 解放双手-Shell自动化打包之APK
    从代码中,咱们总算找到了和 –dart–define有关的代码了.经过上面的方法,咱们就能够获取到 –dart-define=CHANNEL=”1″−−dart−define=DEBUG=”1″ –dart-define=DEBUG=”build_type” 中的CHANNELDEBUG,对应的参数了.
  • flutterVersionName
    flutter项目pubspec.yaml中的name: 字段
  • flutterVersionCode
    flutter项目pubspec.yaml中的version: 字段中 + 前面版别

此刻咱们设置的apk命名规范就变成如下所示:

APP_+ {app途径}_ + {buildType}_ + {flutterVersionName}_ + {flutterVersionCode}.apk

到此.apk姓名修改就装备完结了.剩余的便是打包APK时,代码的装备了.

android 终究打包

终究仍是到了这一步,总算经过前面的装备.咱们仍是来到了这儿.

经过前面的项目装备,以及pack_apk.sh,文件的编写.咱们的APK打包总算完结. 并且咱们的android项目也适配了,多途径打包的功能.便是经过 –dart–define 参数的形式,去重新编写不同途径的apk的姓名.也能够根据业务需求,做不同途径的事件处理,这儿我就不逐个解说了.

那咱们就再看一下,脚本是怎样完成多途径打包.如下所示

# 构建途径包
apkBuild() {
   echomsg "开端打包"
   if [[ $apk_chanhels_length == 0 || $upload_type == 2 ]]; then
       flutterBuild "Normal"
   elif [[ $pack_apk_channel == 0 && $apk_chanhels_length != 0 ]]; then
       echomsg "开端构建: 悉数途径包"
       for ((i = 0; i < "$apk_chanhels_length"; i++)); do
       echomsg "正在构建: ${apk_channels[$i]}途径包"
       flutterBuild apk_channels["$i"]
       done
   else
       flutterBuild apk_channels["$pack_apk_channe"]
   fi
}

从代码上,我这边做了三个逻辑处理,分别如下:

  1. 构建默许途径.
  2. 构建全途径的
  3. 构建指定途径的

这样基本上就满足了咱们正常的打包需求.至此.APK自动化打包完结.

系列文章

  • Flutter 解放双手-Shell自动化打包之概要
  • Flutter 解放双手-Shell自动化打包之装备
  • Flutter 解放双手-Shell自动化打包之IPA(未发布)
  • flutter 解放双手 –dart–define(未发布)
  • flutter 解放双手-flutter build(未发布)