Android源碼解析系列

知乎上看了一篇非常不錯的博文:有沒有必要閱讀ANDROID源碼 
看完之後痛定思過,平時所學往往是知其然然不知其所以然,所以爲了更好的深入Android體系,決定學習android framework層源碼。這篇文章就是源碼學習的彙總篇,包含學習源碼的流程,文章列表等等,會根據學習的進度不定時更新。

在學習源碼的時候容易進入一個誤區就是只見樹木不見森林,具體而言就是對某一個知識點扣的太死了,而忽略了整個流程,所以在我學習的過程中主要學習源碼的執行流程而不糾結於細節,可能有的地方理解的不夠深刻,有錯誤的地方希望大家指正。

在分析android源碼的過程中我更希望以一種有序的分析過程來分framework的源碼,這裏我簡單的以以下的源碼流程來分析:

  • 異步消息機制源碼

  • 系統核心進程啓動流程源碼

  • 應用進程啓動流程源碼

  • apk解析與安裝流程源碼

  • Activity啓動銷燬流程源碼

  • Activity繪製與銷燬繪製流程源碼

  • Dialog,PopupWindow,Toast繪製取消繪製流程源碼

  • Activity其他成員方法執行流程源碼

  • 系統按鍵處理流程源碼

  • Service啓動銷燬流程源碼

  • BroadcastReceiver流程源碼

  • ContextProvider流程源碼

其中紅色字體部分是我已經解析了的源碼列表,黑色字體的流程是尚未解析的源碼流程列表(PS:可能列表會隨時更新奧)


android源碼解析系列文章列表(會根據解析過程隨時更新文章列表): 

android源碼解析之(一)–>android項目構建過程

平時開發過程中我們通過android studio編寫完成android項目之後直接點擊 Run ‘app’就可以在build/outputs/apk生成可以在android設備中安裝的apk文件了,那麼整個android源碼的構建過程是怎麼樣的呢?…

android源碼解析之(二)–>異步消息機制

爲了更好的深入android體系,決定學習android framework層源碼,就從最簡單的android異步消息機制開始吧。所以也就有了本文:android中的異步消息機制。本文主要從源碼角度分析android的異步消息機制…

android源碼解析之(三)–>異步任務AsyncTask

android的異步任務體系中還有一個非常重要的操作類:AsyncTask,其內部主要使用的是java的線程池和Handler來實現異步任務以及與UI線程的交互。本文我們將從源碼角度分析一下AsyncTask的基本使用和實現原理…

android源碼解析之(四)–>HandlerThread

本文我們將講解HandlerThread相關的概念。HandlerThread是個什麼東西?查看類的定義時有這樣一段話:…意思就是說:這個類的作用是創建一個包含looper的線程。 那麼我們在什麼時候需要用到它呢?

android源碼解析之(五)–>IntentService

本文我們將講解IntentService相關的知識。什麼是IntentService?簡單來說IntentService就是一個自身含有消息循環的Service,首先它是一個service,所以service相關具有的特性他都有,同時他還有一些自身的屬性,其內部封裝了一個消息隊列和一個HandlerThread,在其具體的抽象方法:onHandleIntent方法是運行在其消息隊列線程中,廢話不多說,我們來看其簡單的使用方法…

android源碼解析之(六)–>Log日誌API

本文我們將介紹一下android中的日誌API,其主要是我們即將需要介紹的Log對象,它位於android framework層utils包下,是一個final class類:查看其具體定義…

android源碼解析之(七)–>LruCache

android開發過程中經常會用到緩存,現在主流的app中圖片等資源的緩存策略一般是分兩級,一個是內存級別的緩存,一個是磁盤級別的緩存。 作爲android系統的維護者google也開源了其緩存方案,LruCache和DiskLruCache。從android3.1開始LruCache已經作爲android源碼的一部分維護在android系統中,爲了兼容以前的版本android的support-…

android源碼解析之(八)–>Zygote進程啓動流程

大家都知道android系統的Zygote進程是所有的android進程的父進程,包括SystemServer和各種應用進程都是通過Zygote進程fork出來的。Zygote(孵化)進程相當於是android系統的根進程,後面所有的進程都是通過這個進程fork出來的,而Zygote進程則是通過linux系統的init進程啓動的,也就是說,android系統中各種進程的啓動方式init進程 –>…

android源碼解析之(九)–>SystemServer進程啓動流程

上面一文中我們講過android系統中比較重要的幾個進程:init進程,Zygote進程,SystemServer進程已經各種應用進程,其中Zygote進程是整個android系統的根進程,包含SystemServer進程已經各種應用進程在內的進程都是通過Zygote進程fork出來的,具體可參見…

android源碼解析之(十)–>Launcher啓動流程

Launcher程序就是我們平時看到的桌面程序,它其實也是一個android應用程序,只不過這個應用程序是系統默認第一個啓動的應用程序,這裏我們就簡單的分析一下Launcher應用的啓動流程。不同的手機廠商定製android操作系統的時候都會更改Launcher的源代碼,我們這裏以android23的源碼爲例大致的分析一下Launcher的啓動流程。 通過上一篇文章,我們知道SystemSe…

