Android システム起動の謎を解明する

Android でのアプリの起動プロセスについて尋ねられると、私たちは必ず zygote について言及します。しかし、受精卵はどこから来たのでしょうか?この質問から Android システムの起動プロセスを考えましたが、zygote はシステムの初期化中に作成されるプロセスに違いありません。この疑問を念頭に置いて、Android システムの起動プロセスに関するいくつかの情報とコードを検索しました。以下は、起動プロセスの簡略図です。次に、各ステップが何を行うかを分析します。

1. 電話機の電源ボタンを押します。

Android スマートフォンの電源ボタンを押すと、「ブートROM (読み取り専用メモリ)コード」(ブートローダー ブート コード) がハードコードされた場所から読み取られ、実行が開始されます。このプログラム実行の主な目的は、ブートローダー (起動時の読み込み)コードをメモリにロードして実行することです。

2.ブートローダー(ロード開始)

ブートローダーは Android システムが初期化される前に実行され、Android オペレーティング システムの一部ではありません。通常、メーカーはブートローダーで暗号化およびセキュリティ関連の機能を実行します。

ブートローダー プログラムは 2 つのフェーズで実行されます。第 1 段階で外部 RAM を検出し、第 2 段階で補助プログラムをロードします。第2段階では、ブートローダがネットワークやメモリなどの設定、カーネルの動作パラメータなどを設定し、カーネルの動作準備を行います。

コードのこの部分は aosp にあります (Android バージョン 2.xx、後で変更があります)。

aosp/bootable/bootloader/legacy/usbloader (ソースコードを確認するには壁を越える必要があります)

これには 2 つの重要なファイルが含まれています。

  1. Init.s は、スタックの初期化、BSS (シンボル セグメントによるブロック開始)のクリア、そして最後に main.c の _main() メソッドの呼び出しを担当します。
  2. main.c は、ハードウェア (クロック、マザーボード、キーボード、コンソール) の初期化と Linux ラベルの作成を担当します。

3. カーネル (カーネル) Android カーネルの起動は、キャッシュの設定、メモリの保護、スケジュール設定、ドライバーのロードなど、Linux と似ています。カーネルはシステムのセットアップを完了すると、システム フォルダー内で初期化する必要があるサービスを探します。

Android と Linux のスタートアップの違いは何ですか?

  • Binder: Android 固有のプロセス間通信メカニズムとリモート メソッド呼び出しシステムです。
  • ashmem (Android Shared Memory): POSIX SHM に似た新しい共有メモリ アロケータですが、動作が異なり、よりシンプルなファイルベースの API をサポートしています。
  • pmem (プロセス メモリ アロケータ): ユーザー空間とカーネル ドライバの間で共有されるメモリの大きな (1 ~ 16+MB) 物理的に連続した領域を管理するために使用されます。
  • logger: これは、logcat コマンドのカーネル サポートです。
  • wakelocks: 電源管理ファイル用。ウェイクロックが解放されるまで、イベントごとにマシンを起動したままにします。
  • oom 処理: 利用可能なメモリが少なくなりすぎるとプロセスを強制終了します。
  • アラーム マネージャー: カーネルにユーザー モードからウェイクアップするように通知します。
  • RAM_CONSOLE: カーネルの printk メッセージを RAM 内のバッファに保存して、カーネル パニック後の次のカーネル呼び出しで表示できるようにします。
  • ADB用USBガジェットドライバー
  • yaffs2 フラッシュ ファイル システム (作者はそれが何であるか知りません)

4.初期化プロセス

Init はシステムの最初のプロセスであり、すべてのプロセスの親プロセスです。これには 2 つの主なタスクがあります。

  1. /sys 、 /dev 、 /proc などのマウント ディレクトリ。
  2. init.rc スクリプトを実行する

init.rc の言語固有のルールは、 community.nxp.com/t5/i -MX-Pro… にあります。

このプロセス中に、Android のスプラッシュ画面が表示されます。

5. Zygote と Dalvik (ついにここまでたどり着きました)

Java では、各プログラムはメモリ分離された個別の仮想マシン インスタンスで実行され、各仮想マシン インスタンスはメモリの一部を消費します。Android は通常、メモリが限られたハンドヘルド デバイスであることがわかっています。同じ戦略が採用されると、仮想マシンはインスタンスは大量のメモリを消費します。

