Google Playストアへの公開
Androidでは、すべてのアプリをインストールする前に、証明書でデジタル署名する必要があります。AndroidアプリケーションをGoogle Playストア経由で配布するには、リリースキーで署名する必要があり、そのキーは今後のすべてのアップデートに使用する必要があります。2017年以降、Google Playによるアプリ署名機能のおかげで、Google Playが署名リリースを自動的に管理できるようになりました。ただし、アプリケーションバイナリをGoogle Playにアップロードする前に、アップロードキーで署名する必要があります。Android Developersドキュメントのアプリケーションへの署名ページで、このトピックについて詳しく説明しています。このガイドでは、そのプロセスを簡単に説明し、JavaScriptバンドルをパッケージ化するために必要な手順をリストします。
Expoを使用している場合は、ExpoガイドのApp Storeへのデプロイを参照して、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を実行している場合は、キーチェーンアクセスアプリに資格情報を保存することもできます。その後、~/.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
このコマンドは、アプリを実行するために必要なすべてのJavaScriptをAAB(Android App Bundle)にバンドルする、GradleのbundleRelease
を内部で使用します。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ドキュメントのこのページで推奨されているように、異なるバージョンコードも構成する必要があることに注意してください。
APKのサイズを縮小するためのProguardの有効化(オプション)
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
Google Playによるアプリ署名を使用するための古いAndroid React Nativeアプリの移行
以前のバージョンのReact Nativeから移行する場合、アプリはGoogle Playによるアプリ署名機能を使用していない可能性があります。自動アプリ分割などのメリットを享受するため、これを有効にすることをお勧めします。古い署名方法から移行するには、まず新しいアップロードキーを生成し、次にandroid/app/build.gradle
のリリース署名構成を、リリースキーの代わりにアップロードキーを使用するように置き換える必要があります(gradleに署名構成を追加するセクションを参照)。それが完了したら、Google Playヘルプウェブサイトの指示に従って、元のリリースキーをGoogle Playに送信する必要があります。
デフォルトのパーミッション
デフォルトでは、ほとんどすべてのアプリで使用されるため、INTERNET
パーミッションがAndroidアプリに追加されます。SYSTEM_ALERT_WINDOW
パーミッションはデバッグモードでAndroid APKに追加されますが、本番環境では削除されます。