1. 程式人生 > >(連載)Android系統原始碼分析--如何下載和閱讀Android原始碼

(連載)Android系統原始碼分析--如何下載和閱讀Android原始碼



> ** 這是一個連載的博文系列,我將持續為大家提供儘可能透徹的Android原始碼分析 [github連載地址](https://github.com/foxleezh/AOSP)**


## 前言


閱讀Android原始碼的好處有很多,可以加深我們對系統的瞭解,可以參考牛人優雅的程式碼實現,可以從根本上找出一些bug的原因...我們應該慶幸Android是開源的,所有的功能都可以看到實現,所有的bug都能追蹤溯源。


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


所以本文將從以上兩個問題出發,具體講解如何下載和閱讀Android系統原始碼。


## 一、如何下載AOSP
原始碼下載是我們分析原始碼的開始,Android原始碼可以全量下載,也可以單個下載,我們先介紹全量下載
### 1.1 全量下載
[官方文件](https://source.android.com/source/downloading) ,只要按照上面一步步做就可以了,但是由於需要翻牆,國內無法直接訪問,而整個Android專案原始碼巨大,即便是翻牆後下載也很慢,所以還是使用國內映象比較好。


我推薦清華大學開源映象,[地址](https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/) ,這上面也是有完整的教程,我就不復制貼上了,但是有一點要注意,你一定要備一個比較大的磁碟,至少60個G吧,還不算後期編譯的。


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


### 1.2 單個下載
[官方地址]( https://android.googlesource.com/) ,比如我們要下載platform/frameworks/base/目錄下的程式碼,我們可以git clone https://android.googlesource.com/platform/frameworks/base ,不過這個還是會遇到翻牆的問題,當然我們也可以用映象。


[映象地址]( https://aosp.tuna.tsinghua.edu.cn/) ,比如我們要下載platform/frameworks/base/目錄,就用git clone https://aosp.tuna.tsinghua.edu.cn/platform/frameworks/base ,如果你頻寬夠的話,一般幾分鐘就可以下載好你想要的單個原始碼了。


如果你想下載單個檔案,或者搜尋檔名及程式碼,可以訪問 http://androidxref.com/ ,這裡有部分Android的原始碼


### 1.3 AOSP目錄結構


先上一張圖,整個Android專案的架構圖
![](https://user-gold-cdn.xitu.io/2017/10/22/2a01f36d8e89311aea19ff5e849b1334)


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


- 第一層:應用程式層(applications)對應根目錄下 [platform/packages/apps](https://android.googlesource.com/platform/packages/apps)
- 第二層:應用程式框架層(application framework)對應根目錄下的 [platform/frameworks](https://android.googlesource.com/platform/frameworks)
- 第三層:執行庫層包括執行庫(libraries)和android執行時環境(android runtime)
 - libraries對應目錄很多,其中libc庫對應的是 [platform/bionic](https://android.googlesource.com/platform/bionic)
 - android執行時環境,Core Libraries 對應根目錄下的 [platform/libcore](https://android.googlesource.com/platform/libcore),Dalvik Virtual Machine 對應根目錄下的 [platform/dalvik](https://android.googlesource.com/platform/dalvik) ,不過現在已經是ART了,所以目錄是 [platform/art](https://android.googlesource.com/platform/art)
- 第四層:Linux核心層對應根目錄下的 [kernel](https://android.googlesource.com/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](https://android.googlesource.com/platform/hardware)




目前我下載的目錄如下:


git clone https://aosp.tuna.tsinghua.edu.cn/platform/packages/apps/Launcher2 <br>
git clone https://aosp.tuna.tsinghua.edu.cn/platform/frameworks/base <br>
git clone https://aosp.tuna.tsinghua.edu.cn/platform/frameworks/native <br>
git clone https://aosp.tuna.tsinghua.edu.cn/platform/system/core <br>
git clone https://aosp.tuna.tsinghua.edu.cn/platform/bionic <br>
git clone https://aosp.tuna.tsinghua.edu.cn/platform/libcore <br>
git clone https://aosp.tuna.tsinghua.edu.cn/platform/art <br>
git clone https://aosp.tuna.tsinghua.edu.cn/kernel/msm <br>


## 二、如何閱讀AOSP


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


* 要閱讀哪些原始碼
* 閱讀原始碼的順序和方式
* 用什麼工具來閱讀


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


### 2.1 要閱讀哪些原始碼


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


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


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


對於我而言,我是從事應用層開發的,我主要會了解以下幾個方面的原始碼:


* Android系統啟動流程,應用啟動流程,四大元件啟動流程,這將列入系統啟動篇
* 系統常用服務ActivityManagerService,WindowManagerService等,這將列入系統服務篇
* 通訊機制,主要是Binder和Handler,這將列入通訊篇
* 程序和執行緒的建立,執行,銷燬,這將列入程序篇
* View的繪製和顯示流程,事件分發機制,這將列入圖形繪製篇
* Android虛擬機器ART執行機制,類載入機制,Java註解,Java反射,這將列入虛擬機器篇
* Android對於Java集合的優化演算法,這將列入Java基礎篇


### 2.2 閱讀原始碼的順序和方式


#### 2.2.1 閱讀順序
讀原始碼是一個日積月累的過程,不可能一蹴而就,當我們列出自己感興趣的原始碼後,我們需要制定一個閱讀計劃,先讀什麼再讀什麼。這個也是因人而異,根據自己的興趣來就是,你最想讀什麼,那就排前面。


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


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


* 事物都講究先後,就像樹木紮根大地一樣,先有大地,才有樹木,基礎的東西先看
* 相互有關聯的東西一起看,不要一會兒看系統啟動,突然又去看事件分發什麼的


#### 2.2.2 閱讀方式
Android系統涵蓋的範圍很廣,從上層的應用程式,到Framework,再到Libraries以至硬體,從Java層到C++,就像一座幾十層的大廈一樣,每層都有樓梯,也有電梯,我們需要做的就是在大廈裡上下穿梭。


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


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


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


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


### 2.3 用什麼工具來閱讀


Android 原始碼閱讀神器當然是Source Insight 
![](https://user-gold-cdn.xitu.io/2017/10/22/a019c246abe07588b268a6cd5121abe4)


Source Insight的好處:


* 支援方法跳轉,類跳轉,並且對C++支援很好
* 支援檔案搜尋,java,c++,xml都支援,並且支援內容搜尋
* 支援一鍵匯入,隨時配置路徑
* 而且最重要的,匯入檔案數多的時候不卡


下面我講講如何使用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


![](https://user-gold-cdn.xitu.io/2017/10/22/20c7c0c82f101c3cb4774520d1c00f12)


選擇你要檢視的原始碼目錄,點選OK


![](https://user-gold-cdn.xitu.io/2017/10/22/31cc58c01f677c51031112fa153443a7)


選擇需要將哪些目錄下的原始碼匯入,點選Add Tree


![](https://user-gold-cdn.xitu.io/2017/10/22/ec0b3797043ae23c16130d54699bc63a)




匯入成功後會有很多檔案列在下方,點選Close


![](https://user-gold-cdn.xitu.io/2017/10/22/ac5852168aeced2ce3f1336b162d1c6d)




#### 2.3.3檢視原始碼
現在進入專案還是一片空白,需要把工具欄開啟,然後就可以看原始碼了


![](https://user-gold-cdn.xitu.io/2017/10/22/f0a9f669f2cc03443fbe6c8b48fc5992)




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


![](https://user-gold-cdn.xitu.io/2017/10/22/e7b87f4d05760aff0b165b4db7589289)




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


![](https://user-gold-cdn.xitu.io/2017/10/22/ff418cbb48cac2dc7838112ec19a6a94)


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


我們在匯入原始碼的時候,有時一些彙編的原始碼(以.s或.S結尾)無法匯入,這時我們需要點選Options,選擇File Type Options,在C/C++裡新增.s和.S的支援,然後Close,如圖


![](https://user-gold-cdn.xitu.io/2017/10/22/70f33f9420c383049472518a92cdfe55)


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


![](https://user-gold-cdn.xitu.io/2017/10/22/1b336d4a384ca45fff22f3c7593219ad)




## 三、 其他


在真正開始閱讀Android原始碼之前,最好是去了解一些C/C++的語法知識,因為原始碼核心的部分都是用C/C++寫的,如果你對一些基礎語法不太瞭解,會看得雲裡霧裡的,這裡我給大家推薦兩本書[《C標準庫 中文版》](http://download.csdn.net/download/foxlee1991/10033921)和[《C++標準庫 中文第2版》](http://download.csdn.net/download/foxlee1991/10034335),另外一些學習網站也不錯:


- [微軟官方](https://msdn.microsoft.com/zh-cn/library/cscc687y.aspx)
- [菜鳥教程](http://www.runoob.com/cplusplus/cpp-tutorial.html)
- [W3Cschool](https://www.w3cschool.cn/cpp/)


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


>關於我


- foxleezh
- [我的部落格](http://foxleezh.me)
- [github](https://github.com/foxleezh/)
- [郵箱
[email protected]
]([email protected])

相關推薦

(連載)Android系統原始碼分析--如何下載閱讀Android原始碼

> ** 這是一個連載的博文系列,我將持續為大家提供儘可能透徹的Android原始碼分析 [github連載地址](https://github.com/foxleezh/AOSP)** ## 前言 閱讀Android原始碼的好處有很多,可以加深我們對系統的瞭解,可

(轉載)Android模擬器-Genymotion的下載新增Android虛擬系統

原地址:http://blog.csdn.net/fengshuiyue/article/details/50875210 Genymotion是一款模擬Android系統很不錯的軟體,其顯著的特點就是加快了Android系統的模擬速度,讓我們可以在電腦上體驗到使用手機

Android 在ubuntu上下載編譯系統原始碼

網上也有很多這樣的教程,這裡只是把它記錄下來,方便日後檢視。 下載原始碼 分為以下幾個步驟: 1、配置安裝下載環境   配置 JDK環境   安裝curl、git-core軟體  sudo apt-get install curl  sudo apt-get inst

Java分散式跟蹤系統Zipkin(二):Brave原始碼分析-TracerSpan

Brave是Java版的Zipkin客戶端,它將收集的跟蹤資訊,以Span的形式上報給Zipkin系統。 (Zipkin是基於Google的一篇論文,名為Dapper,Dapper在荷蘭語裡是“勇敢的”的意思,這也是Brave的命名的原因) 我們一般

Android 之 三級快取(記憶體!!!、本地、網路)及記憶體LruCache擴充套件 及原始碼分析--- 學習程式碼講解

一. 三級快取簡介 如上圖所示,目前App中UI介面經常會涉及到圖片,特別是像“今日關注”新聞這類app中,圖片運用的機率十分頻繁。當手機上需要顯示大量圖片類似listView、gridView控制元件並且使用者會上下滑動,即將瀏覽過的圖片又載入一遍,

Java分散式跟蹤系統Zipkin(五):Brave原始碼分析-BraveSpringMVC整合

上一篇博文中,我們分析了Brave是如何在普通Web專案中使用的,這一篇博文我們繼續分析Brave和SpringMVC專案的整合方法及原理。 我們分兩個部分來介紹和SpringMVC的整合,及XML配置方式和Annotation註解方式 pom.xml新

Android原始碼分析BitmapBitmapFactory常用API

Bitmap recycle() 呼叫nativeRecycle()釋放該bitmap分配的native物件,清除對畫素資料的引用。不會同步的釋放畫素資料,只是簡單的允許bitmap在沒有其他引用時被垃圾回收。此bitmap被標記為dead,意味著呼叫get

Android 8.0系統原始碼分析--相機createCaptureSession建立過程原始碼分析

     上一次我們詳細分析了openCamera啟動過程的原始碼,從CameraServer程序建立了很多物件,比如CameraDeviceClient、Camera3Device、FrameProcessorBase,而真正開啟相機還是在驅動層中上電後才完成的,有時候真想

一般Web單元系統分析流程思路

一。Web 專案的思路 二。驗證流程: 我們來使用打點方式,驗證如上圖流程: 選擇一個專案: 在上圖中的邏輯步驟中打上斷點, 如下圖: 按照一般的web 流程先執行1 呼叫2,2 呼叫3 ,最後返回結果檢視。 spring 注入: 如下為驗證:

QTrace--Android系統除錯分析的利器(4)

QTrace的遠端程式碼檢視與搜尋        這個功能簡單的說:就是OpenGrok的客戶端。OpenGrok不用網頁上搜索與檢視程式碼,可以讓OpenGrok像原生代碼一樣搜尋與檢視。該功能主要使用場景有兩個:     &

QTrace--Android系統除錯分析的利器(2)

LogCat指令碼分析 QTrace為了方便指令碼處理,提供瞭如下幾個基礎功能: 1)QTrace將所有的log是放在資料庫中的,這樣查詢速度很快,並且可以按照不同的欄位進行查詢。 2)QTrace提供了資料圖形化顯示的基礎框架。可以方便的將資料圖形化。 3)QTrace的指令碼有介

QTrace--Android系統除錯分析的利器(1)

    QTrace為一個專為Android系統除錯而開發的IDE。與Android Studio不同,QTrace更關注與Android系統的除錯與分析,以及無原始碼情況下的程式執行分析。           QT

dubbo原始碼分析-Directory LoadBalance-筆記

Directory 訂閱節點的變化, 當zookeeper上指定節點發生變化以後,會通知到RegistryDirectory的notify方法 將url轉化為invoker物件 呼叫過程中invokers的使用 StaticDirectory: 靜態目

Android開發,分析 finish() onBackPressed() 的區別

Android開發,分析 finish() 和 onBackPressed() 的區別 finish(),最常用來關閉 Actiivty 的方法。 onBackPressed(),Android 點選返回按鍵的方法。 一般來說這兩個方法作用是一致的。

Wifi模組—原始碼分析配置AP(Android P)

一 前言         當用戶在WifiSettings介面選擇了一個AP,會顯示配置AP引數的對話方塊,當用戶在對話方塊中選擇好加密方式和輸入密碼之後,點選連線按鈕,Android就會去連線這個AP。可以先會看前面的wifi的掃描過程。  ScanResu

chromium原始碼下載編譯三

chromium生成編譯工程檔案需要用到gn,但是gn又在chromium的依賴庫中需要gclient來下載,這是需要翻牆的,於是在github上搜索了一下gn,真的找到了一些原始碼映象,但是發現其編譯過程還是需要gn,這變成了蛋雞問題了,於是在網上找了一個最新的gn可執行檔

原始碼分析commitAllowingStateLoss() commit()的區別

之前在使用Fragment的時候偶爾會有這麼一個報錯,Can not perform this action after onSaveInstanceState,意思為無法再onSaveInstanceState之後執行該操作,這個操作就是指commit(),之前也沒怎麼在意

JDK原始碼分析—— ArrayBlockingQueue LinkedBlockingQueue

招賢納士: 我們叫數瀾 我們核心技術團隊來自阿里、華為、金蝶、移動、GE等 我們獲得來自阿里巴巴集團聯合創始人、湖畔山南總裁謝世煌、IDG合夥人牛奎光、洪泰等投資 我們的官網:https://www.dtwave.com 我們提供:期權、五險一金、試用期全薪、商業保險、免

Openwrt研習筆記三之原始碼下載編譯

哎呀,昨天拉下一天的筆記沒寫,不過這也不能怪我,是我的網站伺服器出問題了,釋出不了….今天補上昨天的內容 上一篇說到刷TL-WR703N的系統成openwrt,那些都是網上搜羅的,按照著做就好了,先學習才能進步嘛 今天要記錄的內容有:下載原始碼,ubuntu13.04下編譯原始碼 下載原始碼

Android系統system使用者許可權root許可權的獲取

在Android系統中,系統為每一個應用程式(apk)建立了一個使用者和組。這個使用者和組都是受限使用者,不能訪問系統的資料,只能訪問自己的檔案和目錄,當然它也不能訪問其他應用程式的資料。這樣設計可以儘可能地保護應用程式的私有資料,增強系統的安全性和健壯性。