【Flutter】Androidアプリの署名設定とGoogle Play Consoleへの公開手順(Play App Signing対応)

モバイルアプリ開発エンジニアの木村です。
今回は、新規アプリのストア申請で行った「署名設定」の手順について解説します。

💡 この記事で分かること(要約)

  • flutter build appbundle で発生する「デバッグモードで署名されています」エラーの解決方法
  • Play App Signingの仕組みと「アップロードキー」の作成手順
  • チーム開発におけるキーストアファイル(key.jks)とパスワードの安全な管理・共有方法

署名設定はストア公開において必須の作業ですが、初期開発やリリース時しか触らないため、「いざ必要になったときには手順をすっかり忘れている」ということがよく起こります。(私も忘れておりました。)

毎回調べ直す時間のロスをなくし、次回の申請時やメンバーが増えた際にもこの記事でスムーズに作業を進められるよう、備忘録として手順を残します!

1. はじめに:発生するエラーと原因

Flutter で開発したアプリを Google Play Store に公開する際、適切な署名が必要です。 単純に flutter build appbundle コマンドでビルドしたファイルをアップロードすると、以下のようなエラーが発生します。

Google Play Consoleでのエラー表示
「アップロードされた APK または Android App Bundle がデバッグモードで署名されています。APK または Android App Bundle はリリースモードで署名する必要があります。」

解決策

結論として、「キーストア(Keystore)を新規作成し、build.gradle(または build.gradle.kts)に署名設定を追加する」ことで解決します。

以下で、具体的な手順を詳しく解説します。

2. Play App Signing(アプリ署名機能)について

Google Play では、現在「Play App Signing」という仕組みが推奨されています(2021年8月以降の新規アプリでは必須)。

この仕組みにより、アプリの署名は以下の2種類に役割分担されます。

署名キーの種類管理者主な役割・特徴           
① アップロードキー
(この記事で作成)
開発者・Google Play ConsoleへAAB※ をアップロードする際に使用
・万が一紛失しても、Googleサポートに申請すればリセット可能
② アプリ署名キーGoogle・ユーザーに配信される実際のアプリに署名するキー
・Googleがクラウド上で安全に保管・管理・開発者が紛失するリスクがゼロ

※ AAB(Android App Bundle):Google Play推奨のアプリ配信フォーマット

Play App Signingを利用するメリット

  • 高い安全性:アップロードキーが漏洩しても、アプリ署名キー自体はGoogleによって強固に保護されます。
  • 安心のリカバリー:アップロードキーを紛失しても、再発行すればアプリのアップデートを継続できます。
  • 配信の最適化:Googleの最適化された署名インフラを利用できます。

この記事で作成するキーは「① アップロードキー」となります。初回アップロード時に Play App Signing を有効化することで、Google が自動的にアプリ署名キーを生成・管理してくれます。

3. 署名の準備・設定手順(7つのステップ)

ここからは、実際にアプリへ署名設定を組み込む手順を解説します。

手順1:Android Studio でプロジェクトを開く

まず、Flutter プロジェクトの android フォルダを Android Studio で開きます。 これにより、Android 固有の設定(自動補完など)を行いやすくなります。

手順2:署名用のキー(Keystore)の作成

署名用のキーストアファイルを作成します。作成方法は「Android Studio(GUI)」と「ターミナル(CLI)」の2通りあります。

A. Android Studio(GUI)で作成する場合

  1. メニューから Build > Generate Signed Bundle / APK を選択
  2. Android App Bundle または APK を選択し、Next をクリック
  3. Create new... ボタンをクリックして、新しいキーストア情報を入力

B. ターミナル(CLI)からコマンドで作成する場合

以下のコマンドを実行します。

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

必要な入力情報

