PEEE802.11

モバイルソフトウェアエンジニアの備忘録

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の場合)。

  1. on early-init
  2. on init
  3. on early-fs
  4. on fs
  5. on post-fs
  6. on post-fs-data
  7. on early-boot
  8. on boot


このon hogeは以前のAndroidリリースから現在のKitkatに至るまでにけっこう追加されている。gingerbreadではpost-fs-dataが無いし、eclairまで遡ればon early-fs、on fs、on post-fsが無い。今後変わるかもしれないが、init.rcに見慣れないon fugaが出てきてもソースをチェックすればわかるだろう。