メインコンテンツへスキップ

Google Playストアへの公開

Androidでは、すべてのアプリをインストールする前に証明書でデジタル署名することが義務付けられています。AndroidアプリケーションをGoogle Playストア経由で配布するためには、リリースキーで署名する必要があり、そのキーは将来のすべてのアップデートに使用する必要があります。2017年からは、Google Playによるアプリの署名機能のおかげで、Google Playがリリース署名を自動的に管理できるようになりました。しかし、アプリケーションのバイナリをGoogle Playにアップロードする前に、アップロードキーで署名する必要があります。Android Developersのドキュメントにあるアプリケーションへの署名のページで、このトピックについて詳しく説明されています。このガイドでは、そのプロセスを簡潔に説明し、JavaScriptバンドルのパッケージ化に必要な手順をリストアップします。

info

Expoを使用している場合は、Expoのガイドアプリストアへのデプロイを読んで、Google Playストア向けのアプリをビルドして提出してください。このガイドは、どのReact Nativeアプリでもデプロイプロセスを自動化するために機能します。

アップロードキーの生成

keytoolを使用して秘密署名キーを生成できます。

Windows

Windowsでは、keytoolは管理者としてC:\Program Files\Java\jdkx.x.x_x\binから実行する必要があります。

shell
keytool -genkeypair -v -storetype PKCS12 -keystore my-upload-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000

このコマンドは、キーストアとキーのパスワード、およびキーの識別名フィールドの入力を求めます。そして、my-upload-key.keystoreという名前のファイルとしてキーストアを生成します。

キーストアには、10000日間有効な単一のキーが含まれています。エイリアスは、後でアプリに署名する際に使用する名前なので、エイリアスをメモしておくことを忘れないでください。

macOS

macOSで、JDKのbinフォルダの場所がわからない場合は、次のコマンドを実行して見つけてください。

shell
/usr/libexec/java_home

これにより、次のようなJDKのディレクトリが出力されます。

shell
/Library/Java/JavaVirtualMachines/jdkX.X.X_XXX.jdk/Contents/Home

cd /your/jdk/pathコマンドを使用してそのディレクトリに移動し、以下に示すようにsudo権限でkeytoolコマンドを使用します。

shell
sudo keytool -genkey -v -keystore my-upload-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000
注意

キーストアファイルは非公開にしておくことを忘れないでください。アップロードキーを紛失した場合や漏洩した場合は、こちらの指示に従ってください。

Gradle変数の設定

  1. my-upload-key.keystoreファイルをプロジェクトフォルダのandroid/appディレクトリの下に配置します。
  2. ~/.gradle/gradle.propertiesファイルまたはandroid/gradle.propertiesファイルを編集し、以下を追加します(*****を正しいキーストアのパスワード、エイリアス、キーのパスワードに置き換えてください)。
MYAPP_UPLOAD_STORE_FILE=my-upload-key.keystore
MYAPP_UPLOAD_KEY_ALIAS=my-key-alias
MYAPP_UPLOAD_STORE_PASSWORD=*****
MYAPP_UPLOAD_KEY_PASSWORD=*****

これらはグローバルなGradle変数となり、後でGradle設定でアプリに署名するために使用できます。

gitの使用に関する注意

上記のGradle変数をandroid/gradle.propertiesではなく~/.gradle/gradle.propertiesに保存すると、gitにチェックインされるのを防げます。変数を追加する前に、ユーザーのホームディレクトリに~/.gradle/gradle.propertiesファイルを作成する必要があるかもしれません。

セキュリティに関する注意

パスワードを平文で保存したくない場合で、macOSを実行している場合は、Keychain Accessアプリに資格情報を保存することもできます。その場合、~/.gradle/gradle.propertiesの最後の2行は省略できます。

アプリのGradle設定に署名設定を追加する

最後に行う必要がある設定は、リリースビルドがアップロードキーを使用して署名されるように設定することです。プロジェクトフォルダ内のandroid/app/build.gradleファイルを編集し、署名設定を追加します。

