1. 程式人生 > >Android原始碼解析系列

Android原始碼解析系列

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

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

在分析Android原始碼的過程中我更希望以一種有序的分析過程來分framework的原始碼,這裡我簡單的以以下的原始碼流程來分析:

  • 非同步訊息機制原始碼

  • 系統核心程序啟動流程原始碼

  • 應用程序啟動流程原始碼

  • apk解析與安裝流程原始碼

  • Activity啟動銷燬流程原始碼

  • Activity繪製與銷燬繪製流程原始碼

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

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

  • 系統按鍵處理流程原始碼

  • Service啟動銷燬流程原始碼

  • BroadcastReceiver流程原始碼

  • ContextProvider流程原始碼

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

平時開發過程中我們通過Android studio編寫完成Android專案之後直接點選 Run ‘app’就可以在build/outputs/apk生成可以在Android裝置中安裝的apk檔案了,那麼整個Android原始碼的構建過程是怎麼樣的呢?…

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

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

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

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

本文我們將介紹一下Android中的日誌API,其主要是我們即將需要介紹的Log物件,它位於Android framework層utils包下,是一個final class類:檢視其具體定義…

Android開發過程中經常會用到快取,現在主流的app中圖片等資源的快取策略一般是分兩級,一個是記憶體級別的快取,一個是磁碟級別的快取。 作為Android系統的維護者google也開源了其快取方案,LruCache和DiskLruCache。從Android3.1開始LruCache已經作為Android原始碼的一部分維護在Android系統中,為了相容以前的版本Android的support-…

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

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

Launcher程式就是我們平時看到的桌面程式,它其實也是一個Android應用程式,只不過這個應用程式是系統預設第一個啟動的應用程式,這裡我們就簡單的分析一下Launcher應用的啟動流程。不同的手機廠商定製Android作業系統的時候都會更改Launcher的原始碼,我們這裡以Android23的原始碼為例大致的分析一下Launcher的啟動流程。 通過上一篇文章,我們知道SystemSe…

每一個Android應用預設都是在他自己的linux程序中執行。Android作業系統會在這個Android應用中的元件需要被執行的時候啟動這個應用程序,並且會在這個應用程序沒有任何元件執行或者是系統需要為其他應用申請更多記憶體的時候殺死這個應用程序。所以當我們需要啟動這個應用的四大元件之一的時候如果這個應用的程序還沒有啟動,那麼就會先啟動這個應用程式程序。本節主要是通過分析Activity的啟動過程介紹應用程式程序的啟動流程…

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

對產品研發技術,android原始碼實踐,Github專案解析方面感興趣的同學可以參考我的:

相關推薦

Android原始碼解析系列

知乎上看了一篇非常不錯的博文:有沒有必要閱讀Android原始碼 看完之後痛定思過,平時所學往往是知其然然不知其所以然,所以為了更好的深入Android體系,決定學習Android framework層原始碼。這篇文章就是原始碼學習的彙總篇,包含學習原始碼

Android熱更新開源專案Tinker原始碼解析系列之一:Dex熱更新

Tinker是微信的第一個開源專案,主要用於安卓應用bug的熱修復和功能的迭代。 Tinker github地址:https://github.com/Tencent/tinker 首先向微信致敬,感謝毫無保留的開源出了這麼一款優秀的熱更新專案。

【Android7.1.2原始碼解析系列android init目錄下的Android.mk編譯檔案分析

上一篇文章對於原始碼中的安卓編譯系統文件進行了翻譯,本文就以android當中的init模組作為例子,對其中的Android.mk檔案進行分析,讀者可以在閱讀本文的同時檢視我的譯文:http://blog.csdn.net/class_brick/article/detai

Android原始碼解析Window系列第(一)篇---Window的基本認識和Activity的Window建立過程

您可能聽說過View ,ViewManager,Window,PhoneWindow,WindowManager,WindowManagerService,可是你知道這幾個類是什麼關係,幹嘛用的。概括的來說,View是放在Window中的,Window是一個抽象

Android原始碼解析之應用程式資源管理器(Asset Manager)的建立過程分析

轉載自:https://blog.csdn.net/luoshengyang/article/details/8791064 我們分析了Android應用程式資源的編譯和打包過程,最終得到的應用程式資源就與應用程式程式碼一起打包在一個APK檔案中。Android應用程式在執行的過程中,是通過一個

Android原始碼解析】View.post()到底幹了啥

本篇文章已授權微信公眾號 guolin_blog (郭霖)獨家釋出 emmm,大夥都知道,子執行緒是不能進行 UI 操作的,或者很多場景下,一些操作需要延遲執行,這些都可以通過 Handler 來解決。但說實話,實在是太懶了,總感覺寫 Handler 太麻煩了,一不小心又很容