記憶力の問題を克服するため、アンドロイドにザイゴットが登場した。zygote は、Dalvik 仮想マシン間でのコード共有を実現し、メモリ使用量と起動時間の削減を実現します。zygote は、システムの起動時に開始される仮想マシン プロセスです。zygote は、コア ライブラリ クラスをプリロードして初期化します。

ザイゴートのロードプロセスは次のとおりです。

  1. zygote 初期化クラスaosp/frameworks/base/core/java/com/android/internal/os/ZygoteInit.java をロードします。
  2. registerZygoteSocket()、zygote コマンド チャネルのソケット サービスを登録します。
  3. preloadClasses()、zygote プロセスの初期化、共通クラスのロードと初期化。
  4. preloadResources()、プロセス間で共有できるリソースを読み込みます。

このプロセス中に、ブート アニメーションが表示されます。

6. システムサービス

上記の作業が完了すると、zygote は新しいプロセスをフォークしてシステム サービスを開始します。

主なサービスは次のとおりです。

  • パワーマネージャーの起動
  • アクティビティマネージャーの作成
  • テレフォニー レジストリの開始
  • パッケージマネージャーの起動
  • アクティビティマネージャーサービスをシステムプロセスとして設定する
  • コンテキストマネージャーの起動
  • システムの開始プロバイダーへの問い合わせ
  • バッテリーサービスの開始
  • アラームマネージャーの起動
  • センサーサービスの開始
  • ウィンドウマネージャーの起動
  • Bluetoothサービスを開始する
  • マウントサービスの開始

その他のサービスは以下の通りです。

  • ステータスバーサービスの開始
  • ハードウェアサービスの開始
  • NetStat サービスの開始
  • 接続サービスの開始
  • 通知マネージャーの起動
  • DeviceStorageMonitor サービスの開始
  • ロケーションマネージャーの起動
  • 検索サービスの開始
  • クリップボードサービスの開始
  • チェックインサービス開始
  • 壁紙サービス開始
  • オーディオサービスの開始
  • HeadsetObserver の開始
  • AdbSettingsObserver の起動

これで、ようやくブート プロセスが完了しました (システム サービスがメモリ内で起動して実行されます)。

まだフレームワークをマスターしておらず、短期間でフレームワークを完全に理解したい場合は、「Android Framework Core Knowledge Points」を参照してください。これには、Init、Zygote、SystemServer、Binder、Handler、AMS が含まれています。 、PMS、ランチャー... ...およびその他のナレッジ ポイントのレコード。

「フレームワークコアナレッジポイント概要マニュアル」https://qr18.cn/AQpN4J

ハンドラー メカニズムの実装原理の一部:
1. マクロ理論分析とメッセージ ソース コード分析
2. MessageQueue ソース コード分析
3. ルーパー ソース コード分析
4. ハンドラー ソース コード分析
5. まとめ

Binder の原則:
1. Binder を学習する前に理解しておく必要がある知識ポイント
2. ServiceManager のバインダーの仕組み
3. システム サービスの登録プロセス
4. ServiceManager の起動プロセス
5. システム サービスの取得プロセス
6. Java Binder の初期化
7. Java システムの登録プロセスバインダーのサービス

受精卵:

  1. Androidシステムの起動処理とZygoteの起動処理
  2. アプリケーションプロセスの起動プロセス

AMS ソースコード分析:

  1. アクティビティのライフサイクル管理
  2. onActivityResult実行処理
  3. AMSのアクティビティスタック管理の詳細説明

詳細な PMS ソース コード:

1. PMSの起動プロセスと実行プロセス
2. APKのインストールとアンインストールのソースコード解析
3. PMSのインテントフィルタマッチング構造

WMS:
1. WMS の誕生
2. WMS の主要メンバーと Window の追加プロセス
3. Window の削除プロセス

『Androidフレームワーク学習マニュアル』:https://qr18.cn/AQpN4J

  1. ブート初期化プロセス
  2. 起動時に Zygote プロセスを開始する
  3. 起動時に SystemServer プロセスを開始する
  4. バインダードライバー
  5. AMSの起動プロセス
  6. PMSの起動プロセス
  7. ランチャーの起動プロセス
  8. Android の 4 つの主要コンポーネント
  9. Androidシステムサービス - 入力イベントの配信処理
  10. Android の基盤となるレンダリング画面更新メカニズムのソース コード分析
  11. Android のソースコード解析の実践

おすすめ

転載: blog.csdn.net/weixin_61845324/article/details/132460904