Flutter蓝盾构建指南

众所周知,flutter是比较流行的跨平台方案,目前可以构建出Android,iOS,macOS,Windows,web等产物,这里只想介绍一下Android和iOS的构建产物方式,理解了这两种产物的构建,自动动手实现其他产物,应该并不是什么难事。

首先,要构建出release包,也就是用户可以安装的包,无论是在Android,还是iOS上,都是需要”证书“来签名的。两个平台对比了解如下:

平台 证书 最直接的生成方式
Android .jks keytool,免费的,谁都可以任意申请
iOS .p12 & .mobileprovision 只能去苹果开发者官网申请,or公司有提供的话,比如keystore 申请,本质上都是苹果开发者中心申请,一句话,要钱的

说个题外话,为啥要签名,一句话,证明这个产物是你生成的。

为了不花多少代价,这里,iOS我们在keystore上申请证书,申请的过程比较简单,其步骤不懂可以找keystore助手,但我们最终需要拿到下图这些证书,尤其是发布环境。因为flutter 构建需要。

image-20221207190937458

iOS配置篇

在证书申请成功的前提下,我们需要对iOS工程进行一定的配置,首先,需要下载发布环境的签名证书描述文件,然后双击添加到系统keychain里面,相信我过程很简单。然后接下来就是需要对iOS工程进行一定的配置了,使用xcode打开iOS目录。按照红框从左到右的顺序,就可以进入描述文件配置的界面,记住,因为我们是使用公司的证书,而不是自己登录的accont来获取描述文件,因此,我们一定要记住把Automatically mange signing 给反勾选掉

image-20221207191509340

很简单,配置其实就已经OK了,但别急着打包,还要补一个文件到ios工程下面,随便命名都可以,这里为了规范,取名为ExportOptions.plist

1
2
cd ios
touch ExportOptions.plist

在里面补充内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>generateAppStoreInformation</key>
<false/>
<key>manageAppVersionAndBuildNumber</key>
<true/>
<key>method</key>
<string>app-store</string>
<key>provisioningProfiles</key>
<dict>
<key>com.xxx.xxx</key>
<string>com.xxx.xxx_Production_SignProvision</string>
</dict>
<key>signingCertificate</key>
<string>Apple Distribution</string>
<key>signingStyle</key>
<string>manual</string>
<key>stripSwiftSymbols</key>
<true/>
<key>uploadSymbols</key>
<false/>
</dict>
</plist>

别忘记把里面的xxx调换为你自己的BundleID,这个很重要,搞错肯定是打不出包的。好了,接下来验证一下。

在flutter工程根目录下执行:

1
flutter build ipa --export-options-plist $PWD/ios/ExportOptions.plist

不出意外,应该是可以看到

image-20221207192201361

本地的准备工作也就基本上告一段落了,接下来就是去蓝盾上整流水线了。

流水线步骤比较清晰,第一个是选macOS环境,我这里选择的最新的系统,xcode14.0.1

image-20221207200948090

git拉取就不必多说,原理就是把项目git clone 到工作空间下;

打包产物这里就有必要详细聊一下了

1、需要准备flutter环境,这里直接在公司的镜像上托下来,思路是直接装到工作空间下,用这个flutter来跑,避免构建机上版本冲突。脚本内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

cd $WORKSPACE
ARG_FLUTTER_VERSION=3.3.6
# 这里就是git拉取代码保存flutter代码的目录,随便写
BUILD_ROOT=code/
echo "执行清理缓存"
rm -rf flutter
rm -rf /tmp/flutter_output_path.log
FLUTTER_DOWNLOAD_URL="https://mirrors.tencent.com/flutter/flutter_infra_release/releases/stable/macos/flutter_macos_${ARG_FLUTTER_VERSION}-stable.zip"
wget ${FLUTTER_DOWNLOAD_URL} --no-check-certificate -O flutter.zip
unzip flutter.zip
export PATH="$(pwd)/flutter/bin:$PATH"
echo $PATH
FLUTTER_PATH="$(pwd)/flutter/"
export PUB_HOSTED_URL=https://pub.flutter-io.cn
export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn
echo "PUB_HOSTED_URL=$PUB_HOSTED_URL"
echo "FLUTTER_STORAGE_BASE_URL=$FLUTTER_STORAGE_BASE_URL"
export PUB_CACHE=~/.pub-cache/
rm -rf ~/.pub-cache/*
rm -rf $FLUTTER_PATH/.pub-cache/*
# 进入flutter项目根目录
cd $BUILD_ROOT
flutter packages get
# 执行本地尝试成功的那个构建产物命令
flutter build ipa --export-options-plist ./ios/ExportOptions.plist

# 构建Android产物
flutter build apk


可以看到我们大部分工作在准备和本地一致的环境,就是为了执行 flutter build ipa --export-options-plist ./ios/ExportOptions.plist

2、然后就是开始构建 ipa了。

3、ipa构建好之后,将产物归档,是为了扫二维码可以安装,但我们不安装这个。

4、使用企业微信重新签名。

保存!执行起来,不出意外,可以看到构建产物中有两个ipa了,一个是使用企业证书签名过的,是可以直接在蓝盾上安装了。

Android配置篇

Android的实现过程其实比较类似,深圳还更加简单些,直接使用keystore上蓝盾的证书,思路是flutter构建出一个不签名的包

然后使用蓝盾插件签名。

因此,我们对android下面的app目录下的build.gradle进行更改,直接把buildTypes配置成这样

1
2
3
4
5
buildTypes {
release {
signingConfig null
}
}

本地执行 ,默认注意需要jdk8

1
flutter build apk

可以看到apk可以构建成功,只不过是一个未签名的,然后由蓝盾上的签名流程的处理就好了,简单的办法是,直接在构建产物环节增加一下 Android产物的构建,过程复用,免得重新搞一个shell,又得安装一下flutter环境等。

至此,整个蓝盾构建flutter工程的Android和ios包均完毕。如果比较幸运,是可以看到产物的。

graph LR
    A[输入数组] --> B[选择基准元素]
    B --> C[划分数组]
    C --> D[左侧子数组]
    C --> E[右侧子数组]
    D --> F[选择基准元素]
    E --> F
    F --> G[划分数组]
    G --> H[左侧子数组]
    G --> I[右侧子数组]
    H --> J[选择基准元素]
    I --> J
    J --> K[划分数组]
    K --> L[左侧子数组]
    K --> M[右侧子数组]
    L --> N[选择基准元素]
    M --> N
    N --> O[划分数组]
    O --> P[左侧子数组]
    O --> Q[右侧子数组]
    P --> R[选择基准元素]
    Q --> R
    R --> S[划分数组]
    S --> T[左侧子数组]
    S --> U[右侧子数组]
    T --> V[选择基准元素]
    U --> V
    V --> W[划分数组]
    W --> X[左侧子数组]
    W --> Y[右侧子数组]
    X --> Z[选择基准元素]
    Y --> Z
    Z --> AA[划分数组]
    AA --> AB[左侧子数组]
    AA --> AC[右侧子数组]
    AB --> B
    AC --> B

Flutter蓝盾构建指南
https://blog.brzhang.club/2022/12/07/flutter蓝盾构建指南/
作者
hz
发布于
2022年12月7日
许可协议