開発中はふつうに動くのに、ストアに出した Android のアプリだけ、起動した瞬間に落ちる。自作アプリ「株主優待カレンダー」で、このいやな不具合を踏みました。
原因は、アプリを小さくするためのコードの難読化(R8)でした。この記事では、何が起きたのか、なぜリリース版だけ落ちたのか、どう直したのかをまとめます。Capacitor で Android アプリを作っている人の参考になればうれしいです。
同じ話は、短い動画でも紹介しています。
何が起きたか
「株主優待カレンダー」は、株主優待の権利日や、届いた優待券の期限を管理して、前もって通知してくれるアプリです。画面は Web の技術(React)で作り、Capacitor という道具で iPhone と Android のアプリの形にしています。
あるアップデートで、Android のリリース版にコードの難読化(R8)を入れました。すると、使ってくれている人の端末で「開いたらすぐ閉じてしまう」ことが起きました。Android 14 前後の実機です。
やっかいなのは、開発中に動かす版(デバッグ版)では起きないことでした。デバッグ版は難読化をしないので、手元で試しても何も問題が見えません。
なぜリリース版だけ落ちたのか

難読化(R8)とは
R8 は、Android のアプリを作るときに、使っていないコードを消したり、名前を短く置きかえたりして、アプリを小さくする仕組みです。中身を読みにくくする効果もあるので「難読化」と呼ばれます。Google Play でも、使うことがすすめられています。
Capacitor の「目印」が消えた
Capacitor のプラグインは、コードに付けた目印(アノテーション)を読んで、「このプラグインはどの許可を使うか」を知ります。難読化をしたことで、通知のプラグインに付いていたこの目印が消えてしまいました。
株主優待カレンダーは、起動するときに「通知を出してよいか」の許可を確認します。そのとき、消えた目印を読もうとして何も見つからず、アプリが落ちていました。起動のたびに通る場所なので、「開いた瞬間に落ちる」になったわけです。
どう直したか
最初は、難読化の設定ファイル(ProGuard のルール)に「Capacitor の目印は消さないで」と書き足して、難読化を続けたまま直そうとしました。でも、それだけでは防ぎきれませんでした。
しかも、手元にいろいろな Android の実機をそろえて試せる環境がありません。直ったかどうかを確かめられないまま出すより、確実に起動することを優先して、次のアップデートで難読化そのものを外しました。設定は、リリース版の minifyEnabled を false にしただけです。これで起動で落ちることはなくなりました。
Google Play からは「アプリの最適化(R8)を使いましょう」という案内が出ていますが、まだ期限まで猶予があります。実機で試せる環境ができたら、難読化にはもう一度挑戦するつもりです。そのときのために、書き足したルールのファイルは残してあります。
リリース版を出す前に確かめたいこと
- 難読化(R8)を入れたら、リリース版を実機に入れて起動まで確かめる。デバッグ版で動いても安心しない
- 起動するときに通る処理(許可の確認など)は、落ちるとアプリがまったく使えなくなる。そこだけでも先に試す
- Capacitor のように目印(アノテーション)を読む仕組みを使っているなら、難読化で消えないかを気にしておく
- 確かめられないときは、無理に入れずに外しておくのも一つの手
まとめ
- Android のリリース版だけ、起動した瞬間に落ちた
- 原因は、コードの難読化(R8)で Capacitor の目印が消え、起動時の通知の許可の確認で落ちていたこと
- 実機で確かめる環境がないので、難読化を外して直した
「株主優待カレンダー」は、こちらのページから iPhone・Android 版を入れられます。アプリを作って公開するまでの話は、Windows だけで株主優待アプリを作って公開した話にまとめています。ほかに作ったアプリは 作ったもの にまとめています。
ナノトイラボ 
