溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

android 系統(tǒng)開發(fā)

發(fā)布時間:2020-06-02 00:23:38 來源:網(wǎng)絡(luò) 閱讀:387 作者:yangxiaoming123 欄目:移動開發(fā)

  經(jīng)過兩年的時間,終于完成對Android系統(tǒng)的研究了。Android是一個博大精深的系統(tǒng),老羅不敢說自己精通了(事實上最討厭的就是說自己精通神馬神馬的了,或者說企業(yè)說要招聘精通神馬神馬的人才),但是至少可以說打通了整個Android系統(tǒng),從最上面的應(yīng)用層,一直到最下面的Linux內(nèi)核,煉就的是一種內(nèi)功修養(yǎng)。這篇文章和大家一起分享這兩年研究Android系統(tǒng)的歷程,以此感謝大家一直以來的支持和鼓勵。        以下是本文的提綱:

        1. 理念

        2. 里程碑

        3. 看過的書

        4. 研究過的內(nèi)容

        5. 將來要做的事情

        它們涵蓋了老羅這兩年一直想要和大家分享的內(nèi)容。好了,不說廢話了,直入主題。

        一. 理念

        這里說的理念是說應(yīng)該帶什么樣的心態(tài)去研究一個系統(tǒng)。古人說書中自的顏如玉,書中自有黃金屋,我想說代碼里也有顏如玉和黃金屋,所以老羅希望大家都能“Read The Fucking Source Code”。再者,對于優(yōu)秀的開源項目來說,不去讀一下它的源代碼,簡直就是暴殄天物啊。那么,讀代碼有什么好處呢?太多了,除了可以學(xué)到別人的優(yōu)秀代碼、架構(gòu)之外,最重要的是,我們能從中找到答案,從而可以解決自己項目上的燃眉之急。

        我們在項目中碰到問題的時候,通常第一反應(yīng)都是到網(wǎng)上去搜索答案。但是有時候有些問題,網(wǎng)絡(luò)并不能給出滿意的答案。這時候就千萬不要忘了你所擁有的一個大招——從代碼中找答案!當(dāng)然,從代碼中找答案說起來是輕松,但是等到直正去找時,可能就會發(fā)現(xiàn)云里霧里,根本不知道那些代碼在說什么東東,甚至連自己想要看的源代碼文件都不知道在哪里。這就要求平時就要養(yǎng)成讀代碼的習(xí)慣,不要臨時抱佛腳。有時候臨時抱佛腳是能解決問題,但是千萬不能抱著這種僥幸心里,掌握一門技術(shù)還是需要踏踏實實地一步一步走。

        胡克其實在牛頓之前,就發(fā)現(xiàn)了萬有引力定律,并且推導(dǎo)出了正確的公式。但由于數(shù)學(xué)不好,他只能勉強(qiáng)解釋行星繞日的圓周運(yùn)動,而沒有認(rèn)識到支配天體運(yùn)行的力量是“萬有”的。后來數(shù)學(xué)狂人牛頓用微積分圓滿地解決了胡克的問題,并且把他提出的力學(xué)三條基本定律推廣到了星系空間,改變了自從亞里士多德以來公認(rèn)的天地不一的舊觀點(diǎn),被科學(xué)界奉為偉大的發(fā)現(xiàn)。胡克大怒,指責(zé)牛頓剽竊了他的成果。牛頓尖酸刻薄的回敬:是啊,我他媽還真是站在巨人的肩膀上呢!

        我們有理由相信像牛頓、喬布斯之類的狂人,不用站在巨人的肩膀上也能取得矚目的成就。但是,我們不是牛頓,也不是喬布斯,所以在看代碼之前,還是找一些前人總結(jié)的資料來看看吧。拿Android系統(tǒng)來說,你在至少得懂點(diǎn)Linux內(nèi)核基礎(chǔ)吧!所以在看Android源代碼之前,先找些Linux內(nèi)核的經(jīng)典書籍來看看吧,騷年!后面老羅會推薦一些書籍給大家。

        另外,我們知道,現(xiàn)在的互聯(lián)網(wǎng)產(chǎn)品,講究的是快速迭代。Android系統(tǒng)自第一個版本發(fā)布以來,到現(xiàn)在已經(jīng)經(jīng)歷了很多版本呢?那么我們應(yīng)該如何去選擇版本來閱讀呢?一般來說,就是選擇最新的版本來閱讀了。不過隨著又有新版本的源代碼的發(fā)布,我們所看的源代碼就會變成舊版本。這時候心里就會比較糾結(jié):是應(yīng)該繼續(xù)看舊的代碼,還是去追新版本的代碼呢?就當(dāng)是看連續(xù)劇,一下子跳到前面去,可能就不知道講什么了。其實版本就算更新得再快,基礎(chǔ)的東西也是不會輕易變化的。我們看代碼時,要抱著的一個目的就是弄懂它的骨架和脈絡(luò)。畢竟對于一個系統(tǒng)來說,它是有很多細(xì)節(jié)的,我們無法在短時間把它們都完全吃透。但是主要我們掌握了它的骨架和脈絡(luò),以后無論是要了解它的什么細(xì)節(jié),都可以很輕輕地找到相關(guān)的源文件,并且可以很容易進(jìn)入主題。

        坦白說,對于Android系統(tǒng),很多細(xì)節(jié)我也不了解。所以有時候你們可以看到,在博客文章后面的評論上,有些同學(xué)問的一些比較具體的問題,我是沒有回復(fù)的。一來是我不懂,二來是我也沒有時間去幫這些同學(xué)去扒代碼來看。這也是在文章一開頭,我就說自己沒有精通Android系統(tǒng)的原因。但是請相信,主要你熟悉Android系統(tǒng)的代碼,并且有出現(xiàn)問題的現(xiàn)場,順藤摸瓜跟著代碼走下去,并且多一點(diǎn)耐心和細(xì)心,是可以解決問題的!

        關(guān)于Android版本的問題,相信大家都知道我現(xiàn)在的文章都是基于2.3來寫的。很多同學(xué)都說我out了,現(xiàn)在都4.2了,甚至4.3或者5.0都要出來了,還在看2.3。我想說的是,主要你掌握了它的骨架和脈絡(luò),無論版本上怎么變化,原理都是一樣的,這就是以不變應(yīng)萬變之道。因此,我就一直堅持研究2.3,這樣可以使得前前后后研究的東西更連貫一致,避免分散了自己的精力。如果還有疑問的話,后面我講到Android的UI架構(gòu)時,就會簡單對比一下4.2和2.3的不同,其實就會發(fā)現(xiàn),基本原理還是一樣的!

        說到Android系統(tǒng)的骨架和脈絡(luò),也有同學(xué)抱怨我的文章里面太多代碼細(xì)節(jié)了,他們希望我可以抽象一下,用高度概括的語言或者圖像來勾勒出每一個模塊的輪廓。我想說的是,如果你不看代碼,不了解細(xì)節(jié),即使我能夠用概括的語言或者圖像來勾勒出這樣的輪廓出來,也許這個輪廓只有我才能看得懂。

        我在真正開始看Android系統(tǒng)的源代碼之前,也是有這樣的想法,希望能有一張圖來清楚地告訴我Android系統(tǒng)的輪廓,例如,HAL為什么要將驅(qū)動劃分成用戶空間和內(nèi)核空間兩部分,為什么說Binder是所有IPC機(jī)制效率最高的。我確實是從網(wǎng)上得到抽象的資料來解釋這兩個問題,但是這些資料對我來說,還是太抽象了,以至于我有似懂非懂的感覺,實際上就是不懂!就是因為這樣,激發(fā)了我要從代碼中找答案的念頭!現(xiàn)在當(dāng)我回過頭來這些所謂抽象的輪廓時,我就清楚地知道它講的是什么了。

        所以古人云“天將降大任于斯人也,必先苦其心志,勞其筋骨,餓其體膚”是有道理的,因為只有親身經(jīng)歷過一些磨難后得到的東西才是真實的!

        好了,關(guān)于理念的問題,就完了,這里再做一下總結(jié):

        1. 從代碼中找答案——Read The Fucking Source Code。

        2. 以不變應(yīng)萬變——堅持看一個版本的代碼直至理清它的骨架和脈絡(luò)。

        二. 里程碑

        研究Android 2.3期間,主要是經(jīng)歷了以下五個時間點(diǎn),如圖1所示:

