スタッフのブログです。個以上あるコメントは受け付けない設定になってます。)2010年12月09日AndroidのinitAndroidで一番最初に起動するユーザープロセスであるinitについて調べたのでそのメモ。2.2のソースコードに関するもの。)/initinitはルートディレクトリの直下に置かれている。/sbin/initLinuxカーネルはデフォルトの設定では最初のプロセスを/sbin/init/etc/init/bin/init/bin/shの順に探しにいく。追加して明示的にinitのパスを指定しなければならない。いうメッセージを見ることになる。Androidのinitは他のLinuxのものとは全く異なる。init.rcの書式も独自。Androidのinitはスタティックリンクされている。そのためinitが動作するのにダイナミックリンカの助けはいらない。(ちなみにLinixの/sbin/initはダイナミックリンクされているので、何かのトラブルでダイナミックリンクの機構が動かなくなるとシステム全体が起動できなくなる。*BSDではinitはスタティックリンクだそうだ。system/core/initのディレクトリにある。initは大きく2つの部分に分かれる。ブート処理部とデーモン処理部。(2011.12.13追記:Android2.3以降はブート処理部分は実行する関数をキューに積んで実行するようになり、複雑化した。}}ブート処理は起動時に一度だけ実行される。デーモン処理はシステムが動作している限り繰り返し実行される。スクリプトを読み込んで実行する。このあたりは横浜Androidプラットフォーム部の第3回、第4回の勉強会に詳しい資料がある。keychord_fdの4つのファイルディスクリプタをpollシステムコールで監視している。device_fdカーネルからのデバイスの状態の変化の通知を受けて、/dev以下のデバイスファイルの生成と削除を行う。通常のLinuxではudevdが行っていること。devperms[]か、init.rcでのdeviceコマンドで指定できる。(2011.12.13追記。Android2.3以降では、この処理はueventdに移された。)property_set_fdシステムプロパティの書き込み処理を行う。システムプロパティはinitが原本を管理していて、この原本だけが書き込み可能になっている。onlyで共有している。そのためシステムプロパティの読み取りは共有メモリをアクセスし、書き込みはソケットによるプロセス間通信でinitに処理を依頼することになる。(Androidのシステムプロパティに関しての詳細はまた別の機会で。)(2011.12.13追記。システムプロパティに関しては以下のページのスライドの後半を参照。Androidsignal_recv_fd子プロセスが終了したときにsignalが発生するように設定されている。子プロセスが終了したときにwaitシステムコールで、その後始末をするのは伝統的なUnixでのinitの役割。終了したプロセスがserviceとして登録されているものである場合には、登録されている情報に従って再起動等を行う。exited."とコンソールに出す。CRITICALの属性のserviceが一定期間内に一定回数以上クラッシュした場合にはシステム全体をリブートするようになっている。keychord_fdあらかじめ登録した複数のキーの入力の組み合わせを監視し、それに対応するserviceを起動する。デフォルトのinit.rcではこの機能を使うserviceは無い。デバッグ時にメニューキーと戻るキーを同時に押したら何かの情報をSDカードに書き出すといったことに使えそう。(2011.12.13追記。Sではこの機能を使っているようだ。)お知らせ2010年12月10日のCELFテクニカルジャンボリーでこの話をします。KZM-A9-DualボードにPARTNER-Jetをつないで気になるところをデバッガで追いかけるところも紹介する予定です。propertyの保存が効かない。最新コメント「最新トラックバック」は提供を終了しました。(2)タグクラウドABCadbaidlAndroidARMarmv7asmbinderbionicBootbuildbuildrootbuiltinbusyboxcccacheCELFcelfjpClangcortex-a8Cortex-A9cpuinfodalvikvmDebiandebuggerdDMAelcembeddedemulatorEventexeGCCFlashfpufroyogccGDBGingerbreadgoldfishIceCreamSandwichinitinitrdinterpreterJAVAjavacjavapjitK&Rkernelkeykzm-a9-dualKZM-A9-GTkzm-ca9-01LinarolinuxLLVMloglogcatltsimingwMIPSmultiarchndkneonnetinstallnfsnon-stopobjdumppartnerPARTNER-JetportingpowermanagementprintfpropertyPyMitepythonqemuQTQTextCodecrootstockrubysdServiceSHsimdsmpTCGtuninguartubootUbuntuuclibcUNIXUSBv8vlinkwakelockwirelessx86zygote計測QRコード京都マイクロコンピュータ。