Androidシステムの起動プロセスを探求します-電源キーを押すと、Androidはいったい何をしましたか?

4783 ワード

前言
Androidシステムの起動プロセスの全体的な整理.
電源キーを押す
Step 1電源およびシステムの起動
システムはROMから起動し、ブートプログラムをRAMにロードし、実行する.
Step 2ブートプログラム
ブートプログラムはAndroidオペレーティングシステムが実行を開始する前の小さなプログラムであるため、Androidオペレーティングシステムの一部ではなく、特定のマザーボードとチップが必要です.ブートプログラムは、OEMメーカーまたはオペレータがロック、制限を行う場所です.
2つのフェーズ:1.外部RAMを検出する、第2段階のプログラム2をロードする.ネットワーク、メモリなどを設定し、カーネル実行環境を構築する(特殊な目的を達成するために、ブートプログラムは構成パラメータや入力データに基づいてカーネルを設定することができる
Androidブートはbootablebootloaderlegacyusbloaderで見つけることができます.従来のローダには2つのファイルが含まれています.1.init.s初期化スタック、BSSセグメントをクリア(bss segment:通常はプログラムに初期化されていないグローバル変数を格納するためのメモリ領域を指す;BSS-Block Started by Symbol.BSSセグメントは静的メモリ割り当てに属する)、mainが呼び出される.cの_main()関数2.main.cハードウェアを初期化し、linuxラベルを作成する
Step 3コア
Androidカーネルの起動方式はデスクトップlinuxと似ており、主なステップはキャッシュの設定、保護されたメモリの設定、計画リストのロードドライバです.
カーネルがシステム設定を完了すると、システムの最初のプロセスである*initプロセス*が起動します.
Step 4 initプロセス
Androidシステムの最初のプロセスとして、PIDは0であり、*initを解析する.rcスクリプトは、システムの初期動作形態を構築するために使用されます.この段階では、「Android」ロゴが表示されます(システムでは、ほとんどのシステムサービスプログラムがスクリプト*で記述され、相次いで起動されます).
init.rcは、Actions、Commands、Services、Options-Actionsの4種類の宣言で構成されています.イベントに応答するプロセスです.「trigger」に記述するトリガイベントが発生すると、様々な「command」ソースコード角度が順次実行される:システムはinitに対して実行される.rcでは各triggerがマッチングされ、条件に合致するActionが発見されると、Actionがキューに存在しない限り、「コマンド実行キュー」の末尾に追加され、システムはこれらのコマンドを順番に実行します.
on ##
##
##
...
-Commands:コマンドは、属するイベントが発生したときに1つずつ実行されます-Services:実行可能プログラム、これらは、特定のオプションの制約の下でinitプログラムによって実行または再起動されます(サービスは、構成で再起動を終了する必要があるかどうかを指定できます.サービスに異常crashが発生した場合、復元する機会があります).
service []*
-Options:サービスに対する制約オプション
Step 5、6 ServiceManager、Zygote、SystemServer
**科学普及:**Daemons-デーモンプロセス
Initプロセスはinitを解析する.rcは、サービスマネージャ、Zygote、SystemServerの3つの重要なシステム・サービス・プロセスを次々と開始します.次に、次のように説明します.
ServiceManager–Binderメカニズムのサポート
概要:*ServiceManagerは*Binderメカニズムのサポート者であり、ある*Binderサービス登録情報の最下位層*Binder駆動割当の値解析を担当します.
ServiceManagerは、initプロセスによってrcスクリプトを解析するときに起動します.**coreクラスに属します.その他のプロセスにはuenetd、console、adbdなどがあります.coreグループのプロパティに基づいて、これらのプロセスは同時に起動または停止します.また、ServiceManager構成には*criticalプロパティが含まれています.これは、システムの重要なプロセスであることを意味します(プロセスが4分以内に異常に終了した場合、デバイスは再起動してリストアモードに入ります).ServiceManagerが再起動するたびに、他の重要なプロセス:zygote、media、surfaceflingerなどもrestartされます.
Zygote–新しいスレッドとプロセスを「生み出す」
AndroidのほとんどのアプリケーションプロセスとシステムプロセスはZygoteによって生成されます.Zygoteは同様にinitがrcスクリプトを解析するときに起動し、*mainクラスに属し、同じmainクラスに属するシステムプロセスはnetd、debuggerd、rildなどである.Zygoteは独立したプログラムにあるわけではありません.そのプログラム名は「app_process」で、app_を観察します.プロセス主関数実装はinit.rcで-zygoteオプションが指定されています.app_プロセスは次に「ZygoteInit」を起動し、「start-system-server」*に転送されます.これにより、ZygoteInitは仮想マシン上で実行されます.
ZygoteInit関数には2つの重要な作業があります.1.各種システムクラス2をプリロードする.SystemServer環境を構築し、SystemServerを起動します(ほとんどのAndroidシステムサービスはJavaで作成されています)
ZygoteInitプロセスのまとめ(Gityuan-Androidシステム起動-Zygote編より抜粋)1.解析init.zygote.rcのパラメータは、AppRuntimeを作成し、AppRuntimeを呼び出す.start()メソッド;1.AndroidRuntimeのstartVM()メソッドを呼び出して仮想マシンを作成し、startReg()を呼び出してJNI関数を登録する.1.JNI方式でZygoteInitを呼び出す.main()は、初めてJavaの世界に入りました.1.registerZygoteSocket()は、クライアント要求に応答するための通信のサービスとしてzygoteを使用するsocketチャネルを確立する.1.preload()汎用クラス、drawableおよびcolorリソース、openGLおよび共有ライブラリ、およびWebViewをプリロードし、ap起動効率を向上させる.1.zygoteは大部分の仕事を终えて、それからstartSystemServer()を通じて、forkは力を入れてsystem_を手伝いますサーバプロセスは、上位フレームワークの実行ベクターでもあります.1.zygoteの機能は身を退き、runSelectLoop()を呼び出し、いつでも待機し、要求を受信して新しいプロセス要求を作成するとすぐに起動し、対応する作業を実行します.
ZygoteInitが終わると、電源を入れる動画が出てきます(注意:先に述べたのは電源を入れる動画ではなく、電源を入れる前に「Android」ロゴが出てきた画面です)
SystemServer–ほとんどのAndroidシステムサービスの所在地
SystemServerはAndroidがLauncherに入る前の最後の準備であり、「Java」言語で書かれた多くのシステムサービスを提供しています.
もしそうならrcでzygoteの起動パラメータ-start-system-serverを指定すると、ZygotyeInitはstartSystemServerを呼び出してSystemServerに入ります.
startSystemServer関数解析:1.まずZygoteInitはZygoteを通過します.forkSystemServerは、さまざまなシステムサービスをサポートするための新しいスレッド(fork)を生成します.(ソース角度:Zygote内部はNative関数Dalvik_dalvik_system_Zygote_forkSystemServerによってさらに実現され、最終的には下位インタフェースの*forkインタフェース*を呼び出して実際にプロセスを生成する).forkプロパティに基づいて、サブプロセスと親プロセスは同じコード環境を取得します.pidは0がサブプロセスであり、そうでなければ親プロセスである.前者の場合、*handleSystemServerProcess(parseArgs)関数をさらに呼び出して、最も核心的な作業を完了する-「各システムサービスの起動」(ソース角度:handleSystemServerProcessメソッドはstartSystemServer中のparsedArgs.remainingArgsパラメータをRuntimeInit.zygoteInitに伝え、後者は*nativeZygoteInit関数を呼び出す)2.nativeZygoteInit呼び出し後、3つの重要なstatic関数が実行されます.init 1-ローカルサービス(Surface Flinger、AudioFlingerなど)起動を完了し、完了後にinit 2、init 2-新しいLooper付きスレッドサーバThreadを呼び出してJava層の各サービスを起動します.
次の起動
Androidシステムの起動について簡単に説明しましたが、全体的な流れを示すことを意図しています.その中で、各段階に関連する知識点は浅薄にかすめられています.筆者もまだ学習と探求の中で、後で詳しく分析したいと思っています.
リソースの推奨
  • Gityuan-Android開編
  • 老羅のAndroidの旅
  • 『Androidカーネル設計思想を深く理解する』は浅から深く、ソースレベルで探求を行い、知識は深い
  • である.