android 系統(tǒng)開發(fā)

圖1 研究Android 2.3的里程碑

         從2011年06月21日第一篇博客文章開始,到2013年06月03日結(jié)束對Android 2.3的研究,一共是差不多兩年的時間,一個從無到有的過程。其中,最痛苦的莫過于是2011年12月下旬到2012年06月12日這6個多月的時間里面,整理了2011年12月下旬前的所有博客文章,形成了《Android系統(tǒng)源代碼情景分析》一書,并且最終在2012年10月下旬正式上市。

        總的來說,就是在兩年的時間里面,獲得了以下的兩個產(chǎn)出: 

        1. 《老羅的Android之旅》博客專欄93篇文章,1857224次訪問,4156條評論,13440積分,排名154。

        2. 《Android系統(tǒng)源代碼情景分析》一書3大篇16章,830頁,1570000字。

        以上產(chǎn)出除了能幫助到廣大的網(wǎng)友之外,也讓自己理清了Android系統(tǒng)的骨架和脈絡(luò)。這些骨架和脈絡(luò)接下來再總結(jié)。2013年06月03日之后,將何去何從?接下來老羅也會簡單說明。

        三. 看過的書 

        在2011年06月21日開始寫博客之前,其實已經(jīng)看過不少的書。在2011年06月21日之后,也一邊寫博客一邊看過不少的書。這個書單很長,下面我主要分類列出一些主要的和經(jīng)典的。

        語言:

        《深度探索C++對象模型》,對應(yīng)的英文版是《Inside C+++ Object Model》

        程序編譯、鏈接、加載:

        《鏈接器和加載器》,對應(yīng)的英文版是《Linker and Loader》

        《程序員的自我修養(yǎng):鏈接、裝載和庫》

        操作系統(tǒng):

        《Linux內(nèi)核設(shè)計與實現(xiàn)》,對應(yīng)的英文版是《Linux Kernel Development》

        《深入理解Linux內(nèi)核》,對應(yīng)的英文版是《Understanding the Linux Kernel》

        《深入Linux內(nèi)核架構(gòu)》,對應(yīng)的英文版是《Professional Linux Kernel Architecture》

        《Linux內(nèi)核源代碼情景分析》

         網(wǎng)絡(luò):

        《Linux網(wǎng)絡(luò)體系結(jié)構(gòu):Linux內(nèi)核中網(wǎng)絡(luò)協(xié)議的設(shè)計與實現(xiàn)》,對應(yīng)的英文版是《The Linux Networking Architecture: Design and Implementation of Network Protocols in the Linux Kernel》

        《深入理解LINUX網(wǎng)絡(luò)技術(shù)內(nèi)幕》,對應(yīng)的英文版是《 Understanding Linux Network Internals》

        設(shè)備驅(qū)動:

        《Linux設(shè)備驅(qū)動程序》,對應(yīng)的英文版是《Linux Device Drivers》

        《精通Linux設(shè)備驅(qū)動程序開發(fā)》,對應(yīng)的英文版是《Essential Linux Device Drivers》

        虛擬機(jī):

        《Java SE 7虛擬機(jī)規(guī)范》

        《深入Java虛擬機(jī)》,對應(yīng)的英文版是《Inside the Java Virtual Machine》

        《Oracle JRockit: The Definitive Guide》

        嵌入式:

        《嵌入式Linux開發(fā)》,對應(yīng)的英文版是《Embedded Linux Primer》

        《構(gòu)建嵌入式Linux系統(tǒng)》,對應(yīng)的英文版是《Building Embedded Linux Systems》

        ARM體系架構(gòu):

        《ARM嵌入式系統(tǒng)開發(fā):軟件設(shè)計與優(yōu)化》,對應(yīng)的英文版是《ARM System Developer's Guide: Designing and Optimizing System Software》

        綜合:

       《深入理解計算機(jī)系統(tǒng)》,對應(yīng)的英文版是《Computer Systems: A Programmer's Perspective》

        上面介紹的這些書,都是屬于進(jìn)階級別的,所以要求要有一定的語言基礎(chǔ)以及操作系統(tǒng)基礎(chǔ)。此外,對于看書,老羅有一些觀點(diǎn),供大家參考:

        1. 書不是要用的時候才去看的,要養(yǎng)成經(jīng)??磿?、終身學(xué)習(xí)的習(xí)慣。

        2. 不要只看與目前自己工作相關(guān)的書,IT技術(shù)日新月異,三五年河?xùn)|,三五年河西。

        3. 書看得多了,就會越看越快,學(xué)習(xí)新的東西時也越容易進(jìn)入狀態(tài)。

        對于Android應(yīng)用開發(fā),力推官方文檔:

        http://developer.android.com/training/index.html

        http://developer.android.com/guide/components/index.html

        http://developer.android.com/tools/index.html

        四. 研究過的內(nèi)容

        整個博客的內(nèi)容看似松散,實際上都是有組織有計劃的,目標(biāo)是打通整個Android系統(tǒng),從最上面的應(yīng)用層,到最下面的Linux內(nèi)核層。簡單來說,博客的所有文章可以劃分為“三橫三縱”,如圖2所示:

