(連載)Android 8.0 : 如何下載和閱讀Android源碼

這是一個連載的博文系列,我將持續(xù)為大家提供盡可能透徹的Android源碼分析 github連載地址

前言

閱讀Android源碼的好處有很多,可以加深我們對系統(tǒng)的了解,可以參考牛人優(yōu)雅的代碼實現(xiàn),可以從根本上找出一些bug的原因...我們應該慶幸Android是開源的,所有的功能都可以看到實現(xiàn),所有的bug都能追蹤溯源。

我想大家或多或少聽說過Android源碼開源項目,即AOSP(Android Open Source Project) ,有些人可能還不知道如何下載AOSP,有些人雖然下載下來了,但是面對龐大的Android源碼項目又望而卻步,不知道從哪兒下手。

所以本文將從以上兩個問題出發(fā),具體講解如何下載和閱讀Android系統(tǒng)源碼。

一、如何下載AOSP

源碼下載是我們分析源碼的開始,Android源碼可以全量下載,也可以單個下載,我們先介紹全量下載

1.1 全量下載

官方文檔 ,只要按照上面一步步做就可以了,但是由于需要翻墻,國內無法直接訪問,而整個Android項目源碼巨大,即便是翻墻后下載也很慢,所以還是使用國內鏡像比較好。

我推薦清華大學開源鏡像,地址 ,這上面也是有完整的教程,我就不復制粘貼了,但是有一點要注意,你一定要備一個比較大的磁盤,至少60個G吧,還不算后期編譯的。

我們分析源碼其實是不需要全部代碼的,因為AOSP不僅包括系統(tǒng)源碼,還有些工具代碼,如aapt,adb等,這些我們根本不需要,而且即便是系統(tǒng)源碼,也不是所有我們都需要看,如果真的全部看,你這輩子都看不完,所以我還是推薦大家單個下載。

1.2 單個下載

官方地址 ,比如我們要下載platform/frameworks/base/目錄下的代碼,我們可以git clone https://android.googlesource.com/platform/frameworks/base ,不過這個還是會遇到翻墻的問題,當然我們也可以用鏡像。

鏡像地址 ,比如我們要下載platform/frameworks/base/目錄,就用git clone https://aosp.tuna.tsinghua.edu.cn/platform/frameworks/base ,如果你帶寬夠的話,一般幾分鐘就可以下載好你想要的單個源碼了。

如果你想下載單個文件,或者搜索文件名及代碼,可以訪問 http://androidxref.com/ ,這里有部分Android的源碼

1.3 AOSP目錄結構

先上一張圖,整個Android項目的架構圖


我們都知道Android系統(tǒng)從上到下大致分為這四層,所以我們以這四層為基礎,講解下AOSP的目錄結構:

  • 第一層:應用程序層(applications)對應根目錄下 platform/packages/apps
  • 第二層:應用程序框架層(application framework)對應根目錄下的 platform/frameworks
  • 第三層:運行庫層包括運行庫(libraries)和android運行時環(huán)境(android runtime)
  • libraries對應目錄很多,其中l(wèi)ibc庫對應的是 platform/bionic
  • android運行時環(huán)境,Core Libraries 對應根目錄下的 platform/libcore,Dalvik Virtual Machine 對應根目錄下的 platform/dalvik ,不過現(xiàn)在已經(jīng)是ART了,所以目錄是 platform/art
  • 第四層:Linux內核層對應根目錄下的 kernel,每一個目錄對應了一個kernel的版本,因為Android要兼容各種芯片,下面羅列一下:
  • goldfish 項目包含適用于所模擬的平臺的內核源代碼。
  • msm 項目包含適用于 ADP1、ADP2、Nexus One、Nexus 4、Nexus 5、Nexus 6、Nexus 5X、Nexus 6P、Nexus 7 (2013)、Pixel 和 Pixel XL 的源代碼,可用作使用 Qualcomm MSM 芯片組的起點。
  • omap 項目用于 PandaBoard 和 Galaxy Nexus,可用作使用 TI OMAP 芯片組的起點。
  • samsung 項目用于 Nexus S,可用作使用 Samsung Hummingbird 芯片組的起點。
  • tegra 項目用于 Xoom、Nexus 7 (2012)、Nexus 9,可用作使用 NVIDIA Tegra 芯片組的起點。
  • exynos 項目包含適用于 Nexus 10 的內核源代碼,可用作使用 Samsung Exynos 芯片組的起點。
  • x86_64 項目包含適用于 Nexus Player 的內核源代碼,可用作使用 Intel x86_64 芯片組的起點。
  • hikey-linaro 項目用于 HiKey 參考板,可用作使用 HiSilicon 620 芯片組的起點。
  • 第三層和第四層中間還有個硬件抽象層(HAL)對應根目錄下的 platform/hardware

