继续创作,加快成长!这是我参与「日新方案 10 月更文挑战」的第5天,点击检查活动详情
总算有时间,能够安安静静地写点东西了,把解放双手系列给续下去了.好了,废话少说,直接开端.
您能在这儿看到啥
- 温故知新
- android打包流程
- android项目装备
- android终究打包
- DEMO
- 脚本地址
温故知新
往期文章
Flutter 解放双手-Shell自动化打包之装备
从第一篇文章中,咱们学习到打包全体流程图,以及脚本目录解说.如下所示
流程图如下所示 |
---|
脚本目录如下所示 |
---|
从第二篇文章中,咱们学习到参数装备、缓存装备、构建装备,到这儿基本上,咱们自动化打包的前期准备工作,基本上是完结,剩余的便是关键的打包环节.这儿咱们解说一下APK是怎样打包完结的.
android 打包流程
经过咱们分析完结后,总结出以上流程,这样更便利在编写代码的时分,减少出错率. 此刻,咱们再来看一下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 }
- 展开代码咱们来看一下里边详细的内容
从代码流程中,咱们再来总结一下
- 履行打包
- 判别打包是否成功
- 打包成功后,判别上传类型
- 开端上传蒲公英
- 翻开apk途径
- 完结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
- 履行脚本如下
如图所示,默许情况下咱们打包的环境的release,所以flutter自己导出的apk,默许便是app+budiltype.apk,即app-release.apk.那咱们怎样修改打包出的apk姓名呢.
- 修改android原生中gradle中的装备,增加修改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中,界说的一个特点.来咱们也看一下,它详细做了些什么呢 从代码中,咱们总算找到了和 –dart–define有关的代码了.经过上面的方法,咱们就能够获取到 –dart-define=CHANNEL=”1″−−dart−define=DEBUG=”1″ –dart-define=DEBUG=”build_type” 中的CHANNEL和DEBUG,对应的参数了. -
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
}
从代码上,我这边做了三个逻辑处理,分别如下:
- 构建默许途径.
- 构建全途径的
- 构建指定途径的
这样基本上就满足了咱们正常的打包需求.至此.APK自动化打包完结.
系列文章
- Flutter 解放双手-Shell自动化打包之概要
- Flutter 解放双手-Shell自动化打包之装备
- Flutter 解放双手-Shell自动化打包之IPA(未发布)
- flutter 解放双手 –dart–define(未发布)
- flutter 解放双手-flutter build(未发布)