android 系統(tǒng)開發(fā)

圖2 Android系統(tǒng)研究之“三橫三縱”

        接下來,老羅就分別描述這三條橫線和縱線,并且給出對應(yīng)的博客文章鏈接。

        1. 準(zhǔn)備 -- Preparation -- 橫線

        主要就是:

       (1)通過閱讀相關(guān)的書籍來了解Linux內(nèi)核和Android應(yīng)用基礎(chǔ)知識

         Android學(xué)習(xí)啟動篇

       (2)搭建好Android源代碼環(huán)境

         在Ubuntu上下載、編譯和安裝Android最新源代碼

         在Ubuntu上下載、編譯和安裝Android最新內(nèi)核源代碼(Linux Kernel)

         如何單獨(dú)編譯Android源代碼中的模塊

         制作可獨(dú)立分發(fā)的Android模擬器

       (3)Android系統(tǒng)有很多C++代碼,這些C++代碼用到了很多智能指針,因此有必要了解一下Android系統(tǒng)在C/C++ Runtime Framework中提供的智能指針

         Android系統(tǒng)的智能指針(輕量級指針、強(qiáng)指針和弱指針)的實現(xiàn)原理分析

         2. 專用驅(qū)動 -- Proprietary Drivers -- 橫線

         這些專用驅(qū)動就是指Logger、Binder和Ashmem,它們整個Android系統(tǒng)的基石:

        (1)Logger

          淺談Android系統(tǒng)開發(fā)中LOG的使用

         Android日志系統(tǒng)驅(qū)動程序Logger源代碼分析

         Android應(yīng)用程序框架層和系統(tǒng)運(yùn)行庫層日志系統(tǒng)源代碼分析

         Android日志系統(tǒng)Logcat源代碼簡要分析

        (2)Binder

          Android進(jìn)程間通信(IPC)機(jī)制Binder簡要介紹和學(xué)習(xí)計劃

         淺談Service Manager成為Android進(jìn)程間通信(IPC)機(jī)制Binder守護(hù)進(jìn)程之路

         淺談Android系統(tǒng)進(jìn)程間通信(IPC)機(jī)制Binder中的Server和Client獲得Service Manager接口之路

         Android系統(tǒng)進(jìn)程間通信(IPC)機(jī)制Binder中的Server啟動過程源代碼分析

         Android系統(tǒng)進(jìn)程間通信(IPC)機(jī)制Binder中的Client獲得Server遠(yuǎn)程接口過程源代碼分析

         Android系統(tǒng)進(jìn)程間通信Binder機(jī)制在應(yīng)用程序框架層的Java接口源代碼分析

        (3)Ashmem

          Android系統(tǒng)匿名共享內(nèi)存Ashmem(Anonymous Shared Memory)簡要介紹和學(xué)習(xí)計劃

          Android系統(tǒng)匿名共享內(nèi)存Ashmem(Anonymous Shared Memory)驅(qū)動程序源代碼分析

          Android系統(tǒng)匿名共享內(nèi)存Ashmem(Anonymous Shared Memory)在進(jìn)程間共享的原理分析

          Android系統(tǒng)匿名共享內(nèi)存(Anonymous Shared Memory)C++調(diào)用接口分析

        3. 硬件抽象層 -- HAL -- 縱線

        硬件抽層象最適合用作Android系統(tǒng)的學(xué)習(xí)入口,它從下到上涉及到了Android系統(tǒng)的各個層次:

         Android硬件抽象層(HAL)概要介紹和學(xué)習(xí)計劃

         在Ubuntu上為Android系統(tǒng)編寫Linux內(nèi)核驅(qū)動程序

         在Ubuntu上為Android系統(tǒng)內(nèi)置C可執(zhí)行程序測試Linux內(nèi)核驅(qū)動程序

         在Ubuntu上為Android增加硬件抽象層(HAL)模塊訪問Linux內(nèi)核驅(qū)動程序

         在Ubuntu為Android硬件抽象層(HAL)模塊編寫JNI方法提供Java訪問硬件服務(wù)接口

         在Ubuntu上為Android系統(tǒng)的Application Frameworks層增加硬件訪問服務(wù)

         在Ubuntu上為Android系統(tǒng)內(nèi)置Java應(yīng)用程序測試Application Frameworks層的硬件服務(wù)

        4. 應(yīng)用程序組件 -- Application Component -- 縱線

        應(yīng)用程序組件是Android系統(tǒng)的核心,為開發(fā)者提供了貼心的服務(wù)。應(yīng)用程序組件有四種,分別是Activity、Service、Broadcast Receiver和Content Provider。圍繞應(yīng)用程序組件,又有應(yīng)用程序進(jìn)程、消息循環(huán)和安裝三個相關(guān)模塊。

       (1)Activity

         Android應(yīng)用程序的Activity啟動過程簡要介紹和學(xué)習(xí)計劃

         Android應(yīng)用程序啟動過程源代碼分析

         Android應(yīng)用程序內(nèi)部啟動Activity過程(startActivity)的源代碼分析

         Android應(yīng)用程序在新的進(jìn)程中啟動新的Activity的方法和過程分析

         解開Android應(yīng)用程序組件Activity的"singleTask"之謎

       (2)Service

         Android系統(tǒng)在新進(jìn)程中啟動自定義服務(wù)過程(startService)的原理分析

         Android應(yīng)用程序綁定服務(wù)(bindService)的過程源代碼分析

       (3)Broadcast Receiver

         Android系統(tǒng)中的廣播(Broadcast)機(jī)制簡要介紹和學(xué)習(xí)計劃

         Android應(yīng)用程序注冊廣播接收器(registerReceiver)的過程分析

         Android應(yīng)用程序發(fā)送廣播(sendBroadcast)的過程分析

       (4)Content Provider

         Android應(yīng)用程序組件Content Provider簡要介紹和學(xué)習(xí)計劃

         Android應(yīng)用程序組件Content Provider應(yīng)用實例

         Android應(yīng)用程序組件Content Provider的啟動過程源代碼分析

         Android應(yīng)用程序組件Content Provider在應(yīng)用程序之間共享數(shù)據(jù)的原理分析

         Android應(yīng)用程序組件Content Provider的共享數(shù)據(jù)更新通知機(jī)制分析

       (5)進(jìn)程

         Android系統(tǒng)進(jìn)程Zygote啟動過程的源代碼分析

         Android應(yīng)用程序進(jìn)程啟動過程的源代碼分析

       (6)消息循環(huán)

         Android應(yīng)用程序消息處理機(jī)制(Looper、Handler)分析

         Android應(yīng)用程序鍵盤(Keyboard)消息處理機(jī)制分析

         Android應(yīng)用程序線程消息循環(huán)模型分析

       (7)安裝

         Android應(yīng)用程序安裝過程源代碼分析

         Android系統(tǒng)默認(rèn)Home應(yīng)用程序(Launcher)的啟動過程源代碼分析

        5. 用戶界面架構(gòu) -- UI -- 縱線

        大家對老羅現(xiàn)在還在寫Android 2.3的UI架構(gòu)意見最大,認(rèn)為已經(jīng)過時了。老羅認(rèn)為持有這種觀點(diǎn)的人,都是沒有經(jīng)過認(rèn)真思考的。老羅承認(rèn),從Android 4.0開始,UI部分發(fā)生了比較大的變化。但是請注意,這些變化都是在Android  2.3的UI架構(gòu)基礎(chǔ)之上進(jìn)行的,也就是說,Android  2.3的UI架構(gòu)并沒有過時。你不能說Android 4.0在Android  2.3之上增加了一些feature,就說Android  2.3過時了。

        下面這張是從Android官網(wǎng)拿過來的最新UI渲染流程圖,也就是4.2的UI渲染流程圖:

