

Android Studioで作成してApk化してGoogle Play
Storeにアップして1か月ほど経ったアプリがあります。最近レビュー欄を見ると「インストールして起動すると落ちる」というユーザーが多数みえます。アプリを実機やエミュレータでコンパイルしてテストをしても自分の方では問題がまったく発生しません。こういった場合どういった問題か突き止める方法（コツ）はありますか？


CC BY-SA 4.0
2016-08-12T09:08:21.987
28213
2021-03-07T05:06:35.643
2021-03-07T05:06:35.643
3060
10206
question
java android debugging
起動すると落ちる原因を探すコツ


アプリのジャンルにもよると思いますが、私がよくやる方法で、複数のアプリに共通して使えそうな方法を書きます。

まず、これは多分テスト済みと思いますが、コードを難読化していると思いますので、APKをテスト用端末に入れてインストールするか、リリースしているアプリ（α版など）をストアからテスト用端末にダウンロードしてテストします。これは、最適化の過程で必要なファイルまで無くなっており、そのせいで落ちることがあるからです。USBを繋いで行うテスト用の実行のみでは見つからない場合があります。これが原因の場合は難読化ツールの設定を見直します。

次に、デヴェロッパーコンソールでエラー報告がないかチェックし、あれば該当部分が表示されている筈なので修正します。これは場合によっては数時間程度のタイムラグがありますので、定期的に見るべきです。

報告が無い場合は、Lintチェックを行います。見落としがちなのが対応APIレベル別の処理漏れです。これはそのまま落ちる原因となります。エミュレータで対応している各APIレベルの仮想デバイスを使用し、テストを行うのも有効です。特定のバージョンだけでエラーが発生している可能性があります。

更に、アプリの起動・ポーズ・復帰・終了を、ホームボタン、放置、バックキーなど、様々な組み合わせで行い、ライフサイクルテストを行います。この時、軽い負荷テストも行っておきます。これはアプリを起動しておき、ホームキーでポーズ状態にしてから、3Dゲームなどの重い処理を行い、アプリに戻ります。適切にライフサイクル管理が出来ていない場合はオブジェクトがNullになっており落ちるでしょう。長時間放置後にアプリを起動しても起こる場合があります。

これらで解決しない場合はアプリによっての切り分けになります。

ひとまず端末依存を検証します。例えばカメラなど、端末によって利用できる機能に差異があるデバイスをアプリが利用している場合、例外処理が必須です。この辺りを見直します。

ネットワーク処理も見直します。スマートフォンは常にネットワーク状態が良好とは限りません。接続が切れることを意識してコーディングする必要があります。Wifiのみのモデルを使用して、電波の無い状態でのテストや、途中でWifiを切った場合のテストなどを行います。

その他、エラー報告されにくいため気づきにくいものには、OutOfMemoryErrorがあります。これで落ちた場合、エラーを報告するために表示される送信フォームまで落ちる場合があります。画像を沢山使用しているアプリでは要注意です。特に、開発にNexusなどの高性能機とエミュレータのみを使用している場合、これはテストでは発生しないエラーになりえます。低性能の端末でテストしたり、メモリ(RAM)の使用量をツールを使ってチェックします。インタースティシャル広告を使用している場合、ロードと共にOutOfMemoryErrorが起こることもあります。これもテストだと出にくい（本番の方が負荷が高い場合がある）ですから、利用する場合は必ずメモリに十分な余裕を持たせておく必要があります。

ここまでで該当しない場合、マルチスレッド関係のバグやVMの実行順序、VMのメモリアクセスを疑います。synchronizedやvoratileを正しく使用しているかを再確認します。また、CPUのアーキテクチャがx86の端末とARMの端末の両方で問題が無いか確認します。

私の場合はこんな感じですね。


CC BY-SA 3.0
2016-08-12T16:34:08.367
28230
2016-08-20T23:36:32.013
2016-08-20T23:36:32.013
8795
8795
28213
answer


クラッシュレポートサービスは利用されていますか？  
もしされてなければ、fabric の Crashlytics をおすすめします。  
<https://get.fabric.io/android?locale=ja>

Crashlytics をアプリに入れておくと、ユーザの端末で発生した例外を  
fabricの管理画面から確認することができます。  
この画面からStackTraceや、OSバージョン、機種など、  
例外の再現情報を手に入れることができるので、原因を探す手がかりになるはずです。

[![画像の説明をここに入力](https://i.stack.imgur.com/Aj1ux.jpg)](https://i.stack.imgur.com/Aj1ux.jpg)

Crashlyticsの他にも同様なサービスがあります。  
<https://firebase.google.com/docs/crash/>  
<https://www.hockeyapp.net/>  
<https://www.apteligent.com/>  
<https://mint.splunk.com/>

すべての例外をレポートしてくれるわけではありませんが、  
このようなサービスを使って、どんなクラッシュが起きているか  
まず確認するのが良いかなと思います。


CC BY-SA 3.0
2016-08-12T21:56:37.053
28232
2016-08-12T22:51:16.853
2016-08-12T22:51:16.853
15228
15228
28213
answer