android源碼解析之(十一)–>應用進程啓動流程

每一個android應用默認都是在他自己的linux進程中運行。android操作系統會在這個android應用中的組件需要被執行的時候啓動這個應用進程,並且會在這個應用進程沒有任何組件執行或者是系統需要爲其他應用申請更多內存的時候殺死這個應用進程。所以當我們需要啓動這個應用的四大組件之一的時候如果這個應用的進程還沒有啓動,那麼就會先啓動這個應用程序進程。本節主要是通過分析Activity的啓動過程介紹應用程序進程的啓動流程…

android源碼解析之(十二)–>系統啓動並解析Manifest的流程

大家應該都知道,Android系統啓動之後,我們就可以在一個應用中打開另一個從未打開過的應用,或者是在一個應用中發送廣播,如果另外一個應用設置了這個廣播的接收器,那麼這個應用進程就會被啓動並接收該廣播並作出相應的處理,這樣的例子很多,我們可以猜測到Android系統在啓動的時候就會抓取到了系統中所有安裝的應用信息(應該是解析apk文件的Manifest信息),即在Android系統的啓動過程中就已經解析了系統中安裝應用的androidManifest.xml文件並保存起來了,那麼這個過程具體是如何的呢?…

android源碼解析之(十三)–>apk安裝流程

上一篇文章中給大家分析了一下android系統啓動之後調用PackageManagerService服務並解析系統特定目錄,解析apk文件並安裝的過程,這個安裝過期實際上是沒有圖形界面的,底層調用的是我們平時比較熟悉的adb命令,那麼我們平時安裝apk文件的時候大部分是都過圖形界面安裝的,那麼這種方式安裝apk具體的流程是怎樣的呢?下面我們就來具體看一下apk的具體安裝過程,相信大家都知道如果我們想…

android源碼解析之(十四)–>Activity啓動流程

好吧,終於要開始講解Activity的啓動流程了,Activity的啓動流程相對複雜一下,涉及到了Activity中的生命週期方法,涉及到了Android體系的CS模式,涉及到了Android中進程通訊Binder機制等等,首先介紹一下Activity,這裏引用一下Android guide中對Activity的介紹: An activity represents a single screen…

android源碼解析之(十五)–>Activity銷燬流程

繼續我們的源碼解析,上一篇文章我們介紹了Activity的啓動流程,一個典型的場景就是Activity a 啓動了一個Activity b,他們的生命週期回調方法是: onPause(a) –> onCreate(b) –> onStart(b) –> onResume(b) –> onStop(a) 而我們根據源碼也驗證了這樣的生命週期調用序列,那麼Activity的銷燬流程呢?它的生命週期…

android源碼解析(十六)–>應用進程Context創建流程

今天講講應用進程Context的創建流程,相信大家平時在開發過程中經常會遇到對Context對象的使用,Application是Context,Activity是Context,Service也是Context,所以有一個經典的問題是一個App中一共有多少個Context?所以這個問題的答案是Application + N個Activity + N個Service。還有就是我們平時在使用Contex…

android源碼解析(十七)–>Activity佈局加載流程

好吧,終於要開始講講Activity的佈局加載流程了,大家都知道在Android體系中Activity扮演了一個界面展示的角色,這也是它與android中另外一個很重要的組件Service最大的不同,但是這個展示的界面的功能是Activity直接控制的麼?界面的佈局文件是如何加載到內存並被Activity管理的?android中的View是一個怎樣的概念?加載到內存中的佈局文件是如何繪製出來的?…

android源碼解析(十八)–>Activity佈局繪製流程

這篇文章是承接上一篇文章來寫的,大家都知道Activity在Android體系中扮演者一個界面展示的角色,通過上一篇文章的分析,我們知道Activity是通過Window來控制界面的展示的,一個Window對象就是一個窗口對象,而每個Activity中都有一個相應的Window對象,所以說一個Activity對象也就可以說是一個窗口對象,而Window只是控制着界面佈局文件的加載過程,那麼界面佈局…

android源碼解析(十九)–>Dialog加載繪製流程

其實Android系統中所有的顯示控件(注意這裏是控件,而不是組件)的加載繪製流程都是類似的,包括:Dialog的加載繪製流程,PopupWindow的加載繪製流程,Toast的顯示原理等,上一篇文章中,我說在介紹了Activity界面的加載繪製流程之後,就會分析一下剩餘幾個控件的顯示控制流程,這裏我打算先分析一下Dialog的加載繪製流程…

android源碼解析(二十)–>Dialog取消繪製流程

上幾篇文章中我們分析了Dialog的加載繪製流程,也分析了Acvityi的加載繪製流程,說白了Android系統中窗口的展示都是通過Window對象控制,通過ViewRootImpl對象執行繪製操作來完成的,那麼窗口的取消繪製流程是怎麼樣的呢?這篇文章就以Dialog爲例說明Window窗口是如何取消繪製的。 有的同學可能會問前幾篇文章介紹Activity的加載繪製流程的時候爲何沒有講…

android源碼解析(二十一)–>PopupWindow加載繪製流程

