打包发布
调试
Flutter主要有三种运行模式
- debug : 主要用于调试代码,可以在真机和模拟器上同时运行。我们开发时运行的正是此模式。该模式下代码执行性能较差,特别是在模拟器下。
- profile:只能在真机上运行,不能在模拟器上运行。基本和Release模式一致,不同之处在于可以获取一些性能数据,用于性能测试。
- release:只能在真机上运行。对性能进行了优化,减小了安装包体积大小。发布给用户使用时正式此模式,以达到最佳的性能体验。
在发布之前,可以执行以下命令测试应用的启动时间(需真机)
flutter run --trace-startup --profile
将在Flutter工程目录在build目录下生成start_up_info.json文件,输出列出了从应用程序启动到这些跟踪事件(单位:微秒)所用的时间:
- 进入Flutter引擎时
- 展示应用第一帧时
- 初始化Flutter框架时
- 完成Flutter框架初始化时
另外,在开发中遇到一些BUG,我们可以使用Android Studio的断点调试功能,通过打断点来调试应用
更多调试工具和技巧,参见 调试文档
当我们需要发布App时,检查MaterialApp中的debugShowCheckedModeBanner是否设置为false,发布时需要去除屏幕上的debug横幅
Android
在生成正式的安卓安装包前,首先需要检查权限配置
打开项目下的\android\app\src\main\AndroidManifest.xml文件,检查是否已经配置相关权限。例如,通常debug模式默认配置网络权限,而发布模式则没有,当我们的app有网络访问需求时,需要添加如下内容
<uses-permission android:name="android.permission.INTERNET"/>
除此之外,从Android9.0开始,必须强制使用HTTPS协议,否则无法访问网络。如果我们app中使用明文的HTTP协议,则还需要配置一个属性,开启HTTP支持。在application标签中配置如下属性
android:usesCleartextTraffic="true"
以release模式生成APK文件
flutter build apk --release
# 也可省略release参数
flutter build apk
需要注意,直接使用以上命令,会生成包含32位和64位二进制文件的胖APK
为了减小安装包体积大小,可以使用如下命令打包。这将生成一个仅支持arm芯片的64位版本安装包。
flutter build apk --target-platform=android-arm64
该命令其他可选的参数android-arm、android-x64,分别代表仅生成支持arm 32位和Intel 64位芯片的安装包。
另外,也可以使用分包命令一次生成两个安装包。生成的两个包分别为arm 32 和 arm 64
flutter build apk --split-per-abi
关于签名
- 打开原生工程,选择【build】=》【generate signed bundle or apk】,可通过图形化程序生成一个签名文件
- 配置签名文件。打开【File】=》【Project Stucture】通过图形化方式配置签名文件
生成签名文件后,可以使用keytool -list -v -keystore app.jks来查看签名文件的信息(替换app.jks为自己的签名文件)
iOS
发布iOS应用到应用商店较为麻烦,需要花费99美元,注册Apple开发者计划,具体步骤可参见Flutter 官方文档
配置真机调试环境
环境安装参见Flutter 环境准备篇
配置Apple ID和证书
打开【Xcode】 -> 【Preferences】 -> 【Account】。添加 AppleId

手机连上电脑,确定手机的AppleID和电脑一致。选择【window】->【Devices and simulator】

在真机上启动调试。【设置】-【通用】-【设备管理】选择开发者并点击信任。
需注意,连接手机后,请全程保持手机为解锁状态。
这里编译使用flutter build ios命令生成iOS的包,但是内部测试时不建议使用该命令。因为生成的是未经优化的安装包,体积非常大,需要上传到Apple的App Store进行安全审查,通过之后会再次优化,此时产生的才是最终发布给用户的版本,安装包体积会大幅度减小。
那么我们想在内部测试时进行打包,则可以使用flutter build ios --profile命令,相比之下,该命令生成的包体积大小,最接近最终发布的安装包体积大小。
需要注意,以上命令生成的都是一个.app的包,而不是iOS的.ipa安装包,这里我们还需要一些步骤进行处理
- 创建一个名为
Payload的文件夹 - 拷贝生成的
.app包到Payload文件夹中 - 以
.zip格式压缩Payload文件夹,生成一个压缩文件包Payload.zip - 修改文件后缀名,例如
Product.ipa
经过以上步骤,我们就得到了一个iOS的安装包
Web
想要发布Web版本,首先检查项目对Web的兼容情况,然后执行以下命令,发布版将生成在工程目录下的/build/web中
flutter build web
服务器线上部署时,我们将生成的web目录拷贝出来,然后使用静态文件服务器进行配置,这里推荐使用Nginx。当然,我们也可以使用Aqueduct快速实现一个静态文件服务器,可参见 Aqueduct 文件服务 的文档
创建一个静态文件服务器项目
pub global run aqueduct create file_service
添加代码
@override
Controller get entryPoint {
final router = Router();
// 将路由映射到指定的文件夹
router.route("/*").link(() => FileController("web/"));
return router;
}
运行服务
pub global run aqueduct serve
访问 http://localhost:8888/
公众号“编程之路从0到1”
