Flutter应用发布

2,183 阅读6分钟

欢迎点赞,转载请注明出处

构建模式

Flutter 支持三种模式编译app:

  • 开发过程中,需要使用热重载功能,请选择debug构建模式。Debug模式下,app可以被安装在物理设备、仿真器或者模拟器上进行断点设置调试。
  • 当需要分析性能的时候,选择使用profile构建模式。在Profile模式下,一些调试能力是被保留用于分析app的性能,仿真器和模拟器不可用。
  • 发布应用的时候,需要选择使用release构建模式。Release模式下,app将被最大的优化以及最小的占用空间,不支持模拟器或者仿真器,不支持调试。

我们在Debug模式下,排除了app应用存在的功能问题,在Profile模式下,优化app的性能。接下来,我们就可以选择Release构建模式,打包发布App到应用市场。

Android打包与发布

添加启动图标

  • 在 /android/app/src/main/res/目录下,把不同分辨率的图标文件(png格式)分别放在以mipmap开头命名的文件夹中。

  • 在AndroidManifest.xml中,更新application标签中的android:icon属性来引用上一步骤中图标文件 (默认为:<application android:icon="@mipmap/ic_launcher" ...)。

为app签名

把app发布到安卓市场,还需要给app一个数字签名,用来保护app不会被恶意替换掉。我们可以采用以下步骤来为app签名:

  • 创建一个jks格式的密钥文件

在macOS系统上,执行下面的代码,设置key.jks到合适的存储路径:

keytool -genkey -v -keystore ~/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key

在Windows系统上,执行下面的代码,设置key.jks到合适的存储路径:

keytool -genkey -v -keystore c:/key.jks -storetype JKS -keyalg RSA -keysize 2048 -validity 10000 -alias key

根据命令提示,一步步执行完成,需要设置密钥库口令和密钥口令。macOS的操作示例如下:

app中引用密钥库文件

创建一个名为 /android/key.properties的文本文件,它包含了密钥库位置的定义:

storePassword=<密钥库口令>
keyPassword=<密钥口令>
keyAlias=key
storeFile=<密钥库key.jks存储位置,含文件名>

在app的build.gradle中配置发布签名

通过编辑 /android/app/build.gradle 文件来为我们的app配置签名,大致脚本如下:

def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
if (keystorePropertiesFile.exists()) {
   keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}

android {
    signingConfigs {
        release {
           keyAlias keystoreProperties['keyAlias']
           keyPassword keystoreProperties['keyPassword']
           storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
           storePassword keystoreProperties['storePassword']
        }
    }
    buildTypes {
        release {
           signingConfig signingConfigs.release
        }
    }
}

启用混淆器

Android混淆器可以减小APK安装包的大小,保护代码被反编译出来难以阅读理解。混淆规则通过编辑/android/app/proguard-rules.pro文件进行设置。第三方库往往会提供它的混淆配置说明,可以直接复制使用。混淆器如果配置不当,反而会引起app运行时崩溃。初学者可以暂时不考虑混淆配置。可以在安卓开发官方网站进一步了解缩减、混淆处理和优化您的应用

检查app manifest文件

检查位于 /android/app/src/main的默认App Manifest文件 AndroidManifest.xml,例如: 编辑 application 标签中的 android:label 来设置 app 的最终名字,一般这个名字不要太长,建议控制在13个英文字符之内(1个汉字算2个英文字符)。

检查构建配置

检查位于/android/app的默认build.gradle。

  • applicationId指定最终的,唯一的(Application Id)appid,每个安卓手机上的applicationId是唯一的。你可以有2个同样名称的app,只有它们的appid不一样即可。appid一般用反向域名的命名方式,如demo.dmt.zust.edu.cn。
  • versionCode & versionName 指定app的内部版本号(正整数),以及用于显示的版本号(字符串x.y.z形式),这可以通过设置pubspec.yaml文件中version属性实现。
  • minSdkVersion & targetSdkVersion指定支持的安卓设备的最低API版本以及app的目标API版本。API版本号跟Android操作系统版本一一对应,如API 23对应Android 6.0操作系统。对于Flutter项目来说,minSdkVersion至少大于等于16。

构建一个APK

因为安卓设备的多样性,需要为各种目标ABI(Application Binary Interface)分别构建发布的APK文件。在项目根目录下运行 flutter build apk --split-per-abi(flutter build 默认带有 --release 参数)。
这个命令会生成三个APK文件:

  • /build/app/outputs/apk/release/app-armeabi-v7a-release.apk
  • /build/app/outputs/apk/release/app-arm64-v8a-release.apk
  • /build/app/outputs/apk/release/app-x86_64-release.apk

如果移除--split-per-abi参数将会生成唯一一个包含所有目标 ABI的“臃肿”的APK文件。这种APK文件将会在比单独构建的 APK文件尺寸要大,会导致用户下载一些不适用于其设备架构的二进制文件。

iOS打包与发布

iOS发布之前你必须先在App Store Connect上完成你的应用相应的创建和配置。这部分可以参考Apple官方介绍。

检查Xcode项目设置

Xcode中,打开App ios目录中的 Runner.xcworkspace文件,在Xcode的项目导航栏中选择Runner,选择General选项卡。

  • Display Name代表这个App将会在主屏幕以及其他地方展示的名字,建议不要超过13个英文字符。
  • Bundle Identifier对应在App Store Connect 注册的App ID,它的作用类似于Android的applicationId。
  • Version对应Android Gradle配置里的versionName, build对应Anroid Gradle配置里的versionCode。同时,也对应pubspec.yaml文件里的version字段设置,例如:version: 1.0.0+2,1.0.0对应Version,2对应Build。
  • Target代表App将会支持的最低版本的 iOS。 Flutter 支持 iOS 8.0 及以后的版本。同时,也可以选择发布的设备平台类型,iPhone,iPad或/和Mac。
    我们还需要对iOS项目进行签名(Signing)管理,我们在Hello World一章中已经较为详细地介绍过了,此处不在重述。

添加应用图标

选择Runner目录中的Assets.xcassets,更新AppIcon占位图标为自己应用的app的图标。同安卓设备一样,你必须根据你所发布的设备平台分辨率特性,设计多套图标文件。除了更新应用图标之外,你也需要更新苹果应用启动页LaunchImage图片。

构建一个ipa

在应用目录下执行 flutter build ios 来创建一个 release 构建 (flutter build 默认指向 --release)。然后打开Xcode创建一个构建归档并将其上传到 App Store Connect,主要界面如下:

实验十二

根据本节的知识点,完善实验十一的项目配置和图标设计等,分别打包出apk和ipa文件(没有macOS环境的忽略)。

挑战:尝试将你的apk或ipa上传国内应用市场,因为市场审核非常严格,需要提交除程序外的多种资料,如大多安卓应该市场都需要提交App相关的软件著作权。可以尝试提交到国内app内测分发平台,如蒲公英FIR等。

上一篇 HTTP协议与JSON解析 下一篇 结语