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/package | com.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
設定できるかもしれないですが、ビルドするタイミングで行うことにしてました。
コメント