キーストア作成時には、以下の項目を設定・入力します。

  • キーストアのパスワード(安全性の高い強固なパスワードを設定)
  • キーのエイリアス名(例:upload
  • キーのパスワード(キーストアと同じパスワードでも問題ありません)
  • 証明書情報(氏名、組織単位、組織名、市区町村、都道府県、国コード)

⚠️ 【重要】セキュリティおよび管理上の注意点

  • 紛失厳禁:キーストアファイルは絶対に紛失しないでください。バックアップを複数の安全な場所に保管することを強くお勧めします。
  • Gitへのコミット禁止:キーストアファイルは絶対にGitなどのリポジトリにコミットしないでください。
  • チーム開発での注意点
    • キーストアファイルは必要最小限のメンバーのみが管理する。
    • 共有する際は、パスワード保護されたZIPや、企業のパスワード・機密管理システム(1Password、Vaultなど)を使用する。
    • メール、Slack、Discordなどのチャットツール上で直接ファイルをやり取りするのは避けてください。

手順3:key.properties ファイルの作成

Android プロジェクトのルートディレクトリ(android/ 直下)に、環境変数定義用の key.properties ファイルを新規作成します。

作成場所android/key.properties

ファイル内に以下の内容を記述します。

storePassword=<キーストアのパスワード>
keyPassword=<キーのパスワード>
keyAlias=<キーのエイリアス>
storeFile=<キーストアファイルへの絶対パス>

【記述例】

storePassword=myStorePassword
keyPassword=myKeyPassword
keyAlias=upload
storeFile=/Users/username/key.jks

手順4:key.properties.gitignore に追加(推奨)

パスワード等の機密情報がリポジトリに流出するのを防ぐため、必ず .gitignore に登録します。

📂 編集対象ファイルandroid/.gitignore

ファイルの末尾に以下を追記してください。

# Keystore & Signing properties
key.properties
*.jks

手順5:build.gradle.kts の設定

次に、Flutter/Androidビルド時に先ほど作成したプロパティファイルを読み込む設定を追記します。

📂 編集対象ファイルandroid/app/build.gradle.kts(※古いプロジェクトの場合は build.gradle

以下のように、ファイルの先頭と android ブロック内に追記を行います。

import java.io.FileInputStream
import java.util.Properties

// 1. ファイル先頭付近に追記
val keystoreProperties = Properties()
val keystorePropertiesFile = rootProject.file("key.properties")
if (keystorePropertiesFile.exists()) {
    keystoreProperties.load(FileInputStream(keystorePropertiesFile))
}

android {
    // 既存の設定...
    
    // 2. signingConfigs の設定を追加・編集
    signingConfigs {
        create("release") {
            keyAlias = keystoreProperties["keyAlias"] as String
            keyPassword = keystoreProperties["keyPassword"] as String
            storeFile = file(keystoreProperties["storeFile"] as String)
            storePassword = keystoreProperties["storePassword"] as String
        }
    }
    
    buildTypes {
        getByName("release") {
            // 3. リリースビルドに上記の設定を紐付け
            signingConfig = signingConfigs.getByName("release")
        }
    }
}

手順6:署名付きビルド(AAB)の作成

これで準備が整いました。 プロジェクトのルートディレクトリで以下のコマンドを実行し、署名済みの Android App Bundle をビルドします。

flutter build appbundle

正常に完了すると、以下のパスに .aab ファイルが出力されます。 build/app/outputs/bundle/release/app-release.aab

手順7:Google Play Console へのアップロード

生成された上記の .aab ファイルを、Google Play Console のリリース管理画面にドラッグ&ドロップしてアップロードします。 エラーなくアップロードが完了すれば、署名設定は成功です!

4. まとめ

以上の手順で Flutter アプリを正しく署名し、Google Play Store に公開することができます。

Play App Signing を利用している場合、作成したキーは「アップロードキー」として機能し、実際のアプリ署名は Google が安全に管理します。それでもキーストアファイルとパスワードは安全に保管し、定期的にバックアップを取ることをお勧めします!

この記事が、みなさんのFlutterアプリ公開プロセスのスムーズな進行に役立ちましたら幸いです!

🤝 一緒に働く仲間を募集しています!

エフアンドエムネットでは、このような新しい技術のキャッチアップや、チーム内でのナレッジ共有を大切にしながら、より良い自社サービスの開発に日々取り組んでいます。

記事を読んで、私たちの開発環境やチームの雰囲気に少しでも「面白そう!」「一緒に働いてみたい!」と思ってくださった方は、ぜひ採用ページをご覧ください。みなさまからのご応募を心よりお待ちしております!

まずはカジュアルにお話しするところからでも大歓迎です!