久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Android 操作系統(tǒng)架構——概述

 hewii 2022-11-01 發(fā)布于上海

一,、引言

眾所周知,,Android是谷歌開發(fā)的一款基于Linux的開源操作系統(tǒng),從誕生至今已有10余年,,這一路走來Android遇到哪些問題,?大版本升級朝著什么方向演進?Android的未來如何,?我的公號《Android 技術架構演進與未來》 講解了Android一路走來,,在用戶體驗、性能,、功耗,、安全、隱私等方面取得的很大進步,,以及未來可能的方向,。

本文作為Android系統(tǒng)架構的開篇,起到提綱挈領的作用,,從系統(tǒng)整體架構角度概要講解Android系統(tǒng)的核心技術點,,帶領大家初探Android系統(tǒng)全貌以及內(nèi)部運作機制。雖然Android系統(tǒng)非常龐大且錯綜復雜,,需要具備全面的技術棧,,但整體架構設計清晰。Android底層內(nèi)核空間以Linux Kernel作為基石,,上層用戶空間由Native系統(tǒng)庫,、虛擬機運行環(huán)境、框架層組成,,通過系統(tǒng)調(diào)用(Syscall)連通系統(tǒng)的內(nèi)核空間與用戶空間,。對于用戶空間主要采用C++和Java代碼編寫,通過JNI技術打通用戶空間的Java層和Native層(C++/C),,從而連通整個系統(tǒng),。

為了能讓大家整體上大致了解Android系統(tǒng)涉及的知識層面,先來看一張Google官方提供的經(jīng)典分層架構圖,,從下往上依次分為Linux內(nèi)核,、HAL、系統(tǒng)Native庫和Android運行時環(huán)境,、Java框架層以及應用層這5層架構,,其中每一層都包含大量的子模塊或子系統(tǒng)。

android-stack

上圖采用靜態(tài)分層方式的架構劃分,,眾所周知,,程序代碼是死的,系統(tǒng)運轉是活的,,各模塊代碼運行在不同的進程(線程)中,,相互之間進行著各種錯終復雜的信息傳遞與交互流,,從這個角度來說此圖并沒能體現(xiàn)Android整個系統(tǒng)的內(nèi)部架構、運行機理,,以及各個模塊之間是如何銜接與配合工作的,。

為了更深入地掌握Android整個架構思想以及各個模塊在Android系統(tǒng)所處的地位與價值,計劃以Android系統(tǒng)啟動過程為主線,,以進程的視角來詮釋Android M系統(tǒng)全貌,,全方位的深度剖析各個模塊功能,爭取各個擊破,。這樣才能猶如庖丁解牛,,解決、分析問題則能游刃有余,。

二,、Android架構

Google提供的5層架構圖很經(jīng)典,但為了更進一步透視Android系統(tǒng)架構,,本文更多的是以進程的視角,,以分層的架構來詮釋Android系統(tǒng)的全貌,闡述Android內(nèi)部的環(huán)環(huán)相扣的內(nèi)在聯(lián)系,。

系統(tǒng)啟動架構圖

process_status

圖解:Android系統(tǒng)啟動過程由上圖從下往上的一個過程是由Boot Loader引導開機,,然后依次進入 ->Kernel->Native->Framework->App,接來下簡要說說每個過程:

關于Loader層:

  • Boot ROM: 當手機處于關機狀態(tài)時,,長按Power鍵開機,,引導芯片開始從固化在ROM里的預設代碼開始執(zhí)行,然后加載引導程序到RAM,;

  • Boot Loader:這是啟動Android系統(tǒng)之前的引導程序,,主要是檢查RAM,初始化硬件參數(shù)等功能,。

2.1 Linux內(nèi)核層

Android平臺的基礎是Linux內(nèi)核,,比如ART虛擬機最終調(diào)用底層Linux內(nèi)核來執(zhí)行功能。Linux內(nèi)核的安全機制為Android提供相應的保障,,也允許設備制造商為內(nèi)核開發(fā)硬件驅(qū)動程序,。

  • 啟動Kernel的swapper進程(pid=0):該進程又稱為idle進程, 系統(tǒng)初始化過程Kernel由無到有開創(chuàng)的第一個進程, 用于初始化進程管理、內(nèi)存管理,,加載Display,Camera Driver,Binder Driver等相關工作,;

  • 啟動kthreadd進程(pid=2):是Linux系統(tǒng)的內(nèi)核進程,,會創(chuàng)建內(nèi)核工作線程kworkder,軟中斷線程ksoftirqd,,thermal等內(nèi)核守護進程,。

    kthreadd進程是所有內(nèi)核進程的鼻祖,。

