ReactNativeのアプリは最終的にはAndroidかiOS(もしくはその両方)でのリリースを目指しています。 しかし、リリースビルドというものは短いスパンでそう何回も繰り返すものではないため、久々にやってみると思いもよらないトラブルに遭遇しがちです。 今回は、Androidのリリースビルド時にkeystoreファイルが消えてしまったトラブルを紹介します。
react-native
でアプリを開発Android
でリリースビルドを1回でもしたことがある仕事で開発しているReactNative
アプリで、久しぶりにAndroid
のリリースビルドを行うことになりました。
※しばらくはiOS
向けに細々した機能のリリースを行っていた
手順自体は明文化されているため、特に問題らしい問題もなく、いよいよ最後のkeystore
ファイルによる署名作業に移ろうとしました。
apksigner sign --ks app/my-release-key.keystore --ks-key-alias my-key-alias my-app.apk
・・・とここで謎のエラーが発生。
よくよく内容を見ていくとmy-release-key.keystore
が無くなっている。
戸惑いつつも、ソース自体はGitlab
で管理しているからkeystore
を取り直せばいいか、と思い直す(なぜkeystore
が消えたかは不明だが)。
しかし・・・
あれ?keystore
がGitになくない?
keystore
が必要か)Google Play Store
にAPK
ファイルをアップロードする際には、APK
ファイルに署名を行わなければなりません。
Google
側はこの署名を確認して、アプリの開発元が正しいものである(=正規のAPK
ファイルである)と判定します。
そして、その署名に必要になってくるのがkeystore
ファイル(とその中にあるalias
)です。
署名はAPK
ファイルのビルド時に行い、そこでkeystore
ファイル、alias
、alias
のパスワードを使います。
今回はkeystore
ファイルが何らかの原因で消失してしまったわけです。
Google
はGoogle Play App Signing
という署名方法を推奨しており、今回はこの方式を採用していたのでなんとかなった、という話です。
他の方式の場合は、そもそもkeystore
を紛失したら対応不可!なんて記事も見かけます(真偽は不明ですが・・・)
keystore
は消えた?こればかりは今今の時点で原因不明です。
先述の通り、ソースコードはGitlab
で管理しているのですが、keystore
は.gitignore
に含まれていたため、Git管理をしていませんでした。
それ自体は決して悪いことではなく(アプリリリースに関するkeystore
を考えもなしにGitの管理下に置くのはそれはそれでリスクがある)、ファイルサーバ等に置いて管理しているケースもあるようです。
いずれにせよ、今回は自端末(それも開発機として頻繁にソースをいじる)にしかリリース用のkeystore
を置いておらず、管理をしていないことが原因でした。
※ちなみに、この反省を受けて現在はGitlab
で管理しています。プロジェクトに関わるメンバなら見れてしまいますが、担当しかalias
のパスワードが分からないので大丈夫、という認識です。
もっと良い管理方法をご存じの方がいらっしゃいましたらコメントにてお教えください。
ざっくり説明すると、新規にkeystore
ファイルを作成し、pem
ファイルを作成。
作成したpem
ファイルをGoogle Play Console
からアップロードしてアップロード用鍵のリセットを申請した。ということです。
下記のコマンドを入力し、いくつかの質問に答えるとkeystore
ファイルが生成されます。最後にパスワードを聞かれるので登録する。
keytool -genkey -v -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000
下記のコマンドを入力し、keystore
生成時のパスワードを入力すると、pem
ファイルが生成されます。
keytool -export -rfc -alias my-key-alias -file my-release-key.pem -keystore my-release-key.keystore
これは先にちらっと出てきたGoogle Play App Signing
に関連しています。
Google Play App Signing
をざっくり説明すると、Google
に対してリリース用鍵
を渡し、APK
ファイルをビルドする際はアップロード用鍵
で署名する方式です。
この方式のポイントは、リリース用鍵
を管理しなくともよく、リリースする側(APK
をアップロードする側)はアップロード用鍵
だけを管理すればよいということです。
アップロード用鍵
は再登録できる(とはいても簡単にはできない)ので紛失しても安心、というわけです。
つまり、ここで生成したpem
ファイルは新たなリリース用鍵
で、keystore
はアップロード用鍵
です。
Google Play Console
で対象アプリを開いたら[リリース管理]→[アプリの署名]を開き、[鍵のアップグレードをリクエスト]をクリック。
事由を聞かれるので、 [各リリースの署名に使用しているアップロード鍵を紛失したため]を選択し[次へ]を押下
サポートに問い合わせてほしい旨のメッセージが表示されるので、[サポートにお問合せ]を押下。
問い合わせ画面が表示されるので、各種アプリ情報を入力して[鍵またはキーストアに関連する問題がある]を選択。
続いて[アップロード鍵を忘れた]を選択し、詳細を記入(下図参照)。
最後にpem
ファイルを添付して[送信]を実行。
数日経つとGoogle
から登録していたアドレス宛にメールが届きます。
内容をかみ砕くと、
といった旨です。
実際に指定された日時以降は、新しいkeystore
ファイルで署名をしたAPK
ファイルがリリースできるようになりました!
反省点としては、keystore
の管理方法が杜撰だったの一言に尽きます。
これは何もkeystore
だからという話に限らず、アプリやプロジェクトのコアとなる大事そうなファイル
はバックアップを取る、バージョン管理をするなどが重要です(初歩中の初歩ですが、今回は実際それができていなかった)。
なんにせよreact-native
のプロジェクトでは、デフォルトの.gitignore
に.keystore
を含めてあめ、今回と同じ事象に遭遇する方は少なからずいると思います。
その場合の一助になれば幸いです。