Android系統-開篇

anyi234 8年前發布 | 14K 次閱讀 Android Android開發 移動開發

基于Android 6.0源碼,深入剖析Android系統架構,爭取各個擊破,解決和分析問題,方能入庖丁解牛,游刃有余。

一、Android概述

Android系統非常龐大,底層是采用Linux作為基底,上層采用帶有虛擬機的Java層,通過通過JNI技術,將上下打通,融為一體。下圖是Google提供的一張經典的4層架構圖,從下往上,依次分為Linux內核,系統庫和Android Runtime,應用框架層,應用程序層這4層架構,每一層都包含大量的子模塊或子系統。

Android系統-開篇

為了能夠更深入地掌握Android整個架構思想,以及每塊之間是如何銜接與配合工作的,計劃以Android系統啟動過程為主線,來詳細展開對Android全方位的分析,爭取各個擊破。

二、系統啟動

Google提供的4層架構圖,是非常經典,但只是如壘磚般的方式,簡單地分層,而不足表達Android整個系統的啟動過程,環環相扣的連接關系,本文更多的是以進程的視角,以分層的架構來詮釋Android系統的全貌。

系統啟動架構圖

Android系統-開篇

圖解:Android系統啟動過程由上圖從下往上的一個過程:Loader -> Kernel -> Native -> Framework ->App,接來下簡要說說每個過程:

2.1 Loader層

  • Boot ROM: 當手機處于關機狀態時,長按Power鍵開機,引導芯片開始從固化在ROM里的預設出代碼開始執行,然后加載引導程序到RAM
  • Boot Loader:這是啟動Android系統之前的引導程序,主要是檢查RAM,初始化硬件參數等功能。

2.2 Kernel層

到這里才剛剛開始進入Android系統.

  • 啟動Kernel的0號進程:初始化進程管理、內存管理,加載Display,Camera Driver,Binder Driver等相關工作;
  • 啟動kthreadd進程(pid=2):是Linux系統的內核進程,會創建內核工作線程kworkder,軟中斷線程ksoftirqd,thermal等內核守護進程。kthreadd進程是所有內核進程的鼻祖

2.3 Native層

啟動init進程(pid=1),是Linux系統的用戶進程,init進程是所有用戶進程的鼻祖

  • init進程啟動Media Server(多媒體服務)、servicemanager(binder服務管家)、bootanim(開機動畫)等重要服務
  • init進程還會孵化出installd(用于App安裝)、ueventd、adbd、lmkd(用于內存管理)等用戶守護進程;
  • init進程孵化出Zygote進程,Zygote進程是Android系統的首個Java進程,Zygote是所有Java進程的父進程,Zygote進程本身是由init進程孵化而來的。

2.4 Framework層

  • Zygote進程,是由init進程通過解析init.rc文件后fork生成的,Zygote進程主要包含:
    • 加載ZygoteInit類,注冊Zygote Socket服務端套接字;
    • 加載虛擬機;
    • preloadClasses;
    • preloadResouces;
    </li>
  • Zygote進程fork出System Server進程,System Server是Zygote孵化的第一個進程,地位非常重要;
  • System Server進程:負責啟動和管理整個Java framework,包含ActivityManager,PowerManager等服務。
  • Media Server進程:負責啟動和管理整個C++ framework,包含AudioFlinger,Camera Service等服務。
  • </ul>

    2.5 App層

    • Zygote進程孵化出的第一個App進程是Launcher,這是用戶看到的桌面App;
    • Zygote進程還會創建Browser,Phone,Email等App進程,每個App至少運行在一個進程上。

    所有的App進程都是由Zygote進程fork生成的。

    三、計劃提綱

    2016年新的一年已經開始了,首先祝大家、也祝自己在新的一年諸事順心,事業蒸蒸日上。在過去的一年,對于Android從底層一路到上層有不少自己的理解和沉淀,但總體較零散,未成體系。借著今天(元旦假日的最后一天),給自己的新的一年提前做一個計劃,把知識進行歸檔整理與再學習,從而加深對Android架構的理解。通過前面對系統啟動的介紹,相信大家對Android已然“知全貌”,那么接下來需要“抓核心,理思路”。

    (1)在整個開機流程中,有幾個非常重要的進程,分別是initZygotesystem_server進程。接下來,計劃用三篇文章來分別闡述:

    • Android系統啟動—init篇
    • Android系統啟動—Zygote篇
    • Android系統啟動—SystemServer篇 </li> </ul>

      (2)再則就是在整個架構中有大量的服務,都是基于Binder來交互的,為了搞清楚binder,用了13篇文章來講解Binder,從binder驅動到應用層整個完整的流程。針對比較核心服務來重點分析,計劃分別用文章來對核心服務展開剖析:

      • Android服務篇-ActivityManagerService </li>
      • Android服務篇-PackageManagerService
      • Android服務篇-PowerManagerService
      • Android服務篇-BatteryService
        • Android耗電統計算法
        • </ul> </li>
        • Android服務篇-WindowManagerService
        • </ul>

          當然graphic也是一大塊難啃的模塊,也是需要整理的,先留個空位吧。

          (3)對于App來說,Android應用的四大組件Activity,Service,Broadcast Receiver, Content Provider最為核心,那么我們需要分別展開對其他的分解:

          • Android組件-Activity
          • Android組件-Service </li>
          • Android組件-Broadcast Receiver
          • Android組件-Content Provider
          • </ul>

            (4)有了這些,中間還缺少關于虛擬機ART的介紹,會需要對ART分析,后續還需要開展對ART虛擬機的一系列文章。另外,從架構中還有很多一塊沒有提及,那便是Linux Kernel,這部分內容,計劃從進程,內存,IO的視角展開分析。

            • Linux內核-進程篇 </li>
            • Linux內核-內存篇
            • Linux內核-IO篇
            • Linux內核-驅動篇
            • </ul>

              (5)最后,對整個架構回顧,從性能角度談談如何優化的問題,這是一個很大的話題涉及面之廣,會貫穿整個過程。

              先寫這么多,后續再不斷更新與完善。

              via:http://gityuan.com/2016/01/30/android-boot/

 本文由用戶 anyi234 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!