まえがき
こんにちは!
皆様は、「何もしていないのにこわれた!」というクレームを一度くらいは聞いたことがあるかと思います。
原因としては、仕様の理解不足や、誤った対応によるヒューマンエラーが主と思います。
しかしながら、今回私が直面したのは、昨日まで動いていた AVD Managerの仮想端末が、突然クラッシュし続けて起動不可になった事案です。
∧∧∧∧∧∧∧∧∧∧∧∧∧∧∧∧∧
<<何もしていないのにこわれた!>>
∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨
…もちろんジョーク(と思いたい)ですが、原因の根元を特定するまでに困難が伴いました。
今回は、Androidエミュレーターが起動しない問題に直面したときの苦労と、その解決までの道のりをまとめてみます。同じような状況で困っている人たちの助けになれば幸いです。
背景
Android Studioを使ってアプリを開発しているとき、ほぼ必須とも言えるのが「Androidエミュレーター」。
実機テスト前の確認として、アプリのテストができる便利なツールですが、ある日突然 「エミュレーターが起動しない」 という事態に遭遇しました。
最初は軽い気持ちで「設定をちょっといじれば直るでしょ」と思っていましたが、それは甘い考えでした……。
問題の発端
兆候
2月にAndroid Studioの更新(Koala→Ladybug)があり、社内ツール規模の開発だったこともあり、更新を行いました。その後、既存のイメージ(Pixel 6a, API 33)を起動しようとしたところ、以下のような状況が発生しました。
Android Studio からエミュレーターを起動するとクラッシュ
ログにはFailed to load snapshot 'default_boot'
やexit code -1073740940
といったエラーが。
しかし、新しいイメージ(Pixel8, API 35)を作ったところ動作したので、しばらく静観していました。
本格的な障害
2/3には、新しいエミュレーターも起動できなくなってしまいました。
AVD Manager > Cold Bootを試しても結果は変わらず。
ターミナルから emulator -avd {新しいエミュレーターの名前} -gpu swiftshader
を実行すると起動。
ただし、Android Studio 経由では常にクラッシュ。
adbによる手動起動なら成功しますが、このままではスクリプトやadbによるテストアプリインストールなど、CLIでのやりとりでしか仮想端末のテストができないことを意味しています。
しかも、ADB サーバーを再起動しても、仮想端末が起動前にTerminatedする。
このままでは使い物にならないので、より深い原因究明を模索することにしました。
エラーログやメッセージを前提に探索していくわけですが、正直何言ってるかわからないですね状態なので、生成AIと二人三脚で解決を試みることにしました。
もちろん、回答を得られても、言ってることさっぱりわからない場合がほとんど。都度自力で調べたり、さらにAIに問うたりすることもしています。
解決までの道のり
問題解決に向けて、いくつかの手段を試しました。その中で、特に効果があった対策と失敗例をまとめます。
1. スナップショットの無効化
最初気になったのが、エラーログに頻出していた「Failed to load snapshot」というメッセージ。どうやら スナップショット(default_boot)が破損 している模様。
対策:
- 壊れているスナップショットフォルダを削除:
C:\Users\<ユーザー名>\.android\avd\Pixel_6a_API_33.avd\snapshots
- {端末イメージ名}.config.ini の設定を以下のように変更:
fastboot.forceColdBoot=true
firstboot.bootFromLocalSnapshot=false
firstboot.saveToLocalSnapshot=false
結果
クラッシュは減少したものの、根本的解決には至らず。
2. GPU レンダリング設定の変更
エミュレーターが起動する際、OpenGL の互換性に問題があるログを検知したため、レンダリング方法を swiftshader(ソフトウェアレンダリング) に切り替えました。
ソフトウェアレンダリングとは
【引用】
クイックブートと互換性のあるバリアントの SwiftShader を使用して、ソフトウェア アクセラレーションでグラフィックをレンダリングします。このオプションは、コンピュータでハードウェア アクセラレーションを使用できない場合、host モードの代替として使用できる優れたオプションです。
【引用終わり】
対策:
- {端末イメージ名}.config.ini の設定を追加:
hw.gpu.enabled=yes
hw.gpu.mode=swiftshader
hw.angle.enabled=false
または、ターミナルから以下を実行:
emulator -avd Pixel_6a_API_33 -gpu swiftshader_indirect
結果
手動起動では成功。しかし、Android Studio からの起動は引き続き失敗。
3. AVD の再作成
エミュレーター設定自体が破損している可能性を疑い、既存の AVD を削除して新たに作成。
対策:
- AVD Manager で Pixel 6a を削除し、Pixel 6 を再作成
- APIレベルを下げる(API 32 など) と安定する場合があるので試行
- Cold Boot をデフォルトに設定
結果
Pixel 6(API 33)で安定動作を確認。 Pixel 6a 以降は依然として手動起動のみ成功
4. Android Studio の完全リセット
問題が Android Studio 本体にある可能性を排除するため、以下を実施
対策:
-
Android Studio をアンインストール。
-
設定ファイルやキャッシュを削除:
C:/Users/<ユーザー名>/.android
C:/Users/<ユーザー名>/AppData/Local/Google/AndroidStudio*
C:/Users/<ユーザー名>/AppData/Roaming/Google/AndroidStudio*
再インストール後、SDK と AVD を再設定。
プログラムのアンインストール実施だけでは不十分です。残っているものをすべて削除しましょう
結果:
ここまでしても、Pixel 6a 以降の仮想端末の問題は解消されず。
最終的な結論
Pixel 6a 以降のエミュレーターで Graphics 設定が固定(変更不可) になっており、手動起動(コマンドラインから)以外では安定しない という結論に至りました。
Pixel 6(API 33)や古いバージョンでは問題なく動作するので、特定のバージョン間の互換性に起因する可能性が高いです。
学んだこと
今回のトラブルを通じて、以下の点が学べました。
1.トラブルシューティングにはログの解析が重要
エラーログ(idea.log やターミナル出力)を元に問題箇所を特定する。
手動起動で問題を切り分ける
2.Android Studio 経由で動かない場合でも、コマンドラインから起動すると原因が見える
どこの何でエラーが発生しているか、WARNやERRORの個所を丹念にチェックする
3.レンダリング方法の変更で安定化する
ソフトウェアレンダリング(swiftshader)は古い GPU との互換性問題を回避できる。
古いAPIレベルは安定しやすい
4.最新の API レベルは、システムイメージやエミュレーター自体に不安定さを残す可能性がある
最新のStableでもクラッシュしうる
まとめ
エミュレーターが動かなくなると、開発が完全に止まるため、とても焦ります。
今回のようにログ解析や手動起動を駆使して問題を切り分け、最終的に解決にたどり着けました。
今後のタスクとしては、一時的解決策として、コマンドラインの一括実行スクリプトを作成したりすることで、開発環境を整理したいと思います。
もし同じような状況で悩んでいる方がいたら、この記事が少しでも助けになれば嬉しいです!
最新の開発環境はこのような不安定さを抱えている場合が少なからずあるかもしれません。
こういう記事が散見されるうちは、前バージョンで開発したり、開発スタート時の環境・規約に従うことを強く勧めます。
techブログから公式発表まで、広くアンテナ張っておきましょう。
以上、長文にお付き合いいただきありがとうございました。
さらに深く
いまだ解決できていない根本的な問題として以下が挙げられます。
- スナップショットの削除後、新しいエミュレーターを作った後のイメージファイルがことごとく破損してしまう
- OpenGLの互換性の解決方法
これらについては、後日改めて記事に出来ればと思います。