那兩年煉就的Android內(nèi)功修養(yǎng)

原文地址:http://blog.csdn.net/luoshengyang/article/details/8923485

經(jīng)過兩年的時間,終于完成對Android系統(tǒng)的研究了。Android是一個博大精深的系統(tǒng),老羅不敢說自己精通了(事實上最討厭的就是說自己精通神馬神馬的了,或者說企業(yè)說要招聘精通神馬神馬的人才),但是至少可以說打通了整個Android系統(tǒng),從最上面的應用層,一直到最下面的Linux內(nèi)核,煉就的是一種內(nèi)功修養(yǎng)。這篇文章和大家一起分享這兩年研究Android系統(tǒng)的歷程,以此感謝大家一直以來的支持和鼓勵。
以下是本文的提綱:
1. 理念
2. 里程碑
3. 看過的書
4. 研究過的內(nèi)容
5. 將來要做的事情
它們涵蓋了老羅這兩年一直想要和大家分享的內(nèi)容。好了,不說廢話了,直入主題。
一. 理念
這里說的理念是說應該帶什么樣的心態(tài)去研究一個系統(tǒng)。古人說書中自的顏如玉,書中自有黃金屋,我想說代碼里也有顏如玉和黃金屋,所以老羅希望大家都能“Read The Fucking Source Code”。再者,對于優(yōu)秀的開源項目來說,不去讀一下它的源代碼,簡直就是暴殄天物啊。那么,讀代碼有什么好處呢?太多了,除了可以學到別人的優(yōu)秀代碼、架構(gòu)之外,最重要的是,我們能從中找到答案,從而可以解決自己項目上的燃眉之急。
我們在項目中碰到問題的時候,通常第一反應都是到網(wǎng)上去搜索答案。但是有時候有些問題,網(wǎng)絡(luò)并不能給出滿意的答案。這時候就千萬不要忘了你所擁有的一個大招——從代碼中找答案!當然,從代碼中找答案說起來是輕松,但是等到直正去找時,可能就會發(fā)現(xiàn)云里霧里,根本不知道那些代碼在說什么東東,甚至連自己想要看的源代碼文件都不知道在哪里。這就要求平時就要養(yǎng)成讀代碼的習慣,不要臨時抱佛腳。有時候臨時抱佛腳是能解決問題,但是千萬不能抱著這種僥幸心里,掌握一門技術(shù)還是需要踏踏實實地一步一步走。
胡克其實在牛頓之前,就發(fā)現(xiàn)了萬有引力定律,并且推導出了正確的公式。但由于數(shù)學不好,他只能勉強解釋行星繞日的圓周運動,而沒有認識到支配天體運行的力量是“萬有”的。后來數(shù)學狂人牛頓用微積分圓滿地解決了胡克的問題,并且把他提出的力學三條基本定律推廣到了星系空間,改變了自從亞里士多德以來公認的天地不一的舊觀點,被科學界奉為偉大的發(fā)現(xiàn)。胡克大怒,指責牛頓剽竊了他的成果。牛頓尖酸刻薄的回敬:是啊,我他媽還真是站在巨人的肩膀上呢!
我們有理由相信像牛頓、喬布斯之類的狂人,不用站在巨人的肩膀上也能取得矚目的成就。但是,我們不是牛頓,也不是喬布斯,所以在看代碼之前,還是找一些前人總結(jié)的資料來看看吧。拿Android系統(tǒng)來說,你在至少得懂點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)歷了很多版本呢?那么我們應該如何去選擇版本來閱讀呢?一般來說,就是選擇最新的版本來閱讀了。不過隨著又有新版本的源代碼的發(fā)布,我們所看的源代碼就會變成舊版本。這時候心里就會比較糾結(jié):是應該繼續(xù)看舊的代碼,還是去追新版本的代碼呢?就當是看連續(xù)劇,一下子跳到前面去,可能就不知道講什么了。其實版本就算更新得再快,基礎(chǔ)的東西也是不會輕易變化的。我們看代碼時,要抱著的一個目的就是弄懂它的骨架和脈絡(luò)。畢竟對于一個系統(tǒng)來說,它是有很多細節(jié)的,我們無法在短時間把它們都完全吃透。但是主要我們掌握了它的骨架和脈絡(luò),以后無論是要了解它的什么細節(jié),都可以很輕輕地找到相關(guān)的源文件,并且可以很容易進入主題。
坦白說,對于Android系統(tǒng),很多細節(jié)我也不了解。所以有時候你們可以看到,在博客文章后面的評論上,有些同學問的一些比較具體的問題,我是沒有回復的。一來是我不懂,二來是我也沒有時間去幫這些同學去扒代碼來看。這也是在文章一開頭,我就說自己沒有精通Android系統(tǒng)的原因。但是請相信,主要你熟悉Android系統(tǒng)的代碼,并且有出現(xiàn)問題的現(xiàn)場,順藤摸瓜跟著代碼走下去,并且多一點耐心和細心,是可以解決問題的!
關(guān)于Android版本的問題,相信大家都知道我現(xiàn)在的文章都是基于2.3來寫的。很多同學都說我out了,現(xiàn)在都4.2了,甚至4.3或者5.0都要出來了,還在看2.3。我想說的是,主要你掌握了它的骨架和脈絡(luò),無論版本上怎么變化,原理都是一樣的,這就是以不變應萬變之道。因此,我就一直堅持研究2.3,這樣可以使得前前后后研究的東西更連貫一致,避免分散了自己的精力。如果還有疑問的話,后面我講到Android的UI架構(gòu)時,就會簡單對比一下4.2和2.3的不同,其實就會發(fā)現(xiàn),基本原理還是一樣的!
說到Android系統(tǒng)的骨架和脈絡(luò),也有同學抱怨我的文章里面太多代碼細節(jié)了,他們希望我可以抽象一下,用高度概括的語言或者圖像來勾勒出每一個模塊的輪廓。我想說的是,如果你不看代碼,不了解細節(jié),即使我能夠用概括的語言或者圖像來勾勒出這樣的輪廓出來,也許這個輪廓只有我才能看得懂。
我在真正開始看Android系統(tǒng)的源代碼之前,也是有這樣的想法,希望能有一張圖來清楚地告訴我Android系統(tǒng)的輪廓,例如,HAL為什么要將驅(qū)動劃分成用戶空間和內(nèi)核空間兩部分,為什么說Binder是所有IPC機制效率最高的。我確實是從網(wǎng)上得到抽象的資料來解釋這兩個問題,但是這些資料對我來說,還是太抽象了,以至于我有似懂非懂的感覺,實際上就是不懂!就是因為這樣,激發(fā)了我要從代碼中找答案的念頭!現(xiàn)在當我回過頭來這些所謂抽象的輪廓時,我就清楚地知道它講的是什么了。
所以古人云“天將降大任于斯人也,必先苦其心志,勞其筋骨,餓其體膚”是有道理的,因為只有親身經(jīng)歷過一些磨難后得到的東西才是真實的!
好了,關(guān)于理念的問題,就完了,這里再做一下總結(jié):
1. 從代碼中找答案——Read The Fucking Source Code。
2. 以不變應萬變——堅持看一個版本的代碼直至理清它的骨架和脈絡(luò)。
二. 里程碑
研究Android 2.3期間,主要是經(jīng)歷了以下五個時間點,如圖1所示:


