プログラム関係の備忘録。技術系記事1000記事以上を目指すブログ

react-nativeで初めてのnativeアプリリリース(android編)

Androidアプリのリリースを行うのは初めてでしたので、備忘録をかねて残しておきます。扱い慣れたWebとは違い全く未知の領域なので不安がありましたが、幸いネット上の情報が多く問題なく進めていくことができました。

1.GooglePlayの開発者登録を行う

1-1.Googleアカウント作成

https://accounts.google.com/signup

Googleアカウントはいろいろなサービスに紐づくので、既にアカウントを持っている場合でも、開発用に新しく取得したほうが何かとよさそうです。

1-2.Google Play Consoleにログイン

https://developer.android.com/distribute/console/index.html

$25の支払を行います。
googleはこの約2500円を一度払うのみでOK。(Appleは年更新)

支払い後の画面。
残りの情報を入力し登録を完了させます。

登録完了で以下ページにアクセスできるようになります。

2.作ったアプリを公開するための準備

大まかに以下の手順が必要

  • 公開用に、デジタル署名したパッケージファイル(apk)の準備
  • GooglePlay ストアの掲載情報を登録する
  • アプリのリリース情報を管理(追加)

2-1.build前の準備

2-1-1.keystoreを作成

keytool -genkey -v -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000

「my-release-key.keystore」が生成されるので、android/app配下に移動

生成時に入力した情報は大切に保管しておく。

2-1-2.andoroidディレクトリ内のManifestfileを変更

android/app/src/main/AndroidManifest.xml

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

    <uses-permission android:name="android.permission.INTERNET" />

    <application
      android:name=".MainApplication"
      android:label="@string/app_name"
      android:icon="@mipmap/ic_launcher"
      android:roundIcon="@mipmap/ic_launcher_round"
      android:allowBackup="false"
      android:theme="@style/AppTheme">
      <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode"
        android:launchMode="singleTask"
        android:windowSoftInputMode="adjustResize">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
      </activity>
      <activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
    </application>

</manifest>

android:versionCode
android:versionName 

android:label
android:icon
を変更

参照先は「android/app/src/main/res/values/strings.xml」にあるのでそっちを書き換える

2-1-3.gradle.propertiesファイルを変更

android\gradle.propertiesでキーストアの設定を追加します。
my-key-aliasも任意のaliasで可

MYAPP_UPLOAD_STORE_FILE=my-release-key.keystore
MYAPP_UPLOAD_KEY_ALIAS=my-key-alias
MYAPP_UPLOAD_STORE_PASSWORD=*******
MYAPP_UPLOAD_KEY_PASSWORD=*******

2-1-4.build.gradleファイルの修正

app\guild.gradleファイルにリリース時用の設定を追記

    signingConfigs {
        debug {
            storeFile file('debug.keystore')
            storePassword 'android'
            keyAlias 'androiddebugkey'
            keyPassword 'android'
        }
// 以下を追記
        release {
            if (project.hasProperty('MYAPP_UPLOAD_STORE_FILE')) {
                storeFile file(MYAPP_UPLOAD_STORE_FILE)
                storePassword MYAPP_UPLOAD_STORE_PASSWORD
                keyAlias MYAPP_UPLOAD_KEY_ALIAS
                keyPassword MYAPP_UPLOAD_KEY_PASSWORD
            }
        }
// --
    }
    buildTypes {
        debug {
            signingConfig signingConfigs.debug
        }
        release {
            // Caution! In production, you need to generate your own keystore file.
            // see https://facebook.github.io/react-native/docs/signed-apk-android.
// 以下をdebugからreleaseに変更
            signingConfig signingConfigs.release
// --
            minifyEnabled enableProguardInReleaseBuilds
            proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
        }
    }

2-2.Androidアプリを公開用にbuild

2-2-1.androidディレクトリ配下でbuildを実行

./gradlew assembleRelease

「apk」ファイルが「android\app\build\outputs\apk\release」配下にできあがります。

2-2-2.上記のファイルにデジタル署名を行う

jarsigner -verbose -keystore my-release-key.keystore app/build/outputs/apk/release/app-release.apk my-key-alias

※2-1-3~2-1-4でファイルを編集しておくとbuild時にデジタル署名をしてくれるので不要

2-2-3.zipalignを行いapkを最適化する

調べたが詳しくはわからないけどお約束事のようなものと書いてあったので、言われるがままにやる。

zipalign -v 4 <元のapkファイル名> <最適化後のapkファイル名>
zipalign -f -v 4 app/build/outputs/apk/release/app-release.apk outfile.apk

最適化されているか確認するのは以下のコマンド

zipalign -c -v 4 

zipalignコマンドとか、いきなり登場したけどなんじゃと思ったら案の定エラー。

「’zipalign’ は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。」

AndroidStudioでAndroid SDK Managerの「Build-tools」をインストールする必要がありました。

zipalignまでのパスを通します

C:\Users\ユーザー名\AppData\Local\Android\sdk\build-tools\バージョン

パスを通すとなぜかAndroidStudioが起動しなくなりましたが、恐らくいまは無関係な部分なのでVSCodeからzipalignコマンドを再度実行するとうまくいきました。

これで署名&最適化されたapkファイルが生成されます。

2-2-4.リリース時のコマンドの違い

どうやらビルドファイルを生成するにはいくつかコマンドがあるよう。

./gradlew bundleRelease
./gradlew assembleRelease
./gradlew installRelease

それぞれの使用例は以下のようになってました。

I use assembleRelease to build an apk that I want to share with other people.

I use installRelease when I want to test a release build on a connected device.

I use bundleRelease when I am uploading my app to the Play Store.

説明については以下で詳しく説明がありました。
https://stackoverflow.com/questions/57072558/whats-the-difference-between-gradlewassemblerelease-gradlewinstallrelease-and

上記で行うassembleReleaseの場合は「apk」ファイルが生成され、bundleReleaseでは「aab」ファイルが生成されます。

※英文を読む限り他の人に教えるのはassembleReleaseでいいように感じますが、以下で解説する実機検証はbundleリリースでのみうまくいきました。

googleplaystoreに公開時もbunbleReleaseが推奨されているようです。

ちょっとよくわかってないというのが正直なところ。

bundleリリースの場合も同様にzipalignは行うので、パスを書き換えてやります。

3.公開前にリリース版を使って実機検証

エミュレータでのテストしかやっていない、オープンβとして周りに配布したいという場合に便利なサービスがこちら。
https://deploygate.com/

リンクのサイトにaabをアップロードすれば本当に驚くほど簡単に実機へのインストールを行うことができました。

無料版でも一通りは使えるのでとてもオススメです。

4.ついにgoogle playにアプリを公開

GOOGLE PLAYにANDROIDアプリを公開ボタンから、言語、アプリ名を入力します。デフォルトの言語は日本限定でリリースしたい場合を除き、英語にしておくと良いらしいです。

このように情報入力が済んだ箇所からチェックマークがついていきます。
説明は日本語で特に難しい部分もなさそうでしたので、それぞれの入力については割愛します。

おつかれさまでした!

その他得た知見など

各サイズのアイコン一括生成に便利
https://resizeappicon.com/