目前我下載的目錄如下:

git clone https://aosp.tuna.tsinghua.edu.cn/platform/packages/apps/Launcher2

git clone https://aosp.tuna.tsinghua.edu.cn/platform/frameworks/base

git clone https://aosp.tuna.tsinghua.edu.cn/platform/frameworks/native

git clone https://aosp.tuna.tsinghua.edu.cn/platform/system/core

git clone https://aosp.tuna.tsinghua.edu.cn/platform/bionic

git clone https://aosp.tuna.tsinghua.edu.cn/platform/libcore

git clone https://aosp.tuna.tsinghua.edu.cn/platform/art

git clone https://aosp.tuna.tsinghua.edu.cn/kernel/msm

二、如何閱讀AOSP

當我們把源碼下載下來之后,會感到茫然無措,因為AOSP的源碼實在是太多了,這里我們需要明確一些問題:

  • 要閱讀哪些源碼
  • 閱讀源碼的順序和方式
  • 用什么工具來閱讀

下面我將從這三個問題一一展開

2.1 要閱讀哪些源碼

這個問題是比較個性化的,因為不同的人從事著不同的工作,有的人從事應用開發(fā),可能對Java層東西感興趣;有的人從事Framework開發(fā),可能對Framework層感興趣;有的從事硬件開發(fā),可能對底層實現(xiàn)感興趣。

這個都因人而異,但是有一點,不能盲目地毫無目的地看源碼,因為這樣的話最終你會淹沒在AOSP的大海里,看了一年半截啥都看了,卻又感覺都沒看透,別人問你源碼的東西,都能說個一二,但是一往深了說,就不知所以了。

所以對于AOSP源碼,不在于多,而在于精,你不要試圖把所有的源碼都看懂,你只要對自己感興趣的那部分深入研究就可以,因為即便是Google工程師也不可能把AOSP全部讀完。

對于我而言,我是從事應用層開發(fā)的,我主要會了解以下幾個方面的源碼:

  • Android系統(tǒng)啟動流程,應用啟動流程,四大組件啟動流程,這將列入系統(tǒng)啟動篇
  • 系統(tǒng)常用服務ActivityManagerService,WindowManagerService等,這將列入系統(tǒng)服務篇
  • 通信機制,主要是Binder和Handler,這將列入通信篇
  • 進程和線程的創(chuàng)建,運行,銷毀,這將列入進程篇
  • View的繪制和顯示流程,事件分發(fā)機制,這將列入圖形繪制篇
  • Android虛擬機ART運行機制,類加載機制,Java注解,Java反射,這將列入虛擬機篇
  • Android對于Java集合的優(yōu)化算法,這將列入Java基礎篇

2.2 閱讀源碼的順序和方式

2.2.1 閱讀順序

讀源碼是一個日積月累的過程,不可能一蹴而就,當我們列出自己感興趣的源碼后,我們需要制定一個閱讀計劃,先讀什么再讀什么。這個也是因人而異,根據(jù)自己的興趣來就是,你最想讀什么,那就排前面。

我一直在說興趣,因為興趣是最好的老師,只有你對一樣東西感興趣了,才會有動力去學,去研究,才會不覺得累,如果一開始就去啃一些你不感興趣的東西,到頭來也是乏味不專注的,理解的程度也是不深,而且很有可能失去信心,最后放棄閱讀。

當然,如果你對好幾樣東西都感興趣,那就有一些原則了:

  • 事物都講究先后,就像樹木扎根大地一樣,先有大地,才有樹木,基礎的東西先看
  • 相互有關聯(lián)的東西一起看,不要一會兒看系統(tǒng)啟動,突然又去看事件分發(fā)什么的

