init.rcの実行順番
Androidが起動する際、kernel起動後にinit.rcに記述した通りにファイルシステムのパーミッション設定やら各種サービス起動やらが実行される。
rootdir/init.rc - platform/system/core - Git at Google
ここで、on early-initだとかon initだとかいくつか起動の段階がある。init.rcは別のinit*rcファイルをimportできるようになっていて、init.usb.rcだとかinit.trace.rcだとかいくつもファイルが分かれており、on init等はそれらのファイルに分散している。
init.rcを解釈して実行していくのは、system/core/initである。on initだとかon bootだとかon fsがどういった順番で起動されるか、どこかに公式ドキュメントがないかと探してみたのだがどうも簡単に見つからなかった。なので直接ソースを見てみた。
init/init.c - platform/system/core - Git at Google
このmain()に、
action_for_each_trigger("early-init", action_add_queue_tail);
というコードがある。これがon early-initを実行する関数のはず。この関数に着目すると以下の順番で実行されるようだ(is_charger == falseの場合)。
- on early-init
- on init
- on early-fs
- on fs
- on post-fs
- on post-fs-data
- on early-boot
- on boot
このon hogeは以前のAndroidリリースから現在のKitkatに至るまでにけっこう追加されている。gingerbreadではpost-fs-dataが無いし、eclairまで遡ればon early-fs、on fs、on post-fsが無い。今後変わるかもしれないが、init.rcに見慣れないon fugaが出てきてもソースをチェックすればわかるだろう。