謎すぎるInstrumentationのActivityThread
ActivityInstrumentationTestCase2(長いな)を使ってActivityをテストしていたのだが、独自に拡張したApplicationクラスのonCreateメソッドが呼ばれていない(ブレークポイントに引っかからない)
ならばApplicationのインスタンスはどこで生成されているのだろうと追ってみたのだが、
- ActivityThread.java#makeApplication
public Application makeApplication(boolean forceDefaultAppClass, Instrumentation instrumentation) { if (mApplication != null) { return mApplication; } Application app = null; String appClass = mApplicationInfo.className; if (forceDefaultAppClass || (appClass == null)) { appClass = "android.app.Application"; } try { java.lang.ClassLoader cl = getClassLoader(); ContextImpl appContext = new ContextImpl(); appContext.init(this, null, mActivityThread); app = mActivityThread.mInstrumentation.newApplication(cl, appClass, appContext); appContext.setOuterContext(app); 〜以下略〜 return app; }
間違い無くこのメソッドだが、実際にデバッグしてみると初回起動時はnullのはずのmApplicationには既にApplicationクラスのインスタンスがセットされていたりするのだ。
//何故か最初にブレークした段階でmApplicationは非null
if (mApplication != null) {
return mApplication;
}
これはまだ推測だが、instrumentationを使う場合、デバッガがアタッチする前にフレームワーク側でアプリケーションを生成しちまうんだろうと思われるが、ということは同クラスではデバッグでブレークすることは不可能ということになる。
古のしかし確実なログ出力で実際には全てのメソッドが実行されていることは確認できたが、一日無駄にしたこともあり納得がいかない。