見出し画像

【Flutter】MacでAndroidアプリをリリースビルドする方法

この記事では、Flutterで作成したアプリをGoogle Playストアに公開するために、Mac上でAndroidアプリとしてリリースビルドする方法を説明します。


1. keystoreファイル(=証明書)を作成する


1-1. テンプレートのコマンドの{}の部分を編集して、コマンドを叩く

テンプレート:

keytool -genkey -v -keystore {リリースするFlutterのプロジェクトのandroid/appのルートパス}/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key

編集例:

keytool -genkey -v -keystore /Users/user_name/development/projects/app_name/android/app/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key

# 証明書を作成する
keytool
# キーとペアを生成する
-genkey
# 詳細を出力する
-v
# keystoreファイルの名称をkey.jksにして、リリースするFlutterのプロジェクトのandroid/appの配下に置く
-keystore {リリースするFlutterのプロジェクトのandroid/appのルートパス}/key.jks
# キーをRSA方式で暗号化する
-keyalg RSA
# キーを2048ビットのファイルサイズで生成する
-keysize 2048
# 証明書の有効日数を10000日にする
-validity 10000
# 証明書のエイリアスをkeyにする
-alias key

keytoolコマンド

下記のメッセージが表示されてエラーになった場合はMacにJavaがインストールされていないということなので、こちらの記事を参考にしてください。

The operation couldn’t be completed. Unable to locate a Java Runtime.
Please visit http://www.java.com for information on installing Java.

1-2. 「キーストアのパスワードを入力してください:」の部分から順番に入力していく

キーストアのパスワード以外は入力しなくても問題ありません。
キーストアのパスワードはkey.propertiesファイルを作成する際に必要になりますので覚えておいてください。

user_name@device_name project_name % keytool -genkey -v -keystore /Users/user_name/development/projects/app_name/android/app/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key
キーストアのパスワードを入力してください:  
新規パスワードを再入力してください: 
識別名を入力します。サブコンポーネントを空のままにする場合はドット(.)を1つ入力し、中カッコ内のデフォルト値を使用する場合は[ENTER]を押します。
姓名は何ですか。
  [Unknown]:  developer_name
組織単位名は何ですか。
  [Unknown]:  [ENTER]
組織名は何ですか。
  [Unknown]:  [ENTER]
都市名または地域名は何ですか。
  [Unknown]:  [ENTER]
都道府県名または州名は何ですか。
  [Unknown]:  [ENTER]
この単位に該当する2文字の国コードは何ですか。
  [Unknown]:  JP
CN=developer_name, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=JPでよろしいですか。
  [いいえ]:  はい

10,000日間有効な2,048ビットのRSAのキー・ペアと自己署名型証明書(SHA384withRSA)を生成しています
        ディレクトリ名: CN=developer_name, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=JP
[/Users/user_name/development/projects/app_name/android/app/key.jksを格納中]

2. key.propertiesファイルを作成する


2-1. テンプレートのコマンドの{}の部分を編集して、コマンドを叩く

テンプレート:

touch {リリースするFlutterのプロジェクトのandroidディレクトリのルートパス}/key.properties

編集例:

touch /Users/user_name/development/projects/app_name/android/key.properties

2-2. テンプレートのコードの{}の部分を編集して、作成したkey.propertiesファイルに保存する

テンプレート:

storePassword={キーストアのパスワード}
keyPassword={キーストアのパスワード}
keyAlias=key
storeFile=key.jks

編集例:

storePassword=keystore_pass
keyPassword=keystore_pass
keyAlias=key
storeFile=key.jks

※ key.propertiesファイルにはパスワードが含まれるので、GitHubなどで公開してしまわないように注意してください。

3. build.gradleファイルを編集する


3-1. リリースするFlutterのプロジェクトのandroid/app配下のbuild.gradleファイルを開く


plugins {
    id "com.android.application"
    id "kotlin-android"
    id "dev.flutter.flutter-gradle-plugin"
}

def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
    localPropertiesFile.withReader('UTF-8') { reader ->
        localProperties.load(reader)
    }
}

def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
    flutterVersionCode = '1'
}

def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
    flutterVersionName = '1.0'
}

android {
    namespace "com.example.app_name"
    compileSdkVersion flutter.compileSdkVersion
    ndkVersion flutter.ndkVersion

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    kotlinOptions {
        jvmTarget = '1.8'
    }

    sourceSets {
        main.java.srcDirs += 'src/main/kotlin'
    }

    defaultConfig {
        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
        applicationId "com.example.calcpad"
        // You can update the following values to match your application needs.
        // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
        minSdkVersion localProperties.getProperty('flutter.minSdkVersion').toInteger()
        targetSdkVersion flutter.targetSdkVersion
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
    }

    buildTypes {
        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.debug
        }
    }
}

flutter {
    source '../..'
}

dependencies {}

3-2. テンプレートのコードを3箇所に追加あるいは編集する

テンプレートコード1 (追加):

def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
if (keystorePropertiesFile.exists()) {
    keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}

テンプレートコード2 (追加):

signingConfigs {
    release {
        keyAlias keystoreProperties['keyAlias']
        keyPassword keystoreProperties['keyPassword']
        storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
        storePassword keystoreProperties['storePassword']
    }
}