圖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++對象模型》,對應的英文版是《Inside C+++ Object Model》
程序編譯、鏈接、加載:
《鏈接器和加載器》,對應的英文版是《Linker and Loader》
《程序員的自我修養(yǎng):鏈接、裝載和庫》
操作系統(tǒng):
《Linux內(nèi)核設(shè)計與實現(xiàn)》,對應的英文版是《Linux Kernel Development》
《深入理解Linux內(nèi)核》,對應的英文版是《Understanding the Linux Kernel》
《深入Linux內(nèi)核架構(gòu)》,對應的英文版是《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)》,對應的英文版是《The Linux Networking Architecture: Design and Implementation of Network Protocols in the Linux Kernel》
《深入理解LINUX網(wǎng)絡(luò)技術(shù)內(nèi)幕》,對應的英文版是《 Understanding Linux Network Internals》
設(shè)備驅(qū)動:
《Linux設(shè)備驅(qū)動程序》,對應的英文版是《Linux Device Drivers》
《精通Linux設(shè)備驅(qū)動程序開發(fā)》,對應的英文版是《Essential Linux Device Drivers》
虛擬機:
《Java SE 7虛擬機規(guī)范》
《深入Java虛擬機》,對應的英文版是《Inside the Java Virtual Machine》
《Oracle JRockit: The Definitive Guide》
嵌入式:
《嵌入式Linux開發(fā)》,對應的英文版是《Embedded Linux Primer》
《構(gòu)建嵌入式Linux系統(tǒng)》,對應的英文版是《Building Embedded Linux Systems》
ARM體系架構(gòu):
《ARM嵌入式系統(tǒng)開發(fā):軟件設(shè)計與優(yōu)化》,對應的英文版是《ARM System Developer's Guide: Designing and Optimizing System Software》
綜合:
《深入理解計算機系統(tǒng)》,對應的英文版是《Computer Systems: A Programmer's Perspective》
上面介紹的這些書,都是屬于進階級別的,所以要求要有一定的語言基礎(chǔ)以及操作系統(tǒng)基礎(chǔ)。此外,對于看書,老羅有一些觀點,供大家參考:
1. 書不是要用的時候才去看的,要養(yǎng)成經(jīng)常看書、終身學習的習慣。
2. 不要只看與目前自己工作相關(guān)的書,IT技術(shù)日新月異,三五年河東,三五年河西。
3. 書看得多了,就會越看越快,學習新的東西時也越容易進入狀態(tài)。
對于Android應用開發(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)容看似松散,實際上都是有組織有計劃的,目標是打通整個Android系統(tǒng),從最上面的應用層,到最下面的Linux內(nèi)核層。簡單來說,博客的所有文章可以劃分為“三橫三縱”,如圖2所示:

