🚀

flutterで初めてのandroid app bundleビルド~内部テスト版公開

2020/10/23に公開

はじめに

現在自分はflutterでアプリ開発をしていますが、ネイティブの開発経験がゼロなので色々お作法がわからず苦労しました。先日google playに内部テスト版を上げたので記事にしようと思います。

この記事はflutterの公式ドキュメントを参考にして作成しています。flutterからモバイルの開発を始めるという方の参考になれば幸いです。

ネイティブ開発の先輩方、アドバイスや間違いがございましたらぜひコメント欄にお願いします。

環境

バージョン
MacOS X 10.15.4
DartSDK 2.10.1
flutterSDK 1.22.1
AndroidStudio 4.1
minSdkVersion 23
compileSdkVersion 30
targetSdkVersion 30

前提

この記事はapkビルドではなくapp bundleビルドを使用してgoogle playにあげます。(google playアプリ署名を使います)app bundleはgoogleの新しいアプリ公開フォーマットであり、バンドルサイズの削減などのメリットがあります。

現在googleが推奨しているのがこのapp bundleなのでやり方を覚えておくと良いかと思います。

余談

アプリケーション開発をしていればまず開発環境とステージング環境、本番環境のビルドがおなじになることはないと思います。最たる例はfirebaseを使用していた場合にビルドの種類によって接続先のfirebaseプロジェクトを切り替えることでしょう。

自分はiOS側はこの記事を参考にして設定しました。上に記載しているバージョンでも概ね同じ手順でうまく行きました。

android側は署名を無視してビルドを通すだけならgoogle servicesをそれぞれandroid/app/src以下の好きなフォルダに置いて、build.gradleにflavorの設定を追加すればできます(firebaseなしならgoogle servicesは無視)

android {
  // ...
  flavorDimensions "default"
  productFlavors {

      develop {
          dimension "default"
          applicationId "com.hoge.fuga.develop"
      }

      staging {
          dimension "default"
          applicationId "com.hoge.fuga.staging"
      }

      production {
          dimension "default"
          applicationId "com.hoge.fuga"
      }
  }
  // ...
}

これは初めの方にやっておいたほうが良い設定かと思います。この時点ですべてのビルドが通ることを確認しておきましょう。

テスト版公開までの流れ

  1. バージョンチェック
  2. キーストアを作成する
  3. 署名の設定を行う
  4. app bundleビルドをする
  5. play consoleでアプリを作成する
  6. ビルドをアップロードする

バージョンチェック

これは些細なことですが、まずアプリのバージョンを決めましょう。flutterのアプリバージョンの管理方法は複数あるようですが、一番簡単なのはpubspecにバージョンを記載することだと思います。

name: hoge
description: fuga

publish_to: 'none'
version: 0.1.0  // これ

environment:
  sdk: ">=2.7.0 <3.0.0"
  flutter: ">=1.17.0"

デフォルトで生成されたpubspec内の上の方に記載があるので任意のバージョンに変更しておきましょう。これでビルドをしたとき勝手にバージョン番号がビルドの方に適用されます。

キーストアを作成する

Androidアプリはインターネットを通じて不特定多数の方々に公開するものなので自分になりすまして偽物のアプリを配信しようとする人がいるかも知れません。それを防ぐためにアプリの開発者はアプリに署名をしておき、アップデートのときに前のバージョンと署名が一致しているかを確かめています。そのための暗号鍵を格納しておくのがキーストアです。これは暗号鍵をコンテナ内に格納し、デバイスから簡単に暗号鍵を取り出せないようにする仕組みだそうです。

以下のコマンドでキーストアが作成できます。鍵の名前とエイリアスは任意のものをつけてください。(後で使います)
Javaが入ってないとできなかった気がします

keytool -genkey -v -keystore ~/鍵の名前.jks -keyalg RSA -keysize 2048 -validity 10000 -alias エイリアス

実行すると以下のような質問をされると思います。各項目に入力していってください。すべて答え終わるとホームディレクトリに鍵ファイルが作成されます。ストアパスワードは後で使うので覚えておいてください

キーストアのパスワードを入力してください: 
新規パスワードを再入力してください: 
姓名は何ですか。
  [Unknown]:  
組織単位名は何ですか。
  [Unknown]:  
組織名は何ですか。
  [Unknown]:  
都市名または地域名は何ですか。
  [Unknown]:  
都道府県名または州名は何ですか。
  [Unknown]:  
この単位に該当する2文字の国コードは何ですか。
  [Unknown]:  

署名の設定を行う

キーストアを作成したら次はbuild.gradleがその鍵の情報を取得できるようにする必要があります。

まずは<app dir>/android/key.propertiesを作成し、以下の4つの項目を記入します