テンプレートコード3 (編集):

buildTypes {
    release {
        signingConfig signingConfigs.release
    }
}

編集例:

// 前略

// テンプレートコード1箇所目↓
def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
if (keystorePropertiesFile.exists()) {
    keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}
// テンプレートコード1箇所目↑

android {
    // 中略

    // テンプレートコード2箇所目↓
    signingConfigs {
        release {
            keyAlias keystoreProperties['keyAlias']
            keyPassword keystoreProperties['keyPassword']
            storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
            storePassword keystoreProperties['storePassword']
        }
    }
    // テンプレートコード2箇所目↑

    // テンプレートコード3箇所目↓
    buildTypes {
        release {
            signingConfig signingConfigs.release
        }
    }
    // テンプレートコード3箇所目↑
}

// 後略

4. AndroidManifest.xmlファイルを編集する


4-1. リリースするFlutterのプロジェクトのandroid/app/src/main配下のAndroidManifest.xmlファイルを開く

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-permission android:name="android.permission.VIBRATE"/>
    <application
        android:label="app_name"
        android:name="${applicationName}"
        android:icon="@mipmap/ic_launcher">
        <activity
            android:name=".MainActivity"
            android:exported="true"
            android:launchMode="singleTop"
            android:theme="@style/LaunchTheme"
            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
            android:hardwareAccelerated="true"
            android:windowSoftInputMode="adjustResize">
            <!-- Specifies an Android theme to apply to this Activity as soon as
                 the Android process has started. This theme is visible to the user
                 while the Flutter UI initializes. After that, this theme continues
                 to determine the Window background behind the Flutter UI. -->
            <meta-data
              android:name="io.flutter.embedding.android.NormalTheme"
              android:resource="@style/NormalTheme"
              />
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <!-- Don't delete the meta-data below.
             This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
        <meta-data
            android:name="flutterEmbedding"
            android:value="2" />
    </application>
</manifest>

4-2. アプリ名を設定する

android:label="app_name"のapp_nameの部分にリリースする際のアプリ名を入力する。(例: android:label="calculator")
そのままの名前でよければ変更しなくても問題ありません。

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-permission android:name="android.permission.VIBRATE"/>
    <application
        android:label="app_name"
        <!-- 後略 -->

5. バンドルIDを変更する


バンドルIDとはリリースするアプリを識別するためのものです。(ドメインと言われたりパッケージ名と言われたりもします)

バンドルIDはFlutterでプロジェクトを新しく作成した際に"com.example.app_name"のように設定されますが、バンドルIDが"com.example"のドメインのままだとリリースできません。

そのため、"com.example.app_name"のドメインを"own_domain_name.app_name"のように変更する必要があります。

5-1. 正式なバンドルIDにするドメインを考える

実際に独自ドメインを取得する必要はないので、以下のルールを押さえていればOKです。

ドメイン設定のルール:
・逆ドメイン名表記にする (例: com.very-cool.calculator)
・ハイフンを使用しない (例: com.very_cool.calculator)

(前略)IDの先頭は独自ドメイン名を逆転させたもの(例:「minpro.net」の場合は「net.minpro」)をつけることが監修となっています(中略)ハイフン付きのドメイン名を使うと、AndroidのアプリケーションIDは自動的にハイフンが削除されてしまう(後略)

みんなのプログラミング

5-2. バンドルIDを追記する

下記の各ファイルの1行目の<manifest>タグ内に"package"属性を以下のように追記する

  • android/app/src/main/AndroidManifest.xml

  • android/app/src/debug/AndroidManifest.xml

  • android/app/src/profile/AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.very_cool.calculator">

5-3. バンドルIDを修正する

下記のファイルの"namespace"と"applicationId"を以下のように修正する。

  • android/app/build.gradle

// 前略
android {
    namespace "com.very_cool.calculator"
// 中略
    defaultConfig {
        applicationId "com.very_cool.calculator"
// 後略

5-4. ディレクトリ名を修正して、バンドルIDを修正する

下記のディレクトリの配下の構成を以下のように変更する。(逆ドメインのピリオドごとにディレクトリを入れ子にして作成する)

  • android/app/src/main/kotlin

android/app/src/main/kotlin/com/very_cool/calculator/MainActivitly.kt

下記のファイルの1行目を以下のように変更する。

  • android/app/src/main/kotlin/com/very_cool/calculator/MainActivitly.kt

package com.very_cool.calculator

6. リリースビルドする


6-1. キャッシュをクリアする

flutter cleanコマンドを実行して、キャッシュされたビルドが署名プロセスに影響を与えることを防ぎます。

flutter clean

6-2. リリースビルドする

下記のコマンドでアプリバンドル形式でリリース用にビルドします。

flutter build appbundle --release

以下のように表示されれば完了です、お疲れ様でした!
出力先は"build/app/outputs/bundle/release/app-release.aab"になります。

user_name@device_name project_name % flutter build appbundle --release

# 中略

✓ Built build/app/outputs/bundle/release/app-release.aab (20.7MB).

主に参考にさせていただいたサイト



いいなと思ったら応援しよう!