rxJava和rxAndroid原始碼解析系列四之subscribeOn和observeOn的理解(學習終結篇)

本篇文章主要解決subscribeOn和observeOn這兩個方法為什麼subscribeOn只有一次有效果,observeOn切換多次回撥的都有效果。 不知道朋友有沒有看過rxandroid的原始碼,如果看過的話,就會迎刃而解,沒什麼疑慮啦。沒看過原始碼的朋友,可以看看我這個系列的前幾篇文章

Java原始碼解析系列(二)ArrayList原始碼解析

備註:以下都是基於JDK8 原始碼分析 ArrayList簡介        ArrayList 是一個數組佇列,相當於 動態陣列。與Java中的陣列相比,它的容量能動態增長。它繼承於AbstractList,實現了List, RandomAccess, Clonea

rxJava和rxAndroid原始碼解析系列二之observer訂閱

建立完Observable物件後,以後一步ObservableObserveOn.subscribe(new Observer<String>() {.....})這一步又發生了什麼呢? 接著跟蹤原始碼。 @SchedulerSupport(Schedu

Android 原始碼解析 之 setContentView

                大家在平時的開發中,對於setContentView肯定不陌生,那麼對其內部的實現會不會比較好奇呢~~~有幸終於能看到一些PhoneWindow神馬的原始碼,今天就帶大家來跑一回原始碼~~1、Activity  setContentView首先不用說,進入Activity的se

Ali-Wax使用和原始碼解析系列-Wax的整合和除錯環境搭建

那些多餘的話 在ios平臺的基礎框架中,程式碼的直接動態部署一直是一個無法解決的問題,所以我們只能退而求其次,通過建立指令碼語言和OC的bridge來實現動態更新的目標。在這個方向上,wax-lua框架是第一個解決方案,但是隨著wax-lua作者的放棄維護,w

Android原始碼解析之(十)-->Launcher啟動流程

上一篇文章中我們講解了關於SystemServer程序相關的知識,我們知道SystemServer程序主要用於啟動系統的各種服務,二者其中就包含了負責啟動Launcher的服務,LauncherAppService。具體更多關於SystenServer的啟動

Android原始碼解析之(十三)-->apk安裝流程

上一篇文章中給大家分析了一下android系統啟動之後呼叫PackageManagerService服務並解析系統特定目錄,解析apk檔案並安裝的過程,這個安裝過程實際上是沒有圖形介面的,底層呼叫的是我們平時比較熟悉的adb命令,那麼我們平時安裝apk檔案的

Seajs原始碼解析系列(一)

前言:以前在做webgis開發的時候,就對dojo的模組化載入方式很好奇,一直想弄清楚它的實現原理,奈何其框架過於龐大,加上自己也懶,就一直沒有深入進行研究。這段時間接觸了Sea.js,淘寶前端大牛玉伯寫的。它遵循的是CMD的載入規範,據說可以像Node一樣

Android原始碼解析之(十一)-->應用程序啟動流程

本節主要是通過分析Activity的啟動過程介紹應用程式程序的啟動流程。關於Android的應用程序在android guide中有這樣的一段描述: By default, every application runs in its own Linu

Android原始碼解析(二十九)-->應用程式返回按鍵執行流程

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

Android原始碼解析之(五)-->IntentService

上一篇文章中我們講解了HandlerThread,其本質上是一個Thread,只不過內部定義了其自身的Looper和MessageQueue。為了讓多個執行緒之間能夠方便的通訊,我們會使用Handler實現執行緒間的通訊。這個時候我們手動實現的多執行緒+Ha

TiKV 原始碼解析系列 - Raft 的優化

本系列文章主要面向 TiKV 社群開發者,重點介紹 TiKV 的系統架構,原始碼結構,流程解析。目的是使得開發者閱讀之後,能對 TiKV 專案有一個初步瞭解,更好的參與進入 TiKV 的開發中。本文是本系列文章的第六章節。重點介紹 TiKV 中 Raft 的優化。 在分散式領域,為了保證資料的一致性,通常都

TiKV 原始碼解析系列——如何使用 Raft

本系列文章主要面向 TiKV 社群開發者,重點介紹 TiKV 的系統架構,原始碼結構,流程解析。目的是使得開發者閱讀之後,能對 TiKV 專案有一個初步瞭解,更好的參與進入 TiKV 的開發中。 需要注意,TiKV 使用 Rust 語言編寫,使用者需要對 Rust 語言有一個大概的瞭解。另外,本系列文章並不

Android原始碼解析(十九)-->Dialog載入繪製流程

前面兩篇文章,我們分析了Activity的佈局檔案載入、繪製流程,算是對整個Android系統中介面的顯示流程有了一個大概的瞭解,其實Android系統中所有的顯示控制元件(注意這裡是控制元件,而不是元件)的載入繪製流程都是類似的,包括:Dialog的載入繪