在前面的幾篇文章中我們分析了Activity與Dialog的加載繪製流程,取消繪製流程,相信大家對Android系統的窗口繪製機制有了一個感性的認識了,這篇文章我們將繼續分析一下PopupWindow加載繪製流程。 在分析PopupWindow之前,我們將首先說一下什麼是PopupWindow?理解一個類最好的方式就是看一下這個類的定義,這裏我們摘要了一下Android系統中…

android源碼解析(二十二)–>Toast加載繪製流程

前面我們分析了Activity、Dialog、PopupWindow的加載繪製流程,相信大家對整個Android系統中的窗口繪製流程已經有了一個比較清晰的認識了,這裏最後再給大家介紹一下Toast的加載繪製流程。其實Toast窗口和Activity、Dialog、PopupWindow有一個不太一眼的地方,就是Toast窗口是屬於系統級別的窗口,他和輸入框等類似的,不屬於某一個應用,即不屬於某…

android源碼解析(二十三)–>Android異常處理流程

前面的幾篇文章都是講解的android中的窗口顯示機制,包括Activity窗口加載繪製流程,Dialog窗口加載繪製流程,PopupWindow窗口加載繪製流程,Toast窗口加載繪製流程等等。整個Android的界面顯示的原理都是類似的,都是通過Window對象控制View組件,實現加載與繪製流程。 這篇文章休息一下,不在講解Android的窗口繪製機制,穿插的講解一下Android系統的異…

android源碼解析(二十四)–>onSaveInstanceState執行時機

我們已經分析過Activity的啓動流程,從中也分析了Activity的生命週期。而其中有一個生命週期方法:onSaveInstanceState方法,今天我們主要講解一下onSaveInstanceState方法的執行時機。可能部分同學對Activity的onSaveInstanceState方法不是特別熟悉,這裏我們簡單介紹一下。onSaveInstanceState方法是Activity的…

android源碼解析(二十五)–>onLowMemory執行流程

Android系統中一個個的App都是一個個不同的應用進程,擁有各自的JVM與運行時,每個App的進程可使用的內存大小都是固定的,當系統中App打開數量過多時,就會使Android系統的可用內存降低,對於當前正在使用的App而言,可能還需要繼續申請系統內存,而我們的剩餘系統內存已經不足以被當前App所申請了,這時候系統會自動的清理那些後臺進程,進而釋放出可用內存用於前臺進程的使用,當然這裏系統清理後臺進程的算法不是我們討論的重點。這裏我們只是大概的分析Android系統回調Activity的onLowMemory方法的流程…

android源碼解析(二十六)–>截屏事件流程

今天這篇文章我們主要講一下Android系統中的截屏事件處理流程。用過android系統手機的同學應該都知道,一般的android手機按下音量減少鍵和電源按鍵就會觸發截屏事件(國內定製機做個修改的這裏就不做考慮了)。那麼這裏的截屏事件是如何觸發的呢?觸發之後android系統是如何實現截屏操作的呢?帶着這兩個問題,開始我們的源碼閱讀流程。 我們知道這裏的截屏事件是通過我們的按鍵操作觸發的,所以這…

android源碼解析(二十七)–>HOME事件流程

上一篇文章中我們介紹了android系統的截屏事件,事件的處理邏輯不是在App中執行而是在PhoneWindowManager中執行,而本文我們現在主要講解android系統中HOME按鍵的事件處理,和截屏事件類似,這裏的HOME按鍵應該都是系統級別的按鍵事件監聽,所以其處理事件的邏輯也應該和截屏事件處理流程類似,HOME按鍵的處理邏輯也是在PhoneWindowManager的…

android源碼解析(二十八)–>電源開關機按鍵事件流程

和截屏按鍵、HOME按鍵的處理流程類似,電源按鍵由於也是系統級別的按鍵,所以對其的事件處理邏輯是和截屏按鍵、HOME按鍵類似,不在某一個App中,而是在PhoneWindowManager的dispatchUnhandledKey方法中。所以和前面兩篇類似,這裏我們也是從PhoneWindowManager的dispatchUnhandledKey方法開始我們今天電源開關機按鍵的事件流程分析…

android源碼解析(二十九)–>應用程序返回按鍵執行流程

從這篇文章中我們開始分析android系統的事件分發流程,其實網上已經有了很多關於android系統的事件分發流程的文章,奈何看了很多但是印象還不是很深,所以這裏總結一番。 android系統的事件分發流程分爲很多部分: - Native層 –> ViewRootImpl層 –> DecorView層 –> Activity層 –> ViewGroup層 –> View層…

android源碼解析(三十)–>觸摸事件分發流程

前面一篇文章中我們分析了App返回按鍵的分發流程,從Native層到ViewRootImpl層到DocorView層到Activity層,以及在Activity中的dispatchKeyEvent方法中分發事件,最終調用了Activity的finish方法,即銷燬Activity,所以一般情況下假如我們不重寫Activity的onBackPress方法或者是onKeyDown方法,當我們按下並擡起…

讓堅持成爲一種習慣,慢慢努力中!!!


本系列文章以同步至github中:https://github.com/yipianfengye/androidSource,歡迎star和follow

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章