エラーの内容
アプリをタップすると、次のダイアログが表示されます:
Unfortunately, "App" has stopped.
アプリが即座に閉じます。再度開こうとしても同じダイアログが表示されるか、数秒後にクラッシュします。これはアプリが再起動ループに陥っているのではありません。アプリが回復不能な例外に遭遇したことを意味します:キャッシュの破損、権限の取り消し、または内部データの破損が原因です。
発生原因
アプリのプロセスが未処理の例外で終了した瞬間、Android はそれを強制終了してこのダイアログを表示します。リトライも正常終了もありません。最も一般的な原因は以下の通りです:
- キャッシュの破損 — 古くなったり不正な形式のキャッシュデータが、起動時にアプリをクラッシュさせる
- アプリデータの破損 — データベース、SharedPreferences、または内部ファイルが壊れた状態になっている
- 実行時権限の不足 — Android 6.0 以降では明示的なユーザー許可が必要で、権限が取り消されると拒否を適切に処理しないアプリはクラッシュする
- 非互換なアップデート — 最近のアプリまたは OS のアップデートがアプリの内部処理を破壊した
- ストレージ不足 — アプリが一時ファイルを書き込めず、即座に終了する
ステップごとの修正方法
ステップ 1:アプリのキャッシュをクリアする
まずここから始めましょう。完全に安全な操作です — 一時ファイルのみが削除され、個人データは削除されません。
- 設定 → アプリ → [アプリ名] → ストレージ → キャッシュを削除 に移動する
アプリを再起動します。正常に起動しましたか?クラッシュは不正なキャッシュエントリが原因でした。完了です。
ステップ 2:アプリデータをクリアする
キャッシュのクリアで解決しませんでしたか?より深いところに踏み込みましょう。アプリデータのクリアは、初回インストール直後の状態にリセットします。ローカルに保存された設定、ログインセッション、オフラインデータは失われますが、サーバーに同期されたデータは安全です。
- 設定 → アプリ → [アプリ名] → ストレージ → データを削除
アプリを再起動して、初期設定を行ってください。
ステップ 3:権限を確認して再付与する
権限の不足は気づきにくい原因です。以下に移動してください:
- 設定 → アプリ → [アプリ名] → 権限
拒否または毎回確認に設定されているものを探して、許可に変更してください。よくある対象:ストレージ、連絡先、電話、カメラ。
ステップ 4:使用可能なストレージを確認する
容量がいっぱいのデバイスはよくある原因です。アプリは一時ファイルを書き込めなくなった瞬間にクラッシュします。
- 設定 → ストレージ — 通常の動作には少なくとも 500 MB の空き容量を確保することを目安にする
使用していないアプリを削除したり、他のアプリのキャッシュをクリアしたり、メディアを SD カードやクラウドストレージに移したりしてください。
ステップ 5:アンインストールして再インストールする
まだクラッシュしますか?APK 自体が破損している可能性があります — これはデータのリセットでは修正できません。クリーンな再インストールで解決することが多いです。
- アプリアイコンを長押し → アンインストール
- Google Play ストアから再インストールする
すぐにバックアップから復元しないでください。まず新規インストールで起動し、クラッシュが解消されたことを確認してからデータを戻してください。
ステップ 6:ADB Logcat で診断する(開発者向け修正)
開発者向け、またはこれまでのすべてのステップを経ても解決しない頑固なクラッシュの場合 — ADB logcat によって問題の原因となっている正確な例外とコード行番号が明らかになります。
USB デバッグを有効にして USB でデバイスを接続し、以下を実行してください:
adb logcat -c
adb logcat *:E | grep -i "your.package.name"
クラッシュを再現してください。出力には正確な例外が記載されます。よくあるパターン:
# NullPointerException — 未初期化のオブジェクト
FATAL EXCEPTION: main
java.lang.NullPointerException: Attempt to invoke virtual method on a null object reference
# OS レベルでの Permission denied
java.lang.SecurityException: Permission Denial: reading com.android.providers.contacts
# データベースの破損
android.database.sqlite.SQLiteDatabaseCorruptException: database disk image is malformed
致命的なクラッシュのみをフィルタリングするには:
adb logcat AndroidRuntime:E *:S
root 取得済みのデバイスでは、アプリのデータディレクトリから直接破損ファイルを確認できます:
adb shell run-as your.package.name ls /data/data/your.package.name/
ステップ 7:以前のバージョンにロールバックする
アップデート直後からクラッシュが始まりましたか?ロールバックしてください:
- 設定 → アプリ → [アプリ名] → ⋮(メニュー)→ アップデートのアンインストール(システムアプリのみ)
- サードパーティアプリ:信頼できるソースから以前の APK をダウンロードして、
adb install -r app-old.apkでサイドロードする
修正の確認
- アプリを開く — クラッシュダイアログなしに起動するはずです
- 以前クラッシュしていた画面に移動する
- クラッシュを引き起こしていた操作を実行する(特定のアイテムの読み込み、ボタンのタップなど)
- 並行して
adb logcat AndroidRuntime:E *:Sを実行して、新たな例外が出ていないことを確認する
ヒント
- タスクキラーは使わない — クラッシュを防ぐどころか、書き込み途中で処理を切断してクラッシュを引き起こす可能性がある
- Play ストアのアップデートを確認する — Play ストアを開いてライブラリを確認し、アプリに保留中のアップデートがないか見てみる
- セーフモードを試すことでサードパーティの干渉を切り分けられます:電源ボタンを長押し → 電源を切るを長押し → セーフモードをタップ。そこでアプリが正常に動作するなら、他にインストールされているアプリが原因です
- 工場出荷状態へのリセットは絶対的な最終手段 — 事前にすべてバックアップを取ること:
adb backup -apk -shared -all -f backup.ab

