Flutter 安卓打包流程
目录
前提条件
在开始之前,请确保您的开发环境已正确配置:
- Flutter SDK:建议使用最新稳定版本。
- Android Studio:用于 Android 开发的 IDE。
- JDK 17:磁盘系统推荐 JDK 17,以确保与 Flutter 的兼容性。
安装和配置 JDK 17
如果您尚未安装 JDK 17,可以通过以下方式安装:
macOS (Homebrew)
安装 JDK 17:
brew install --cask temurin@17
列出所有已安装的 Java 版本:
/usr/libexec/java_home -V
如果 JDK 17 安装成功,可以使用以下命令切换到 JDK 17:
export JAVA_HOME=$(/usr/libexec/java_home -v 17)
为了在每次系统重启时自动设置,请在 ~/.zshrc
(如果使用 bash,则修改 ~/.bashrc
)中添加:
echo 'export JAVA_HOME=$(/usr/libexec/java_home -v 17)' >> ~/.zshrc
source ~/.zshrc
Windows
- 访问 Eclipse Temurin,下载 JDK 17 安装包。
- 扫描安装文件,进行安装。
- 设置环境变量,确保
JAVA_HOME
指向 JDK 17 安装目录。 - 重启系统,然后运行
java -version
以确认安装是否成功。
Linux (Ubuntu/Debian)
sudo apt update && sudo apt install openjdk-17-jdk -y
安装完成后,验证 JDK 版本:
java -version
您可以通过以下命令检查 Flutter 环境配置:
flutter doctor -v
配置签名密钥
a. 生成签名密钥
使用 keytool
命令生成签名密钥:
keytool -genkey -v -keystore ~/upload-keystore.jks -keyalg RSA -keysize 2048 -validity 10000 -alias upload
运行 keytool
命令后,它会要求你输入一系列信息来生成密钥库 (.jks
) 文件。以下是每个字段的填写说明:
Enter keystore password: # 输入并确认密钥库密码 (请牢记)
Re-enter new password:
What is your first and last name?
[Unknown]: # 输入您的姓名 (可留空)
What is the name of your organizational unit?
[Unknown]: # 输入您的组织部门 (可留空)
What is the name of your organization?
[Unknown]: # 输入您的组织名称 (可留空)
What is the name of your City or Locality?
[Unknown]: # 输入您的所在城市 (可留空)
What is the name of your State or Province?
[Unknown]: # 输入您的省份 (可留空)
What is the two-letter country code for this unit?
[Unknown]: # 输入国家代码 (中国: CN,美国: US)
Is CN=XXX, OU=XXX, O=XXX, L=XXX, ST=XXX, C=XX correct?
[no]: yes # 确认信息无误
Enter key password for <upload>
(RETURN if same as keystore password): # 按回车使用相同的密码
完成后,upload-keystore.jks 文件会生成在 ~/upload-keystore.jks 目录下。
b. 配置密钥属性文件
将 upload-keystore.jks 移动到 android/app 目录:
mv ~/upload-keystore.jks android/app/
在 android
目录下创建 key.properties
文件,并添加以下内容:
storeFile=upload-keystore.jks
storePassword=你的密码
keyAlias=upload
keyPassword=你的密码
c. 修改 build.gradle
文件
编辑 android/app/build.gradle
,在 android
节点内添加以下代码:
plugins {
id "com.android.application"
id "kotlin-android"
// The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
id "dev.flutter.flutter-gradle-plugin"
id 'com.google.gms.google-services'
}
android {
// TODO:
namespace = "com.xx"
compileSdk = flutter.compileSdkVersion
ndkVersion = flutter.ndkVersion
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_1_8
}
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId = "com.xxx"
// You can update the following values to match your application needs.
// For more information, see: https://flutter.dev/to/review-gradle-config.
minSdk = flutter.minSdkVersion
targetSdk = flutter.targetSdkVersion
versionCode = flutter.versionCode
versionName = flutter.versionName
}
signingConfigs {
release {
def keystorePropertiesFile = rootProject.file("key.properties")
if (keystorePropertiesFile.exists()) { // 仅在文件存在时加载
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
storeFile file(keystoreProperties["storeFile"])
storePassword keystoreProperties["storePassword"]
keyAlias keystoreProperties["keyAlias"]
keyPassword keystoreProperties["keyPassword"]
} else {
println("Warning: key.properties not found, skipping release signing.")
}
}
}
buildTypes {
debug {
signingConfig signingConfigs.debug // 确保 debug 使用默认签名
}
release {
// TODO: Add your own signing config for the release build.
// Signing with the debug keys for now, so `flutter run --release` works.
signingConfig = signingConfigs.release
minifyEnabled true // 开启代码混淆
shrinkResources true // 移除无用资源
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
flutter {
source = "../.."
}
dependencies {
implementation 'com.facebook.android:facebook-android-sdk:latest.release'
implementation(platform("com.google.firebase:firebase-bom:33.3.0"))
implementation("com.google.firebase:firebase-analytics")
implementation 'com.android.installreferrer:installreferrer:2.2'
}
构建发布版本
运行以下命令构建 APK:
flutter build apk --release
或构建 AAB(适用于 Google Play):
flutter build appbundle
构建完成后,APK 文件将在 build/app/outputs/flutter-apk/
目录下,AAB 文件将在 build/app/outputs/bundle/release/
目录下。
常见错误及解决方法
1. Execution failed for task ':connectivity_plus:compileReleaseJavaWithJavac Could not resolve all files for configuration':connectivity_plus:androidJdkImage'.'.
这个错误与 connectivity_plus 插件在编译时的 Java JDK 兼容性问题有关,可能是由于:
• 你的 Java 版本 (JDK 21) 不兼容某些 Gradle 插件或 Android SDK 组件。
• core-for-system-modules.jar 相关的 jlink 处理失败。
解决方案:
降级 JDK 版本到 JDK 17 stackoverflow
指定 JDK 目录:
flutter config --jdk-dir=$(/usr/libexec/java_home -v 17)
2. keytool
命令找不到
解决方案:
运行以下命令查找 keytool
的完整路径:
flutter doctor -v
在 Java binary at:
之后的路径即为 Java 可执行文件路径,使用完整路径执行 keytool
命令。
3. The Android Gradle plugin supports only Kotlin Gradle plugin version X.X.X and higher
解决方案:
- 在
android/build.gradle
文件中,修改ext.kotlin_version
为最新版本。 - 在
android/gradle/wrapper/gradle-wrapper.properties
中,更新distributionUrl
为最新版本。 - 运行
flutter clean
,然后重新构建项目。
4. Android toolchain ✗ Cannot execute /Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home/bin/java to determine the version
flutter doctor -v
[✓] Flutter (Channel stable, 3.32.0, on macOS 15.5 24F74 darwin-arm64, locale zh-Hans-US) [164ms]
• Flutter version 3.32.0 on channel stable at /Users/ai3/flutter
• Upstream repository https://github.com/flutter/flutter.git
• Framework revision be698c48a6 (8 weeks ago), 2025-05-19 12:59:14 -0700
• Engine revision 1881800949
• Dart version 3.8.0
• DevTools version 2.45.1
[!] Android toolchain - develop for Android devices (Android SDK version 36.0.0) [138ms]
• Android SDK at /Users/ai3/Library/Android/sdk
• Platform android-36, build-tools 36.0.0
• Java binary at: /Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home/bin/java
This JDK is specified in your Flutter configuration.
To change the current JDK, run: `flutter config --jdk-dir="path/to/jdk"`.
✗ Cannot execute /Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home/bin/java to determine the
version
建议你以后都使用 /usr/libexec/java_home -v 17 来自动获取有效 JDK 路径
这样可以避免路径写错或用到损坏的 JDK:
flutter config --jdk-dir=$(/usr/libexec/java_home -v 17)
至此,Flutter 安卓打包流程完整,若有其他问题可参考 Flutter 官方文档或 StackOverflow 进行搜索。🚀
脚本:setup_jdk17.sh
#!/bin/bash
set -e
echo "🔧 开始安装并配置 JDK 17 (Temurin)..."
# 1. 安装 JDK 17
echo "📦 使用 Homebrew 安装 temurin@17..."
brew install --cask temurin@17
# 2. 设置 JAVA_HOME 临时变量(用于 flutter 配置)
JDK_PATH=$(/usr/libexec/java_home -v 17)
echo "✅ JDK 17 安装成功,路径为:$JDK_PATH"
# 3. 配置 JAVA_HOME 到 ~/.zshrc(避免重复添加)
ZSHRC=~/.zshrc
LINE="export JAVA_HOME=\$(${JDK_PATH}/bin/java_home -v 17)"
if ! grep -q 'java_home -v 17' "$ZSHRC"; then
echo "🔧 添加 JAVA_HOME 到 ~/.zshrc..."
echo 'export JAVA_HOME=$(/usr/libexec/java_home -v 17)' >> "$ZSHRC"
else
echo "✅ ~/.zshrc 中已存在 JAVA_HOME 配置,跳过添加。"
fi
# 4. 立即生效
echo "🔁 重新加载 ~/.zshrc ..."
source "$ZSHRC"
# 5. 配置 flutter 使用 JDK 17
echo "⚙️ 配置 flutter 使用 JDK 17..."
flutter config --jdk-dir="$JDK_PATH"
echo "✅ 配置完成!当前使用的 JAVA_HOME:$JAVA_HOME"
java -version
echo "🎉 JDK 17 + Flutter 环境配置成功!"
-
gradle下载失败 [ +65 ms] Downloading https://services.gradle.org/distributions/gradle-8.9-all.zip [ +69 ms] Exception in thread "main" java.net.ConnectException: Connection refused
需要查看~/.gradle
文件夹下的gradle.properties
是否设置代理,如果有删除。
https://github.com/flutter/flutter/issues/33389#issuecomment-496154938