android起動までのプロセス

10月19日に行われた「Android起動周りのノウハウ」という勉強会に参加してきました。主な内容は、Android端末の電源をいれ、HOME画面が表示されるまでのプロセスの流れとかそのへんの話でした。しかし、ほとんど内容を理解することができなかったので、自分なりに調べたのでまとめます。

Androidが起動するまでの概略

まず、電源をONにしてからAndroidのホーム画面が表示されるまでの内部動きを下の図におおまかにあらわした。その下の図はAndroidのレイヤー構成です。今回はAndroidの起動プロセスを重視するのでBootloader、kernelについてはあまり深く説明しません。

 

f:id:pgpg-sou:20131021122614p:plain

 

 

f:id:pgpg-sou:20131021123925j:plain

Bootloader

Bootloaderとはカーネルから独立した特別なプログラムで、初期メモリの設定とカーネルをRAMにロードするために使用されます。簡単な流れを以下に示します。

 

  1. メインブートローダーを外部RAMに配置する。
  2. ファイルシステム、追加メモリなどの設定をします。
  3. ブートローダーからkernelを探し、実行します。

kernel

 kernelでは割り込みコントローラを初期化し、メモリ保護、キャッシュ及びスケジューリングを設定します。また、図2の一番下にあるようなドライバを読み込みます。

最後にKernelはinitプロセスをルートファイルシステムから調べて初期ユーザ空間プロセスとして起動します。

android

いよいよAndroidの起動プロセスを追っていくのですが、項目が多いので下のような順序で追っていきます。androidソースコードここにあります。

  • initプロセスとは
  • Zygoteの実行
  • BootComplete

initプロセスとは

initとはLinux Kernelが最初に実行するプロセスである。initには大きくdeamon処理とboot処理の二つがある。

deamon処理

/dev以下のデバイスファイルの生成と削除,システムプロパティの書き込み処理などの処理をおこなう。

boot処理

/dev, /proc, /sys をマウントした後に/init.rc のスクリプトを読み込んで実行する。init.rcには4つの特徴がある。

アクション

アクションはコマンドのシーケンスで名づけられます。アクションはトリガを持っています。アクションは以下のような書式で定義されます。アクションが定義されるとaction_listというキューに格納されます。

on <triger>

<command>

コマンド

androidで使えるコマンドが定義されています。下は一部抜粋したものです。

サービス

サービスはInitが起動そして、(オプション)サービスが終了したときに再起動するプログラムです。下は、serviceの定義と一例です。サービスが定義されるとservice_listというキューに格納されます。

service <name> <pathname> [ <argument> ]*

<option>

オプション

オプションは、サービスへの修飾子です。オプションはInitがサービスをいつ、どのように実行するかに影響を与えます。ここでは省かしていただきます。

 

zygote

initプロセスの最後にaction_listとservice_listを順々に実行してきます。そうすろとzygoteというサービスを実行されます。

zygoteとは Android プログラムの実行に必要なダイナミックリンクライブラリと Java のクラスライブラリをロードした状態で待機する常駐プロセスである 。

 

Androidではアプリケーションや多くのその他のプログラムはJavaで記述されています。これらのプログラムはDalvikVMという仮想マシン上で動きます。

このzygoteが実行されるとそのプロセス上でsystem_serverというプロセスを実行します。このプロセスではActiveManegerなどのフレームワークを読み込みます。

 

その中のActivityManagerが起動時に読み込むアプリをロードし、それを実行すると無事HOME画面が表示されます(下の図参照)。

f:id:pgpg-sou:20131021142429j:plain

まとめ

後半は駆け足になってしまいましたが、電源ボタンをおしてから、HOME画面が表示されるまでの流れをおってきました。
自分で調べて内部のことがとてもわかり、勉強になりました。それでもまだまだ、詳しいことはわからなくて、ソースを追うことも書くことも難しいと思いますが、こういう世界なんだなっていうのはわかった気がします。
zygoteとかDalvikVMとかに関してはここだけでも記事がかけてしまいそうなくらい情報量が多い話なのでここらへんをいじらなければならないときがきたら、また書こうとおもいます。