2.2 硬件抽象層 (HAL)

硬件抽象層 (HAL) 提供標準接口,HAL包含多個庫模塊,,其中每個模塊都為特定類型的硬件組件實現(xiàn)一組接口,,比如WIFI/藍牙模塊,當框架API請求訪問設備硬件時,,Android系統(tǒng)將為該硬件加載相應的庫模塊,。

2.3 Android Runtime & 系統(tǒng)庫

每個應用都在其自己的進程中運行,都有自己的虛擬機實例,。ART通過執(zhí)行DEX文件可在設備運行多個虛擬機,,DEX文件是一種專為Android設計的字節(jié)碼格式文件,經(jīng)過優(yōu)化,,使用內(nèi)存很少,。ART主要功能包括:預先(AOT)和即時(JIT)編譯,優(yōu)化的垃圾回收(GC),,以及調(diào)試相關的支持,。

這里的Native系統(tǒng)庫主要包括init孵化來的用戶空間的守護進程、HAL層以及開機動畫等,。啟動init進程(pid=1),是Linux系統(tǒng)的用戶進程,,init進程是所有用戶進程的鼻祖。
  • —— init進程會孵化出ueventd,、logd,、healthd、installd,、adbd,、lmkd等用戶守護進程;

  • —— init進程還啟動servicemanager(binder服務管家),、bootanim(開機動畫)等重要服務,。

  • —— init進程孵化出Zygote進程,Zygote進程是Android系統(tǒng)的第一個Java進程(即虛擬機進程),,Zygote是所有Java進程的父進程,,Zygote進程本身是由init進程孵化而來的。

2.4 Framework層

  • Zygote進程,,是由init進程通過解析init.rc文件后fork生成的,,Zygote進程主要包含:

  •     —— 加載ZygoteInit類,注冊Zygote Socket服務端套接字

        —— 加載虛擬機

        —— 提前加載類preloadClasses

        —— 提前加載資源preloadResouces

  • System Server進程,,是由Zygote進程fork而來,,System Server是Zygote孵化的第一個進程,System Server負責啟動和管理整個Java framework,,包含ActivityManager,,WindowManager,,PackageManager,PowerManager等服務,。

  • Media Server進程,,是由init進程fork而來,負責啟動和管理整個C++ framework,,包含——AudioFlinger,,Camera Service等服務。

2.5 App層

  • Zygote進程孵化出的第一個App進程是Launcher,,這是用戶看到的桌面App,;

  • Zygote進程還會創(chuàng)建Browser,Phone,,Email等App進程,,每個App至少運行在一個進程上。

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

2.6 Syscall && JNI

三,、通信方式

無論是Android系統(tǒng),還是各種Linux衍生系統(tǒng),,各個組件,、模塊往往運行在各種不同的進程和線程內(nèi),這里就必然涉及進程/線程之間的通信,。對于IPC(Inter-Process Communication, 進程間通信),,Linux現(xiàn)有管道、消息隊列,、共享內(nèi)存,、套接字、信號量,、信號這些IPC機制,,Android額外還有Binder IPC機制,Android OS中的Zygote進程的IPC采用的是Socket機制,,在上層system server,、media server以及上層App之間更多的是采用Binder IPC方式來完成跨進程間的通信。對于Android上層架構中,,很多時候是在同一個進程的線程之間需要相互通信,,例如同一個進程的主線程與工作線程之間的通信,往往采用的Handler消息機制。

想深入理解Android內(nèi)核層架構,,必須先深入理解Linux現(xiàn)有的IPC機制;對于Android上層架構,,則最常用的通信方式是Binder,、Socket、Handler,,當然也有少量其他的IPC方式,,比如殺進程Process.killProcess()采用的是signal方式。下面說說Binder,、Socket,、Handler:

3.1 Binder

Binder作為Android系統(tǒng)提供的一種IPC機制,無論從系統(tǒng)開發(fā)還是應用開發(fā),,都是Android系統(tǒng)中最重要的組成,,也是最難理解的一塊知識點,想了解為什么Android要采用Binder作為IPC機制,? 可查看我在知乎上的回答,。深入了解Binder機制,最好的方法便是閱讀源碼,,借用Linux鼻祖Linus Torvalds曾說過的一句話:Read The Fucking Source Code,。下面簡要說說Binder IPC原理。

