【flutter】Androidのリリース準備

FlutterプロジェクトでAndroidのアプリをリリースするためのwindowsでの手順を備忘録的に残しておく。

事前準備、確認

  • アプリ名を決める
  • サポートサイト、プライバシーポリシーサイトの準備(レンタルサーバーなどを借りて準備しましょう、ここでは触れません)
  • Google Playのデベロッパーアカウントを取得Google Play Consoleに入るために必要(初回のみ25ドルくらい費用がかかります。
  • ドメイン「com.{自分のドメイン}.アプリ名」のようなグロバールにユニークな名前を考えて(用意して)おく。ドメインといってもwebサイトのドメインと直接的に紐づいているわけではないがサポートサイト、プライバシーサイトを作っているはずなので何かしらのドメインはあるはず。
    • Flutterを作成するときに指定するが大抵はプロジェクト名などなのでこのまま進めると想定しているものではなくなるので改めて設定するのがいい気がする。
    • iOSでも大抵同じにする(iOSではバンドルIDという)と思うが、iOSとAndroidでこの処理に違いがある。iOSを先に考えて「com.im0039kp-totagi.appname」などにしているとAndroidではハイフンが削除される、手動でハイフンをいれるとエラーになる(アンダースコアは使用できる)「com.im0039kp_totagi.appname」iOSとAndroidで名前が違うなどややこしいので個人製作ではなるべ使わない方がいい気がする。
  • keytoolが存在するかAndroidStudioをインストールしていればC:\Program Files\Android\Android Studio\jbr\binにkeytool.exeがあると思う。なければAndroid Studioフォルダーからkeytoolで検索をかけると見つかるはず。

ということで今回は

アプリ名とたぎナレッジ
ドメイン/applicationId/packagecom.totagi.appname
keytoolパスC:\Program Files\Android\Android Studio\jbr\bin\keytool.exe
keystoreのパスワードhogetest

という前提にすすめていく。

keystoreファイルを作成する。

keytoolを使用してアプリをリリースためのアプリ証明書(keystoreファイル)を作成する。

"C:\Program Files\Android\Android Studio\jbr\bin\keytool.exe" -genkey -v -keystore ./key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key

を実行する。

keytool -genkey -v -keystore {出力先パス}/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key

出力先のパスを指定できる「./key.jks」はカレントディレクト上に生成される。

自身で決めたパスワード「hogetest」を入力して他は特に設定しなくても生成できる。

作成されたkey.jksファイルを「android/app」配下に置く。

keystoreファイルのプロファイル情報を設定:Flutterプロジェクト

作成したkeystoreファイルをFlutterプロジェクトに紐づけていきます。

local.propertiesを編集

android/local.properties」ファイルに追記します。

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

次に「android/app/build.gradle」を編集するのですがそこにはすでに「local.properties」が読み込まれているのでこのファイルに追記しました。

build.gradleを編集

android/app/build.gradle」を編集する。

  • signingConfigs を追記
signingConfigs {
        release {
            keyAlias localProperties['keyAlias']
            keyPassword localProperties['keyPassword']
            storeFile localProperties['storeFile'] ? file(localProperties['storeFile']) : null
            storePassword localProperties['storePassword']
        }
    }
  • buildTypesの「signingConfig signingConfigs.release」にする
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.release
        }
    }

ファイルの一部はこんな感じ

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

/*中略*/

android {
    /*中略*/

    // これandroid {の中に記述
    signingConfigs {
        release {
            keyAlias localProperties['keyAlias']
            keyPassword localProperties['keyPassword']
            storeFile localProperties['storeFile'] ? file(localProperties['storeFile']) : null
            storePassword localProperties['storePassword']
        }
    }

    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.release
        }
    }
・・・

ドメイン設定:Flutterプロジェクト

アプリ名、ドメイン名を変更していく。

ところどころFlutterが自動で追加しているものがあるので最終的にマージされたAndroidManifestなどを確認したい場合は。

build/app/intermediates/merged_manifest/debug/AndroidManifest.xml

を確認するといい。

アプリ名を設定

android/app/src/main/AndroidManifest.xmlを編集

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application
        android:label="とたぎナレッジ"
        android:name="${applicationName}"
        android:icon="@mipmap/ic_launcher">
・・・

ドメイン名を変更する

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

packageを追加

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.totagi.appname">
    <application
        android:label="とたぎナレッジ"
  • android/app/src/debug/AndroidManifest.xml

packageを追加

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.totagi.appname">
    <!-- The INTERNET permission 
  • android/app/src/profile/AndroidManifest.xml

packageを追加

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.totagi.appname">
    <!-- The INTERNET permission is requi
  • android/app/build.gradle
    • namespaceを変更
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"

android {
    namespace "com.totagi.appname"
    compileSdkVersion flutter.compileSdkVersion
    ndkVersion flutter.ndkVersion
  • android/app/build.gradle
    • defaultConfigのapplicationIdを変更
    }

    defaultConfig {
        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
        applicationId "com.totagi.appname"
        // You can update the following values to match your application needs.
  • android/app/src/main/kotlin/com/totagi/appname/MainActivity.kt

フォルダー名を自分のドメイン名のパスにする

  • android/app/src/main/kotlin/com/im0039kp/zenchan/MainActivity.kt

先ほど変更したフォルダー名にあるMainActivity.ktのpackageを変更

package com.totagi.appname

import io.flutter.embedding.android.FlutterActivity

class MainActivity: FlutterActivity() {
}

android/app/src/main/kotlin/com/totagi/appname/にフォルダーを変更するとエラーになる

エラーになるがFlutterのIDEの問題なので気にしなくていいらしい。

androidフォルダーをAndroidプロジェクトと開くとエラーがない。(フォルダーを変更する前は問題なかったのに謎・・・)

自分はリリースビルドを実行などしているといつの間にか消えていました・・・

flutter build appbundle --release

リリースビルドをしてみる

設定が終わったらキャッシュをクリアしてリリースビルドしてみましょう。

flutter clean

リリースビルド

flutter build appbundle --release

終わりに

ビルドが成功したらおそらくうまく設定できたはず・・・

実際にGooglePlayConsoleで配信する場合はビルド番号が同じバージョンをリリースしようとするとエラーが出ます。

flutter build appbundle --build-name=0.0.1 --build-number=1 --release

という風にビルドするときにバージョンを指定することができます。

一応Flutterのプロジェクトの「android/local.properties」に指定されています。

flutter.buildMode=release
flutter.versionName=0.0.1
flutter.versionCode=1

設定できるかもしれないですが、ビルドするタイミングで行うことにしてました。

コメント