storePassword=先程設定したストアパス
keyPassword=上と同じ
keyAlias=先程設定したエイリアス
storeFile=/Users/<user name>/鍵の名前.jks

このファイルをbuild.gradleで読めるようにします。
androidブロックの直前に以下の文章を記述するようにします

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

その後androidブロック内に以下の設定を記述します。signingConfigsの追加とbuildTypesの変更を行っておきます。

android {
    compileSdkVersion 30

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

    lintOptions {
        disable 'InvalidPackage'
    }

    // ここから追加
    signingConfigs {
        release {
            keyAlias keystoreProperties['keyAlias']
            keyPassword keystoreProperties['keyPassword']
            storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
            storePassword keystoreProperties['storePassword']
        }
    }
    
    // ここまで

    defaultConfig {
        applicationId "com.hoge.fuga"
        minSdkVersion 23
        targetSdkVersion 30
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
        signingConfig signingConfigs.release
    }
    
    // Build flavorを設定している場合
    flavorDimensions "default"
    productFlavors {

        develop {
            dimension "default"
            applicationId "com.hoge.fuga.develop"
        }

        staging {
            dimension "default"
            applicationId "com.hoge.fuga.staging"
        }

        production {
            dimension "default"
            applicationId "com.hoge.fuga"
        }
    }

    buildTypes {
        release {
            signingConfig signingConfigs.release  //debug->releaseに変更
        }
    }
}

これで署名の設定は完了です。後はビルドするときに勝手に組み込んでくれるようになります。

app bundleビルドをする

ではいよいよビルドをします。build.gradleのapplicationIDやpubspecのバージョンがあっていることを確認して、以下のコマンドをプロジェクトルートで実行します。

flutter build appbundle --flavor 任意のビルドモード

androidの方はiOSに比べて結構早くビルドが終わると思います。build/app/outputs/bundle/バンドル名以下にaabファイルが生成されていることを確認してください

play consoleでアプリを作成する

play consoleのログインにはgoogle play開発者プログラムに登録する必要があります。お金がかかるのでクレジットを用意しておきましょう。

play consoleにログインできたら右上に作成のボタンがあると思うので押して聞かれたことに答えていきます。最新バージョンのplay consoleでは向こうが内部テスト公開までにすべきことを教えてくれるので手順に従って進めていってください。

自分が進めるときに少し困った部分をいくつか紹介します。
[メインのストアの掲載情報]という項目でアプリの情報について記載する場所があります。もし内部テストがしたいだけでまだ全然ストア掲載情報なんて考えてないという方(自分もそうでした)は以下の進め方で問題ないです。

アイコン

プロジェクトに実際に格納しているアイコンとサイズが違うので気をつけてください。500×500にリサイズしましょう。

フィーチャーグラフィック

これは実際にストアに出すときはアプリの魅力がひと目で分かるような写真を用意する必要があるのですが、テストがしたいだけならその下の[携帯電話版のスクリーンショット]の部分に出した写真を横向きにして1024×500のサイズにするだけで問題ないです。
おそらくこの画像に関するチェックは行われていません

タブレット版のスクリーンショット

わかりにくいですが、これらは必須項目に見えて実は携帯版のスクリーンショットがあればスキップして良い項目です。スマホアプリを作っているケースが多いと思うので基本空欄で大丈夫です。

ビルドをアップロードする

上の作業がすべて終了すると、以下の画面の項目がアンロックされると思います

テスターを選択する

ここは特に解説することはありませんが、先にこちらを行っていないとビルドをアップロードしてから追加したメールアドレスにはリンクが届かなくなります。

新しいリリースを作成する

以下の画面になると思いますが、app bundleを使用している場合はgoogle play アプリ署名を有効にします(次へをクリックして有効にしてください)

後は先程ビルドしたaabファイルを選択してアップロードし、リリースの名前(バージョン?)を入れて保存するだけです。

リリースのレビュー

上の手順が終わるとリリースのレビューが行われます。機能によってはプライバシーポリシーの作成が求められたりするので作ってリンクを登録しましょう。

その他直すべき点をgoogleが教えてくれます。すべて直し終わったら正式にテスト版がアップロードできたことになります。テストを開始しましょう!

おわりに

もう少し細かく解説すべきところもあるかもしれませんがこの手順で自分はアップロードすることができました。google playはapp store connectに比べたら少しわかりやすいのかな?と感じてしまいます笑

ネイティブやったことない人にとって証明書とか署名とかの話はよくわからないことだらけだと思いますが、ドキュメントも整備されてはいるので根気よくやっていきましょう。

iOSの方も上げるべきだと感じたらあげます。ただandroidより解説記事が多くてそこまで情報がないわけではないのかなとも感じます

最後まで読んでくださりありがとうございました!

Discussion