圖2 Android系統(tǒng)研究之“三橫三縱”
接下來,老羅就分別描述這三條橫線和縱線,并且給出對應的博客文章鏈接。
1. 準備 -- Preparation -- 橫線
主要就是:
(1)通過閱讀相關(guān)的書籍來了解Linux內(nèi)核和Android應用基礎(chǔ)知識
Android學習啟動篇
(2)搭建好Android源代碼環(huán)境
在Ubuntu上下載、編譯和安裝Android最新源代碼
在Ubuntu上下載、編譯和安裝Android最新內(nèi)核源代碼(Linux Kernel)
如何單獨編譯Android源代碼中的模塊
制作可獨立分發(fā)的Android模擬器
(3)Android系統(tǒng)有很多C++代碼,這些C++代碼用到了很多智能指針,因此有必要了解一下Android系統(tǒng)在C/C++ Runtime Framework中提供的智能指針
Android系統(tǒ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應用程序框架層和系統(tǒng)運行庫層日志系統(tǒng)源代碼分析
Android日志系統(tǒng)Logcat源代碼簡要分析
(2)Binder
Android進程間通信(IPC)機制Binder簡要介紹和學習計劃
淺談Service Manager成為Android進程間通信(IPC)機制Binder守護進程之路
淺談Android系統(tǒng)進程間通信(IPC)機制Binder中的Server和Client獲得Service Manager接口之路
Android系統(tǒng)進程間通信(IPC)機制Binder中的Server啟動過程源代碼分析
Android系統(tǒng)進程間通信(IPC)機制Binder中的Client獲得Server遠程接口過程源代碼分析
Android系統(tǒng)進程間通信Binder機制在應用程序框架層的Java接口源代碼分析
(3)Ashmem
Android系統(tǒng)匿名共享內(nèi)存Ashmem(Anonymous Shared Memory)簡要介紹和學習計劃
Android系統(tǒng)匿名共享內(nèi)存Ashmem(Anonymous Shared Memory)驅(qū)動程序源代碼分析
Android系統(tǒng)匿名共享內(nèi)存Ashmem(Anonymous Shared Memory)在進程間共享的原理分析
Android系統(tǒng)匿名共享內(nèi)存(Anonymous Shared Memory)C++調(diào)用接口分析
3. 硬件抽象層 -- HAL -- 縱線
硬件抽層象最適合用作Android系統(tǒng)的學習入口,它從下到上涉及到了Android系統(tǒng)的各個層次:
Android硬件抽象層(HAL)概要介紹和學習計劃
在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訪問硬件服務接口
在Ubuntu上為Android系統(tǒng)的Application Frameworks層增加硬件訪問服務
在Ubuntu上為Android系統(tǒng)內(nèi)置Java應用程序測試Application Frameworks層的硬件服務
4. 應用程序組件 -- Application Component -- 縱線
應用程序組件是Android系統(tǒng)的核心,為開發(fā)者提供了貼心的服務。應用程序組件有四種,分別是Activity、Service、Broadcast Receiver和Content Provider。圍繞應用程序組件,又有應用程序進程、消息循環(huán)和安裝三個相關(guān)模塊。
(1)Activity
Android應用程序的Activity啟動過程簡要介紹和學習計劃
Android應用程序啟動過程源代碼分析
Android應用程序內(nèi)部啟動Activity過程(startActivity)的源代碼分析
Android應用程序在新的進程中啟動新的Activity的方法和過程分析
解開Android應用程序組件Activity的"singleTask"之謎
(2)Service
Android系統(tǒng)在新進程中啟動自定義服務過程(startService)的原理分析
Android應用程序綁定服務(bindService)的過程源代碼分析
(3)Broadcast Receiver
Android系統(tǒng)中的廣播(Broadcast)機制簡要介紹和學習計劃
Android應用程序注冊廣播接收器(registerReceiver)的過程分析
Android應用程序發(fā)送廣播(sendBroadcast)的過程分析
(4)Content Provider
Android應用程序組件Content Provider簡要介紹和學習計劃
Android應用程序組件Content Provider應用實例
Android應用程序組件Content Provider的啟動過程源代碼分析
Android應用程序組件Content Provider在應用程序之間共享數(shù)據(jù)的原理分析
Android應用程序組件Content Provider的共享數(shù)據(jù)更新通知機制分析
(5)進程
Android系統(tǒng)進程Zygote啟動過程的源代碼分析
Android應用程序進程啟動過程的源代碼分析
(6)消息循環(huán)
Android應用程序消息處理機制(Looper、Handler)分析
Android應用程序鍵盤(Keyboard)消息處理機制分析
Android應用程序線程消息循環(huán)模型分析
(7)安裝
Android應用程序安裝過程源代碼分析
Android系統(tǒng)默認Home應用程序(Launcher)的啟動過程源代碼分析
5. 用戶界面架構(gòu) -- UI -- 縱線
大家對老羅現(xiàn)在還在寫Android 2.3的UI架構(gòu)意見最大,認為已經(jīng)過時了。老羅認為持有這種觀點的人,都是沒有經(jīng)過認真思考的。老羅承認,從Android 4.0開始,UI部分發(fā)生了比較大的變化。但是請注意,這些變化都是在Android 2.3的UI架構(gòu)基礎(chǔ)之上進行的,也就是說,Android 2.3的UI架構(gòu)并沒有過時。你不能說Android 4.0在Android 2.3之上增加了一些feature,就說Android 2.3過時了。
下面這張是從Android官網(wǎng)拿過來的最新UI渲染流程圖,也就是4.2的UI渲染流程圖

圖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)兩個點在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ào)一點:Android 2.3的UI架構(gòu)并沒有過時,是值得去研究的,并且在2.3的基礎(chǔ)上去研究4.2的UI架構(gòu),會更有幫助。
仁者見仁,智者見智,Android 2.3的UI架構(gòu)的說明就到此為止,接下來它的分析路線,都是圍繞上述三個點來進行的。
首先是以開機動畫為切入點,了解Linux內(nèi)核里面的驅(qū)動:
Android系統(tǒng)的開機畫面顯示過程分析
FB驅(qū)動抽象了顯卡,上面的用戶空間程序就是通過它來顯示UI的。
HAL層的Gralloc模塊對FB驅(qū)動進行了封裝,以方便SurfaceFlinger對它進行訪問:
Android幀緩沖區(qū)(Frame Buffer)硬件抽象層(HAL)模塊Gralloc的實現(xiàn)原理分析
SurfaceFlinger負責合成各個應用程序窗口的UI,也就是將各個窗口的UI合成,并且通過FB顯示在屏幕上。在對SurfaceFlinger進行分析之前,我們首先了解應用程序是如何使用的它的:
Android應用程序與SurfaceFlinger服務的關(guān)系概述和學習計劃
Android應用程序與SurfaceFlinger服務的連接過程分析
Android應用程序與SurfaceFlinger服務之間的共享UI元數(shù)據(jù)(SharedClient)的創(chuàng)建過程分析
Android應用程序請求SurfaceFlinger服務創(chuàng)建Surface的過程分析
Android應用程序請求SurfaceFlinger服務渲染Surface的過程分析
萬事俱備,可以開始分析SurfaceFlinger了:
Android系統(tǒng)Surface機制的SurfaceFlinger服務簡要介紹和學習計劃
Android系統(tǒng)Surface機制的SurfaceFlinger服務的啟動過程分析
Android系統(tǒng)Surface機制的SurfaceFlinger服務對幀緩沖區(qū)(Frame Buffer)的管理分析
Android系統(tǒng)Surface機制的SurfaceFlinger服務的線程模型分析
Android系統(tǒng)Surface機制的SurfaceFlinger服務渲染應用程序UI的過程分析
SurfaceFlinger操作的對象是應用程序窗口,因此,我們要掌握應用程序窗口的組成:
Android應用程序窗口(Activity)實現(xiàn)框架簡要介紹和學習計劃
Android應用程序窗口(Activity)的運行上下文環(huán)境(Context)的創(chuàng)建過程分析
Android應用程序窗口(Activity)的窗口對象(Window)的創(chuàng)建過程分析
Android應用程序窗口(Activity)的視圖對象(View)的創(chuàng)建過程分析
Android應用程序窗口(Activity)與WindowManagerService服務的連接過程分析
Android應用程序窗口(Activity)的繪圖表面(Surface)的創(chuàng)建過程分析
Android應用程序窗口(Activity)的測量(Measure)、布局(Layout)和繪制(Draw)過程分析
應用程序窗口是由WindowManagerService進行管理的,并且也是WindowManagerService負責提供窗口信息給SurfaceFlinger的,因此,我們最后分析WindowManagerService:
Android窗口管理服務WindowManagerService的簡要介紹和學習計劃
Android窗口管理服務WindowManagerService計算Activity窗口大小的過程分析
Android窗口管理服務WindowManagerService對窗口的組織方式分析
Android窗口管理服務WindowManagerService對輸入法窗口(Input Method Window)的管理分析
Android窗口管理服務WindowManagerService對壁紙窗口(Wallpaper Window)的管理分析
Android窗口管理服務WindowManagerService計算窗口Z軸位置的過程分析
Android窗口管理服務WindowManagerService顯示Activity組件的啟動窗口(Starting Window)的過程分析
Android窗口管理服務WindowManagerService切換Activity窗口(App Transition)的過程分析
Android窗口管理服務WindowManagerService顯示窗口動畫的原理分析
上述內(nèi)容都研究清楚之后,Android系統(tǒng)的UI架構(gòu)的骨架就清晰了。但是前面所研究的應用程序窗口還是太抽象了,我們有必要研究一下那些組成應用程序窗口內(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)簡要介紹和學習計劃
Android應用程序資源的編譯和打包過程分析
Android應用程序資源管理器(Asset Manager)的創(chuàng)建過程分析
Android應用程序資源的查找過程分析
分析這里,Android系統(tǒng)的UI架構(gòu)就分析完成了,看出什么門道來沒有?是的,我們以開機動畫為切入點,從Linux內(nèi)核空間的FB驅(qū)動,一直分析到用戶空間中HAL層模塊Gralloc、C/C++ Runtime Framework層的SurfaceFlinger、Java Runtime Framework層的WindowMangerService、Window、Widget,以及資源管理框架,從下到上,披荊斬棘。
6. Dalvik虛擬機 -- 橫線
Android系統(tǒng)的應用程序及部分應用程序框架是使用Java語言開發(fā)的,它們運行在Dalvik虛擬機之上,還有另外一部分應用唾棄框架在使用C/C++語言開發(fā)的。使用Java語言開發(fā)的應用程序框架老羅稱之為Java Runtime Framework,而使用C/C++語言開發(fā)的應用程序框架老羅稱之為C/C++ Runtime Framework,它們被Dalvik虛擬機一分為二。通過前面的學習,其實我們都已經(jīng)了解Android系統(tǒng)的Java Runtime Framework和C/C++ Runtime Framework,因此,我們最后將注意力集中在Dalvik虛擬機上:
Dalvik虛擬機簡要介紹和學習計劃
Dalvik虛擬機的啟動過程分析
Dalvik虛擬機的運行過程分析
Dalvik虛擬機JNI方法的注冊過程分析
Dalvik虛擬機進程和線程的創(chuàng)建過程分析
學習完成“三橫三縱”這六條主線之后,我們就可以自豪地說,從上到下地把Android系統(tǒng)打通,并且將它的骨架和脈絡(luò)也理清了!
對于“準備”、“專用驅(qū)動”、“HAL”、“應用程序組件”這四條主線,老羅極力推薦大家看《Android系統(tǒng)源代碼情況分析》一書,內(nèi)容比博客文章要系統(tǒng)、詳細很多,不說其它的,就單單是講Binder進程間通信機制的那一章,就物超所值。在《Android系統(tǒng)源代碼情景分析》一書中,老羅最引以為豪的就是講Binder進程間通信機制的第5章,網(wǎng)上或者其它書上絕對是找不到這么詳盡的分析資料。
五. 將來要做的事情
接下來要做的主要是三件事情:
1. 繼續(xù)研究Android系統(tǒng)
本來以為前段時間的Google I/O會發(fā)布Android 4.3或者5.0,然后老羅就以最新發(fā)布的版本為藍本來進行研究。既然沒有發(fā)布新版本,那么就只有以現(xiàn)在的最新發(fā)布版本4.2為藍本進行研究了。如前所述,4.2與2.3相比,最大的不同之處是默認增加了GPU支持,因此,老羅在接下來的一段時間里,將著重研究4.2的GPU支持。
2. 停止博客更新
這兩年投入在博客上的精力太多了,博客上的文章基本上熬夜熬出來的。大多數(shù)時候,一個話題要花一個星期左右的時間來看代碼,然后再花四個星期左右的時間將文章寫出來。本來是這樣計劃的,依靠《Android系統(tǒng)源代碼情景分析》一書的銷量,可以在經(jīng)濟上得到一定的回報,然后可以繼續(xù)在博客上投入,直至把4.x版本的GPU支持寫完,最后再整理出一本關(guān)于Android系統(tǒng)UI架構(gòu)的書。但是最近詢問了一下書的銷量,差強人意,達不到預期目標。由于沒有形成良性循環(huán),因此沒有辦法,只好停止博客更新。老羅需要把精力投入在其它事情上,希望大家諒解!
3. 仍然會持續(xù)地進行一些小分享
主要是一些隨筆分享,這些分享主要會發(fā)布在微博或者QQ群上面,那里也方便一些和大家進行討論。此外,老羅也樂意和大家進行一些線下分享,主要針對企業(yè)或者單位組織的沙龍、活動和會議等,同時也可以單獨地針對企業(yè)內(nèi)部進行分享。不過前提當然是舉辦方對《老羅的Android之旅》專欄或者《Android系統(tǒng)源代碼情景分析》一書的內(nèi)容感興趣,并且邀請老羅去參加。
如果需要邀請老羅去參加分享,可以通過微博或者郵箱和老羅聯(lián)系,非常感謝大家兩年以來的支持!
郵箱:shyluo@gmail.com
微博:http://weibo.com/shengyangluo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容