Android系統-開篇
基于Android 6.0源碼,深入剖析Android系統架構,爭取各個擊破,解決和分析問題,方能入庖丁解牛,游刃有余。
一、Android概述
Android系統非常龐大,底層是采用Linux作為基底,上層采用帶有虛擬機的Java層,通過通過JNI技術,將上下打通,融為一體。下圖是Google提供的一張經典的4層架構圖,從下往上,依次分為Linux內核,系統庫和Android Runtime,應用框架層,應用程序層這4層架構,每一層都包含大量的子模塊或子系統。
為了能夠更深入地掌握Android整個架構思想,以及每塊之間是如何銜接與配合工作的,計劃以Android系統啟動過程為主線,來詳細展開對Android全方位的分析,爭取各個擊破。
二、系統啟動
Google提供的4層架構圖,是非常經典,但只是如壘磚般的方式,簡單地分層,而不足表達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;
- Zygote進程fork出System Server進程,
System Server是Zygote孵化的第一個進程
,地位非常重要; - System Server進程:負責啟動和管理整個Java framework,包含ActivityManager,PowerManager等服務。
- Media Server進程:負責啟動和管理整個C++ framework,包含AudioFlinger,Camera Service等服務。 </ul>
- Zygote進程孵化出的第一個App進程是Launcher,這是用戶看到的桌面App;
- Zygote進程還會創建Browser,Phone,Email等App進程,每個App至少運行在一個進程上。
- 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>
- Android組件-Activity
- Android組件-Service </li>
- Android組件-Broadcast Receiver
- Android組件-Content Provider </ul>
- Linux內核-進程篇 </li>
- Linux內核-內存篇
- Linux內核-IO篇
- Linux內核-驅動篇 </ul>
當然graphic也是一大塊難啃的模塊,也是需要整理的,先留個空位吧。
(3)對于App來說,Android應用的四大組件Activity,Service,Broadcast Receiver, Content Provider最為核心,那么我們需要分別展開對其他的分解:
(4)有了這些,中間還缺少關于虛擬機ART的介紹,會需要對ART分析,后續還需要開展對ART虛擬機的一系列文章。另外,從架構中還有很多一塊沒有提及,那便是Linux Kernel,這部分內容,計劃從進程,內存,IO的視角展開分析。
(5)最后,對整個架構回顧,從性能角度談談如何優化的問題,這是一個很大的話題涉及面之廣,會貫穿整個過程。
先寫這么多,后續再不斷更新與完善。
2.5 App層
所有的App進程都是由Zygote進程fork生成的。
三、計劃提綱
2016年新的一年已經開始了,首先祝大家、也祝自己在新的一年諸事順心,事業蒸蒸日上。在過去的一年,對于Android從底層一路到上層有不少自己的理解和沉淀,但總體較零散,未成體系。借著今天(元旦假日的最后一天),給自己的新的一年提前做一個計劃,把知識進行歸檔整理與再學習,從而加深對Android架構的理解。通過前面對系統啟動的介紹,相信大家對Android已然“知全貌”,那么接下來需要“抓核心,理思路”。
(1)在整個開機流程中,有幾個非常重要的進程,分別是init
、Zygote
、system_server
進程。接下來,計劃用三篇文章來分別闡述: