Flutter 安卓打包流程

Flutter 安卓打包流程

目录

  1. 前提条件
  2. 配置签名密钥
  3. 构建发布版本
  4. 常见错误及解决方法

前提条件

在开始之前,请确保您的开发环境已正确配置:

  • 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

  1. 访问 Eclipse Temurin,下载 JDK 17 安装包。
  2. 扫描安装文件,进行安装。
  3. 设置环境变量,确保 JAVA_HOME 指向 JDK 17 安装目录。
  4. 重启系统,然后运行 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

解决方案:

  1. android/build.gradle 文件中,修改 ext.kotlin_version 为最新版本。
  2. android/gradle/wrapper/gradle-wrapper.properties 中,更新 distributionUrl 为最新版本。
  3. 运行 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 环境配置成功!"
  1. 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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容