Binder IPC原理

Binder通信采用c/s架構,,從組件視角來說,,包含Client、Server,、ServiceManager以及binder驅(qū)動,,其中ServiceManager用于管理系統(tǒng)中的各種服務。

ServiceManager

  • 想進一步了解Binder,,可查看Binder系列—開篇,,Binder系列花費了13篇文章的篇幅,從源碼角度出發(fā)來講述Driver,、Native,、Framework、App四個層面的整個完整流程,。根據(jù)有些讀者反饋這個系列還是不好理解,,這個binder涉及的層次跨度比較大,知識量比較廣,,建議大家先知道binder是用于進程間通信,,有個大致概念就可以先去學習系統(tǒng)基本知識,等后面有一定功力再進一步深入研究Binder機制。

3.2 Socket

Socket通信方式也是C/S架構,,比Binder簡單很多,。在Android系統(tǒng)中采用Socket通信方式的主要有:

  • ● zygote:用于孵化進程,system_server創(chuàng)建進程是通過socket向zygote進程發(fā)起請求,;

  • ● installd:用于安裝App的守護進程,,上層PackageManagerService很多實現(xiàn)最終都是交給它來完成;

  • ● lmkd:lowmemorykiller的守護進程,,Java層的LowMemoryKiller最終都是由lmkd來完成,;

  • ● adbd:這個也不用說,用于服務adb,;

  • ● logcatd:這個不用說,,用于服務logcat;

  • ● vold:即volume Daemon,,是存儲類的守護進程,,用于負責如USB、Sdcard等存儲設備的事件處理,。

等等還有很多,,這里不一一列舉,Socket方式更多的用于Android framework層與native層之間的通信,。Socket通信方式相對于binder比較簡單,,這里省略。

3.3 Handler

Binder/Socket用于進程間通信,,而Handler消息機制用于同進程的線程間通信,,Handler消息機制是由一組MessageQueue、Message,、Looper,、Handler共同組成的,為了方便且稱之為Handler消息機制,。

有人可能會疑惑,,為何Binder/Socket用于進程間通信,能否用于線程間通信呢,?答案是肯定,,對于兩個具有獨立地址空間的進程通信都可以,當然也能用于共享內(nèi)存空間的兩個線程間通信,,這就好比殺雞用牛刀,。接著可能還有人會疑惑,那handler消息機制能否用于進程間通信,?答案是不能,,Handler只能用于共享內(nèi)存地址空間的兩個線程間通信,即同進程的兩個線程間通信。很多時候,,Handler是工作線程向UI主線程發(fā)送消息,,即App應用中只有主線程能更新UI,其他工作線程往往是完成相應工作后,,通過Handler告知主線程需要做出相應地UI更新操作,,Handler分發(fā)相應的消息給UI主線程去完成,如下圖:

handler_communication

由于工作線程與主線程共享地址空間,,即Handler實例對象mHandler位于線程間共享的內(nèi)存堆上,工作線程與主線程都能直接使用該對象,,只需要注意多線程的同步問題,。工作線程通過mHandler向其成員變量MessageQueue中添加新Message,主線程一直處于loop()方法內(nèi),,當收到新的Message時按照一定規(guī)則分發(fā)給相應的handleMessage()方法來處理,。所以說,Handler消息機制用于同進程的線程間通信,,其核心是線程間共享內(nèi)存空間,,而不同進程擁有不同的地址空間,也就不能用handler來實現(xiàn)進程間通信,。

上圖只是Handler消息機制的一種處理流程,,是不是只能工作線程向UI主線程發(fā)消息呢,其實不然,,可以是UI線程向工作線程發(fā)送消息,,也可以是多個工作線程之間通過handler發(fā)送消息。

要理解framework層源碼,,掌握這3種基本的進程/線程間通信方式是非常有必要,,當然Linux還有不少其他的IPC機制,比如共享內(nèi)存,、信號,、信號量,在源碼中也有體現(xiàn),,如果想全面徹底地掌握Android系統(tǒng),,還是需要對每一種IPC機制都有所了解。

    本站是提供個人知識管理的網(wǎng)絡存儲空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導購買等信息,,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報,。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多