M2 MacでのAndroid Emulatorのクラッシュが引き起こす問題にハマった
昨晩ずっとM2 Macで自分のAndroidアプリのバグ調査していて、問題の原因が全然わからずにムキーーー!!ってなっていたのだけど、今ようやく原因がわかった気がする。
M2 MacではAndroid Emulator (arm64)が頻繁にクラッシュするんだけど(うちではデバッグセッション5回に1回くらいの頻度で落ちてる)、どうやらクラッシュしたqemuがストレージに書き出す頻度がかなり低いらしい。それまでadb installしたはずのアプリが全然残っていないことがあって、「もしかして…」となった。
Androidアプリ開発ではずっとLinux上でqemuを使っていたのだけど、これは滅多にクラッシュしない。Mac上では1日に10回は落ちてると思うけど、Linux/x86やLinux/x86_64では1日に1回もクラッシュしない。
ということは、今デバッグ中ではないアプリをインストールしたやつも、クラッシュしたらストレージに書き出される前に消えている、あるいはデバッグデプロイメント以前の状態にロールバックされている可能性がある、ということだ。
うちのは複数のアプリがBinderでIPCするやつなので、プロトコルのミスマッチがあるとまともに繋がらなくなるし、この問題でまともなデバッグがまともに出来ていなかった。バグの条件を切り分けるためにいくつかのバージョンの組み合わせを試していたのに、このロールバック挙動によって今インストールされているバージョンがどれだかわからないというのは最悪のシチュエーションだったと思う。
qemuがクラッシュしたらチェック対象のアプリを必ず入れ直す/入れ直したアプリだけチェックする、という段階を踏むようにしたら、それまで問題の再現性が無くて困っていたのがほぼ間違いなく再現するようになって、ようやく安定的に作業できるようになった。