← Frontend / Flutter

16_打包与发布

Flutter 应用打包和发布流程

Android APK/AAB、iOS IPA、Web 构建,以及发布前检查清单。


构建 Android

APK(直接安装包)

# Debug APK(开发调试,体积大、不适合发布)
flutter build apk --debug

# Release APK(发布用,需要签名配置)
flutter build apk --release

# 按 CPU 架构拆包(体积更小,Google Play 推荐)
flutter build apk --target-platform android-arm,android-arm64,android-x64 --split-per-abi

# 输出位置:build/app/outputs/flutter-apk/

AAB(Google Play 必须格式)

flutter build appbundle --release

# 输出位置:build/app/outputs/bundle/release/app-release.aab

Android 签名配置

# ① 生成 keystore(只需一次,务必备份!)
keytool -genkey -v \
  -keystore ~/my-release-key.jks \
  -keyalg RSA -keysize 2048 \
  -validity 10000 \
  -alias my-key-alias
# ② android/key.properties(不要提交到 git!加入 .gitignore)
storePassword=你设置的密码
keyPassword=你设置的密码
keyAlias=my-key-alias
storeFile=../../../my-release-key.jks
// ③ android/app/build.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 keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
            storePassword keystoreProperties['storePassword']
        }
    }
    buildTypes {
        release {
            signingConfig signingConfigs.release
        }
    }
}

构建 iOS

# 需要 macOS + Xcode + Apple Developer 账号

# 构建 iOS(无签名,用于模拟器)
flutter build ios --release

# 构建 IPA(需要 Apple Developer 账号,配置好 Provisioning Profile)
flutter build ipa

# 输出位置:build/ios/ipa/

Xcode 配置(首次):

  1. 打开 ios/Runner.xcworkspace
  2. 选择 Runner target → Signing & Capabilities
  3. 选择 Team(Apple ID)
  4. 设置 Bundle Identifier(唯一,如 com.yourcompany.appname)

构建 Web

# Release 构建
flutter build web --release

# 指定渲染器
flutter build web --web-renderer html        # 体积小,兼容性好
flutter build web --web-renderer canvaskit   # 效果好,体积大(~2MB)

# 输出位置:build/web/(静态文件,可直接部署到 Nginx / CDN)

修改应用信息

App 名称

<!-- android/app/src/main/AndroidManifest.xml -->
<application android:label="我的应用" ...>

<!-- ios/Runner/Info.plist -->
<key>CFBundleDisplayName</key>
<string>我的应用</string>

版本号

# pubspec.yaml
version: 1.2.0+3   # 格式:版本名+构建号
                    # 1.2.0 = 显示给用户的版本
                    # 3     = Google Play / App Store 内部递增编号

应用图标

# 推荐使用 flutter_launcher_icons 包自动生成各平台图标
dev_dependencies:
  flutter_launcher_icons: ^0.13.0

flutter_icons:
  android: true
  ios: true
  image_path: "assets/icon/icon.png"  # 1024x1024 PNG,无圆角
dart run flutter_launcher_icons

启动屏(Splash Screen)

dev_dependencies:
  flutter_native_splash: ^2.3.0

flutter_native_splash:
  color: "#FFFFFF"
  image: assets/images/splash.png
  android: true
  ios: true
dart run flutter_native_splash:create

发布前检查清单

# 1. 代码分析
flutter analyze

# 2. 格式化
dart format lib/

# 3. 运行测试
flutter test

# 4. 检查依赖漏洞
flutter pub audit

# 5. 清理重建
flutter clean && flutter pub get

# 6. 查看构建大小分析
flutter build apk --analyze-size

发布前人工检查:

  • 所有接口地址改为生产环境
  • 关闭调试日志(debugPrint 替代 print,或用条件 kDebugMode)
  • 版本号 pubspec.yaml 已更新
  • 隐私政策链接已填写
  • 应用图标和启动图已替换
  • Android 签名已配置
  • iOS Bundle ID 和 Team 已配置
  • 权限声明(相机、位置、通知)说明合理