Google Playストアへの公開
Androidでは、すべてのアプリをインストールする前に証明書でデジタル署名することが義務付けられています。AndroidアプリケーションをGoogle Playストア経由で配布するためには、リリースキーで署名する必要があり、そのキーは将来のすべてのアップデートに使用する必要があります。2017年からは、Google Playによるアプリの署名機能のおかげで、Google Playがリリース署名を自動的に管理できるようになりました。しかし、アプリケーションのバイナリをGoogle Playにアップロードする前に、アップロードキーで署名する必要があります。Android Developersのドキュメントにあるアプリケーションへの署名のページで、このトピックについて詳しく説明されています。このガイドでは、そのプロセスを簡潔に説明し、JavaScriptバンドルのパッケージ化に必要な手順をリストアップします。
Expoを使用している場合は、Expoのガイドアプリストアへのデプロイを読んで、Google Playストア向けのアプリをビルドして提出してください。このガイドは、どのReact Nativeアプリでもデプロイプロセスを自動化するために機能します。
アップロードキーの生成
keytool
を使用して秘密署名キーを生成できます。
Windows
Windowsでは、keytool
は管理者としてC:\Program Files\Java\jdkx.x.x_x\bin
から実行する必要があります。
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フォルダの場所がわからない場合は、次のコマンドを実行して見つけてください。
/usr/libexec/java_home
これにより、次のようなJDKのディレクトリが出力されます。
/Library/Java/JavaVirtualMachines/jdkX.X.X_XXX.jdk/Contents/Home
cd /your/jdk/path
コマンドを使用してそのディレクトリに移動し、以下に示すようにsudo権限でkeytoolコマンドを使用します。
sudo keytool -genkey -v -keystore my-upload-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000
キーストアファイルは非公開にしておくことを忘れないでください。アップロードキーを紛失した場合や漏洩した場合は、こちらの指示に従ってください。
Gradle変数の設定
my-upload-key.keystore
ファイルをプロジェクトフォルダのandroid/app
ディレクトリの下に配置します。~/.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設定でアプリに署名するために使用できます。
上記のGradle変数をandroid/gradle.properties
ではなく~/.gradle/gradle.properties
に保存すると、gitにチェックインされるのを防げます。変数を追加する前に、ユーザーのホームディレクトリに~/.gradle/gradle.properties
ファイルを作成する必要があるかもしれません。
パスワードを平文で保存したくない場合で、macOSを実行している場合は、Keychain Accessアプリに資格情報を保存することもできます。その場合、~/.gradle/gradle.properties
の最後の2行は省略できます。
アプリのGradle設定に署名設定を追加する
最後に行う必要がある設定は、リリースビルドがアップロードキーを使用して署名されるように設定することです。プロジェクトフォルダ内のandroid/app/build.gradle
ファイルを編集し、署名設定を追加します。
...
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の生成
ターミナルで次のコマンドを実行します。
npx react-native build-android --mode=release
このコマンドは内部でGradleのbundleRelease
を使用し、アプリの実行に必要なすべてのJavaScriptをAAB(Android App Bundle)にバンドルします。JavaScriptバンドルやドローアブルリソースのバンドル方法を変更する必要がある場合(例えば、デフォルトのファイル/フォルダ名やプロジェクトの全体構造を変更した場合)、android/app/build.gradle
を見て、これらの変更を反映するように更新する方法を確認してください。
gradle.properties
にorg.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ストアにアップロードする前に、徹底的にテストすることを確認してください。まず、すでにインストールされている以前のバージョンのアプリをアンインストールします。プロジェクトのルートで次のコマンドを使用してデバイスにインストールします。
- npm
- Yarn
npm run android -- --mode="release"
yarn android --mode release
--mode release
は、上記のように署名設定を行っている場合にのみ利用可能です。
フレームワークとJavaScriptコードはすべてAPKのアセットにバンドルされているため、実行中のバンドラーインスタンスはすべて終了できます。
他のストアへの公開
デフォルトでは、生成されたAPKにはx86
、x86_64
、ARMv7a
、ARM64-v8a
の両方のCPUアーキテクチャ用のネイティブコードが含まれています。これにより、ほぼすべてのAndroidデバイスで動作するAPKを簡単に共有できます。しかし、これにはどのデバイスでも未使用のネイティブコードが存在することになり、不必要にAPKが大きくなるという欠点があります。
android/app/build.gradle
ファイルに次の行を追加することで、CPUごとにAPKを作成できます。
android {
splits {
abi {
reset()
enable true
universalApk false
include "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
}
}
}
Amazon AppStoreやF-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
を編集します。
/**
* 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に追加されますが、本番環境では削除されます。