groovy
...
android {
...
defaultConfig { ... }
signingConfigs {
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 {
release {
...
signingConfig signingConfigs.release
}
}
}
...

リリースAABの生成

ターミナルで次のコマンドを実行します。

shell
npx react-native build-android --mode=release

このコマンドは内部でGradleのbundleReleaseを使用し、アプリの実行に必要なすべてのJavaScriptをAAB(Android App Bundle)にバンドルします。JavaScriptバンドルやドローアブルリソースのバンドル方法を変更する必要がある場合(例えば、デフォルトのファイル/フォルダ名やプロジェクトの全体構造を変更した場合)、android/app/build.gradleを見て、これらの変更を反映するように更新する方法を確認してください。

note

gradle.propertiesorg.gradle.configureondemand=trueが含まれていないことを確認してください。これがあると、リリースビルドでJSとアセットのアプリバイナリへのバンドルがスキップされます。

生成されたAABはandroid/app/build/outputs/bundle/release/app-release.aabにあり、Google Playにアップロードする準備ができています。

Google PlayがAAB形式を受け入れるためには、Google Play Consoleでアプリケーションに対して「Google Playによるアプリの署名」が設定されている必要があります。既存のアプリを更新していて、「Google Playによるアプリの署名」を使用していない場合は、移行セクションを確認して、その設定変更を行う方法を学んでください。

アプリのリリースビルドのテスト

リリースビルドをPlayストアにアップロードする前に、徹底的にテストすることを確認してください。まず、すでにインストールされている以前のバージョンのアプリをアンインストールします。プロジェクトのルートで次のコマンドを使用してデバイスにインストールします。

shell
npm run android -- --mode="release"

--mode releaseは、上記のように署名設定を行っている場合にのみ利用可能です。

フレームワークとJavaScriptコードはすべてAPKのアセットにバンドルされているため、実行中のバンドラーインスタンスはすべて終了できます。

他のストアへの公開

デフォルトでは、生成されたAPKにはx86x86_64ARMv7aARM64-v8aの両方のCPUアーキテクチャ用のネイティブコードが含まれています。これにより、ほぼすべてのAndroidデバイスで動作するAPKを簡単に共有できます。しかし、これにはどのデバイスでも未使用のネイティブコードが存在することになり、不必要にAPKが大きくなるという欠点があります。

android/app/build.gradleファイルに次の行を追加することで、CPUごとにAPKを作成できます。

diff
android {

splits {
abi {
reset()
enable true
universalApk false
include "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
}
}

}

Amazon AppStoreF-Droidなど、デバイスターゲティングをサポートするマーケットにこれらのファイルをアップロードすると、ユーザーは自動的に適切なAPKを取得します。単一アプリに対して複数のAPKをサポートしていないAPKFilesのような他のマーケットにアップロードしたい場合は、universalApk falseの行をtrueに変更して、両方のCPUのバイナリを含むデフォルトのユニバーサルAPKを作成します。

公式のAndroidドキュメントのこのページで提案されているように、個別のバージョンコードも設定する必要があることに注意してください。

Proguardを有効にしてAPKのサイズを削減する(オプション)

Proguardは、APKのサイズをわずかに削減できるツールです。これは、アプリが使用していないReact NativeのJavaバイトコード(およびその依存関係)の一部を削除することによって行われます。

重要

Proguardを有効にした場合は、アプリを徹底的にテストしてください。Proguardは、使用している各ネイティブライブラリに固有の設定を必要とすることがよくあります。app/proguard-rules.proを参照してください。

Proguardを有効にするには、android/app/build.gradleを編集します。

groovy
/**
* Run Proguard to shrink the Java bytecode in release builds.
*/
def enableProguardInReleaseBuilds = true

古いAndroid React NativeアプリをGoogle Playによるアプリ署名を使用するように移行する

以前のバージョンのReact Nativeから移行している場合、アプリはGoogle Playによるアプリ署名機能を使用していない可能性があります。自動アプリ分割などの利点を活用するために、これを有効にすることをお勧めします。古い署名方法から移行するには、まず新しいアップロードキーを生成し、次にandroid/app/build.gradleのリリース署名設定を、リリースキーの代わりにアップロードキーを使用するように置き換える必要があります(Gradleへの署名設定の追加に関するセクションを参照)。それが完了したら、Google Playヘルプウェブサイトの指示に従って、元のリリースキーをGoogle Playに送信する必要があります。

デフォルトの権限

デフォルトでは、ほとんどすべてのアプリがインターネットを使用するため、INTERNET権限がAndroidアプリに追加されます。SYSTEM_ALERT_WINDOW権限はデバッグモードでAndroid APKに追加されますが、本番環境では削除されます。