2.2.2 閱讀方式

Android系統(tǒng)涵蓋的范圍很廣,從上層的應用程序,到Framework,再到Libraries以至硬件,從Java層到C++,就像一座幾十層的大廈一樣,每層都有樓梯,也有電梯,我們需要做的就是在大廈里上下穿梭。

當我們閱讀某一個知識點源碼的時候,不同的知識點有不同的閱讀方式,有些適合從下往上讀,比如系統(tǒng)啟動流程,我是從事件開始的地方開始讀,從init.cpp開始,然后到zygote進程,到Java虛擬機,最后到Luncher;

有些適合從上往下讀,比如Activity的啟動,我是從startActivity方法開始讀,然后到ActivityThread,然后到ActivityManagerService;

有些適合兩頭從中間讀,比如Binder,我是從Java層看到C++層,但是看到驅動那兒看不動了,然后就從接收Binder的地方往回看,最后在兩端集中在驅動的地方前后對比,才將Binder看通。

這里還是有個好的方式,就是從事件觸發(fā)的地方開始看是比較合適的。

2.3 用什么工具來閱讀

Android 源碼閱讀神器當然是Source Insight


Source Insight的好處:

  • 支持方法跳轉,類跳轉,并且對C++支持很好
  • 支持文件搜索,java,c++,xml都支持,并且支持內容搜索
  • 支持一鍵導入,隨時配置路徑
  • 而且最重要的,導入文件數(shù)多的時候不卡

下面我講講如何使用Source Insight

2.3.1 下載安裝Source Insight

下載地址 http://download.csdn.net/download/foxlee1991/9882553 ,我還專門配置了一個跟Android Studio一樣的Darcula主題,下載地址 http://download.csdn.net/download/foxlee1991/9882535

2.3.2 導入AOSP源碼

我目前還沒有下載完整的AOSP源碼,只是先下載了幾個重要的源碼。打開Source Insight,選擇Project -> New Project,取個名字比如叫AOSP,點擊OK

選擇你要查看的源碼目錄,點擊OK

選擇需要將哪些目錄下的源碼導入,點擊Add Tree

導入成功后會有很多文件列在下方,點擊Close

2.3.3查看源碼

現(xiàn)在進入項目還是一片空白,需要把工具欄打開,然后就可以看源碼了

左邊是方法和成員變量搜索,右邊Project File是搜索類名,Project Symbol是內容搜索

還有一些快捷鍵,比如Ctrl+左鍵可以方法跳轉,左上角有前進和后退,Ctrl+G 是跳轉到指定行,Ctrl+F 搜索內容,有時我們會遇到方法無法跳轉,這時我們需要點擊Project,選擇Synchronize Files,全局關聯(lián)一下,如圖

這里要注意導入的文件不要太多,太多會導致Synchronize失敗,我們可以選擇性地導入一些目錄

我們在導入源碼的時候,有時一些匯編的源碼(以.s或.S結尾)無法導入,這時我們需要點擊Options,選擇File Type Options,在C/C++里添加.s和.S的支持,然后Close,如圖

然后我們重新追加一些目錄,點擊Project,選擇Add and Remove Projec Files,選擇對應目錄Add Tree即可,同時我們也可以選擇Remove Tree刪除對應目錄源碼,操作如下

三、 其他

在真正開始閱讀Android源碼之前,最好是去了解一些C/C++的語法知識,因為源碼核心的部分都是用C/C++寫的,如果你對一些基礎語法不太了解,會看得云里霧里的,這里我給大家推薦兩本書《C標準庫 中文版》《C++標準庫 中文第2版》,另外一些學習網(wǎng)站也不錯:

我自己本身也剛開始閱讀Android源碼,準備整理一些閱讀筆記,我在github上建了項目,會把筆記以issue的方式展示,方便大家交流,另外我會把閱讀的一些源碼拷貝到Android Studio項目中,保持原有目錄結構,方便大家看筆記時找到對應的源碼,項目地址

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,030評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,310評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,951評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,796評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,566評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,055評論 1 322
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,142評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,303評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,799評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,683評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,899評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,409評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,135評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,520評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,757評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,528評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,844評論 2 372

推薦閱讀更多精彩內容