Flutter 应用打包发布详解
简介
应用打包发布是开发流程中的重要环节。本文详细介绍如何打包和发布 Flutter 应用到 Android 和 iOS 平台。
Android 打包
生成密钥
bash
keytool -genkey -v -keystore key.jks \
-keyalg RSA -keysize 2048 -validity 10000 \
-alias key
配置密钥
创建 key.properties
properties
storePassword=<store password>
keyPassword=<key password>
keyAlias=key
storeFile=<key store file location>
配置 build.gradle
gradle
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 file(keystoreProperties['storeFile'])
storePassword keystoreProperties['storePassword']
}
}
buildTypes {
release {
signingConfig signingConfigs.release
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}
}
}
打包命令
bash
# 生成 APK
flutter build apk --release
# 生成 App Bundle
flutter build appbundle
iOS 打包
配置证书
- 在 Apple Developer 网站创建证书
- 在 Xcode 中配置证书和 Provisioning Profile
配置应用信息
xml
<!-- ios/Runner/Info.plist -->
<key>CFBundleDisplayName</key>
<string>应用名称</string>
<key>CFBundleIdentifier</key>
<string>com.example.myapp</string>
<key>CFBundleShortVersionString</key>
<string>1.0.0</string>
<key>CFBundleVersion</key>
<string>1</string>
打包命令
bash
flutter build ios --release
版本管理
pubspec.yaml
yaml
version: 1.0.0+1 # 版本号+构建号
版本号格式
- 主版本号.次版本号.修订号
- 构建号(整数,单调递增)
多渠道打包
Android 渠道配置
gradle
android {
flavorDimensions "default"
productFlavors {
google {
dimension "default"
manifestPlaceholders = [
CHANNEL_VALUE: "google"
]
}
huawei {
dimension "default"
manifestPlaceholders = [
CHANNEL_VALUE: "huawei"
]
}
}
}
打包命令
bash
# 打包特定渠道
flutter build apk --flavor google
flutter build apk --flavor huawei
自动化打包
Fastlane 配置
ruby
# fastlane/Fastfile
default_platform(:android)
platform :android do
desc "Deploy to Play Store"
lane :deploy do
gradle(
task: "clean assembleRelease",
properties: {
"android.injected.signing.store.file" => ENV["KEYSTORE_FILE"],
"android.injected.signing.store.password" => ENV["STORE_PASSWORD"],
"android.injected.signing.key.alias" => ENV["KEY_ALIAS"],
"android.injected.signing.key.password" => ENV["KEY_PASSWORD"],
}
)
upload_to_play_store(
track: 'internal',
aab: '../build/app/outputs/bundle/release/app-release.aab'
)
end
end
platform :ios do
desc "Deploy to App Store"
lane :deploy do
build_ios_app(
workspace: "Runner.xcworkspace",
scheme: "Runner",
export_method: "app-store"
)
upload_to_app_store(
skip_screenshots: true,
skip_metadata: true
)
end
end
CI/CD 配置
yaml
# .github/workflows/release.yml
name: Release
on:
push:
tags:
- 'v*'
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-java@v1
with:
java-version: '11'
- uses: subosito/flutter-action@v1
- run: flutter pub get
- run: flutter test
- run: flutter build apk --release
- uses: actions/upload-artifact@v2
with:
name: release-apk
path: build/app/outputs/flutter-apk/app-release.apk
发布检查清单
通用检查
Android 检查
iOS 检查
最佳实践
- 使用版本控制
- 自动化构建流程
- 分环境配置
- 代码混淆
- 安全性检查
注意事项
- 密钥保管
- 敏感信息处理
- 版本兼容性
- 发布时间规划
- 紧急回滚方案
总结
应用打包发布是一个复杂的过程,需要注意很多细节。通过合理的配置和自动化工具,可以简化发布流程,提高发布效率。