android 系統(tǒng)開發(fā)

圖2 Android 4.2的UI渲染流程

        從這張圖可以看出關(guān)于Android的UI架構(gòu)的三條主線:

      (1)每一個Window的Surface都怎樣渲染的?不管怎么樣,最后渲染出來的都是一個Buffer,交給SurfaceFlinger合成到Display上。

      (2)SurfaceFlinger是怎樣合成每一個Window的Surface的?

      (3)WindowManamgerService是怎么樣管理Window的? 

        第(1)和第(2)兩個點(diǎn)在2.3和4.2之間有變化,主要是因為增加了GPU的支持,具體就表現(xiàn)為Window的Surface在渲染的時候使用了GPU,而SurfaceFlinger在合成每一個Window的Surface的時候,也使用了GPU或者Overlay和Blitter這些硬件加速,但是主體流程都沒有變,也就是說,Window的Surface渲染好之后,最終依然是交給SurfaceFlinger來合成。此外,雖然我還沒有開始看4.2的代碼,但是可以看得出,4.2里面的HWComposer,只不過是封裝和抽象了2.3就有的Overlay和Blitter,而SurfaceTexture的作用與2.3的SurfaceComposerClient、SurfaceControl也是類似的。第(3)點(diǎn)基本上就沒有什么變化,除非以后要支持多窗口。

        通過上述對比,只想強(qiáng)調(diào)一點(diǎn):Android 2.3的UI架構(gòu)并沒有過時,是值得去研究的,并且在2.3的基礎(chǔ)上去研究4.2的UI架構(gòu),會更有幫助。

        仁者見仁,智者見智,Android 2.3的UI架構(gòu)的說明就到此為止,接下來它的分析路線,都是圍繞上述三個點(diǎn)來進(jìn)行的。

        首先是以開機(jī)動畫為切入點(diǎn),了解Linux內(nèi)核里面的驅(qū)動:

        Android系統(tǒng)的開機(jī)畫面顯示過程分析

        FB驅(qū)動抽象了顯卡,上面的用戶空間程序就是通過它來顯示UI的。

        HAL層的Gralloc模塊對FB驅(qū)動進(jìn)行了封裝,以方便SurfaceFlinger對它進(jìn)行訪問:

        Android幀緩沖區(qū)(Frame Buffer)硬件抽象層(HAL)模塊Gralloc的實現(xiàn)原理分析

        SurfaceFlinger負(fù)責(zé)合成各個應(yīng)用程序窗口的UI,也就是將各個窗口的UI合成,并且通過FB顯示在屏幕上。在對SurfaceFlinger進(jìn)行分析之前,我們首先了解應(yīng)用程序是如何使用的它的:

        Android應(yīng)用程序與SurfaceFlinger服務(wù)的關(guān)系概述和學(xué)習(xí)計劃

        Android應(yīng)用程序與SurfaceFlinger服務(wù)的連接過程分析

        Android應(yīng)用程序與SurfaceFlinger服務(wù)之間的共享UI元數(shù)據(jù)(SharedClient)的創(chuàng)建過程分析

        Android應(yīng)用程序請求SurfaceFlinger服務(wù)創(chuàng)建Surface的過程分析

        Android應(yīng)用程序請求SurfaceFlinger服務(wù)渲染Surface的過程分析

        萬事俱備,可以開始分析SurfaceFlinger了:

        Android系統(tǒng)Surface機(jī)制的SurfaceFlinger服務(wù)簡要介紹和學(xué)習(xí)計劃

        Android系統(tǒng)Surface機(jī)制的SurfaceFlinger服務(wù)的啟動過程分析

        Android系統(tǒng)Surface機(jī)制的SurfaceFlinger服務(wù)對幀緩沖區(qū)(Frame Buffer)的管理分析

        Android系統(tǒng)Surface機(jī)制的SurfaceFlinger服務(wù)的線程模型分析

        Android系統(tǒng)Surface機(jī)制的SurfaceFlinger服務(wù)渲染應(yīng)用程序UI的過程分析

        SurfaceFlinger操作的對象是應(yīng)用程序窗口,因此,我們要掌握應(yīng)用程序窗口的組成:

        Android應(yīng)用程序窗口(Activity)實現(xiàn)框架簡要介紹和學(xué)習(xí)計劃

        Android應(yīng)用程序窗口(Activity)的運(yùn)行上下文環(huán)境(Context)的創(chuàng)建過程分析

        Android應(yīng)用程序窗口(Activity)的窗口對象(Window)的創(chuàng)建過程分析

        Android應(yīng)用程序窗口(Activity)的視圖對象(View)的創(chuàng)建過程分析

        Android應(yīng)用程序窗口(Activity)與WindowManagerService服務(wù)的連接過程分析

        Android應(yīng)用程序窗口(Activity)的繪圖表面(Surface)的創(chuàng)建過程分析

        Android應(yīng)用程序窗口(Activity)的測量(Measure)、布局(Layout)和繪制(Draw)過程分析

        應(yīng)用程序窗口是由WindowManagerService進(jìn)行管理的,并且也是WindowManagerService負(fù)責(zé)提供窗口信息給SurfaceFlinger的,因此,我們最后分析WindowManagerService:

        Android窗口管理服務(wù)WindowManagerService的簡要介紹和學(xué)習(xí)計劃

        Android窗口管理服務(wù)WindowManagerService計算Activity窗口大小的過程分析

        Android窗口管理服務(wù)WindowManagerService對窗口的組織方式分析

        Android窗口管理服務(wù)WindowManagerService對輸入法窗口(Input Method Window)的管理分析

        Android窗口管理服務(wù)WindowManagerService對壁紙窗口(Wallpaper Window)的管理分析

        Android窗口管理服務(wù)WindowManagerService計算窗口Z軸位置的過程分析

        Android窗口管理服務(wù)WindowManagerService顯示Activity組件的啟動窗口(Starting Window)的過程分析

        Android窗口管理服務(wù)WindowManagerService切換Activity窗口(App Transition)的過程分析

        Android窗口管理服務(wù)WindowManagerService顯示窗口動畫的原理分析

        上述內(nèi)容都研究清楚之后,Android系統(tǒng)的UI架構(gòu)的骨架就清晰了。但是前面所研究的應(yīng)用程序窗口還是太抽象了,我們有必要研究一下那些組成應(yīng)用程序窗口內(nèi)容的UI控件是怎么實現(xiàn)的,以TextView和SurfaceView為代表:

        Android控件TextView的實現(xiàn)原理分析

        Android視圖SurfaceView的實現(xiàn)原理分析

        最后,分析Android系統(tǒng)的UI架構(gòu),怎能不提它的資源管理框架?它有效地分離了代碼和UI:

        Android資源管理框架(Asset Manager)簡要介紹和學(xué)習(xí)計劃

        Android應(yīng)用程序資源的編譯和打包過程分析

        Android應(yīng)用程序資源管理器(Asset Manager)的創(chuàng)建過程分析

        Android應(yīng)用程序資源的查找過程分析

        分析這里,Android系統(tǒng)的UI架構(gòu)就分析完成了,看出什么門道來沒有?是的,我們以開機(jī)動畫為切入點(diǎn),從Linux內(nèi)核空間的FB驅(qū)動,一直分析到用戶空間中HAL層模塊Gralloc、C/C++ Runtime Framework層的SurfaceFlinger、Java Runtime Framework層的WindowMangerService、Window、Widget,以及資源管理框架,從下到上,披荊斬棘。

        6. Dalvik虛擬機(jī) -- 橫線

        Android系統(tǒng)的應(yīng)用程序及部分應(yīng)用程序框架是使用Java語言開發(fā)的,它們運(yùn)行在Dalvik虛擬機(jī)之上,還有另外一部分應(yīng)用唾棄框架在使用C/C++語言開發(fā)的。使用Java語言開發(fā)的應(yīng)用程序框架老羅稱之為Java Runtime Framework,而使用C/C++語言開發(fā)的應(yīng)用程序框架老羅稱之為C/C++ Runtime Framework,它們被Dalvik虛擬機(jī)一分為二。通過前面的學(xué)習(xí),其實我們都已經(jīng)了解Android系統(tǒng)的Java Runtime Framework和C/C++ Runtime Framework,因此,我們最后將注意力集中在Dalvik虛擬機(jī)上:

        Dalvik虛擬機(jī)簡要介紹和學(xué)習(xí)計劃

        Dalvik虛擬機(jī)的啟動過程分析

        Dalvik虛擬機(jī)的運(yùn)行過程分析

        Dalvik虛擬機(jī)JNI方法的注冊過程分析

        Dalvik虛擬機(jī)進(jìn)程和線程的創(chuàng)建過程分析

        學(xué)習(xí)完成“三橫三縱”這六條主線之后,我們就可以自豪地說,從上到下地把Android系統(tǒng)打通,并且將它的骨架和脈絡(luò)也理清了!

        對于“準(zhǔn)備”、“專用驅(qū)動”、“HAL”、“應(yīng)用程序組件”這四條主線,老羅極力推薦大家看《Android系統(tǒng)源代碼情況分析》一書,內(nèi)容比博客文章要系統(tǒng)、詳細(xì)很多,不說其它的,就單單是講Binder進(jìn)程間通信機(jī)制的那一章,就物超所值。在《Android系統(tǒng)源代碼情景分析》一書中,老羅最引以為豪的就是講Binder進(jìn)程間通信機(jī)制的第5章,網(wǎng)上或者其它書上絕對是找不到這么詳盡的分析資料。

        五. 將來要做的事情

        接下來要做的主要是三件事情:

        1. 繼續(xù)研究Android系統(tǒng)

        本來以為前段時間的Google I/O會發(fā)布Android 4.3或者5.0,然后老羅就以最新發(fā)布的版本為藍(lán)本來進(jìn)行研究。既然沒有發(fā)布新版本,那么就只有以現(xiàn)在的最新發(fā)布版本4.2為藍(lán)本進(jìn)行研究了。如前所述,4.2與2.3相比,最大的不同之處是默認(rèn)增加了GPU支持,因此,老羅在接下來的一段時間里,將著重研究4.2的GPU支持。

        2. 停止博客更新

        這兩年投入在博客上的精力太多了,博客上的文章基本上熬夜熬出來的。大多數(shù)時候,一個話題要花一個星期左右的時間來看代碼,然后再花四個星期左右的時間將文章寫出來。本來是這樣計劃的,依靠《Android系統(tǒng)源代碼情景分析》一書的銷量,可以在經(jīng)濟(jì)上得到一定的回報,然后可以繼續(xù)在博客上投入,直至把4.x版本的GPU支持寫完,最后再整理出一本關(guān)于Android系統(tǒng)UI架構(gòu)的書。但是最近詢問了一下書的銷量,差強(qiáng)人意,達(dá)不到預(yù)期目標(biāo)。由于沒有形成良性循環(huán),因此沒有辦法,只好停止博客更新。老羅需要把精力投入在其它事情上,希望大家諒解!


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI