Android 7 原始碼分析系列導讀

蘇策發表於2019-03-04

關於作者

郭孝星,程式設計師,吉他手,主要從事Android平臺基礎架構方面的工作,歡迎交流技術方面的問題,可以去我的Github提issue或者發郵件至guoxiaoxingse@163.com與我交流。

文章目錄

  • 一 基礎篇
  • 二 工具篇
  • 三 書籍篇
  • 二 原始碼篇

第一次閱覽本系列文章,請參見導讀,更多文章請參見文章目錄

本篇文章是本系列文章的導讀文章,強烈建議第一次閱讀本系列本章的同學先看一下導讀的內容,它會告訴你文章中都用到了哪些工具,以及牽扯到哪些理論知識這些內
容會幫助你更快更好地去理解文章內容。

一 基礎篇

在閱讀 AOSP(Android Open Source Projec)之前你需要掌握的以下理論知識。

  • Java:AOSP的主要語言,當然是應該掌握的。
  • Linux:Android是基於Linux核心開發的,如何你需要涉及到核心或者驅動的開發,你需要掌握Linux相關技術。
  • Make:AOSP是用Make來編譯的,因此要了解常用的Make語法。
  • Git:程式設計師必備技能。
  • C++:AOSP一些效能敏感的模組底層都是由C++完成的,當然如果你如果不需要關注底層實現,也可以跳過這一段,可以更多的去關注框架層。
  • 設計模式:AOSP裡大量的框架都是用了謀者設計模式,比方說觀察者模式、工廠模式、複合模式等,如果對設計模式不夠了解的會看的雲裡霧裡。
  • 熟練的Android App開發技能

二 工具篇

本系列的文章基於的環境是MacOS,但是所使用的工具軟體多數都是跨平臺的,所以對其他平臺的小夥伴也沒有影響。

程式碼閱讀

如果在Windows下直接上SourceInsight 就可以了,Mac下可以用Understand,功能和SourceInsight一樣強大。

Understand 4.0.849 程式碼閱讀分析軟體

Android 7 原始碼分析系列導讀

簡報

簡報是用Keynote來做的。

Keynote

Android 7 原始碼分析系列導讀

文章寫作

文章都是用Markdown來寫的,工具用的是MWeb,一款很強大的Markdown編輯工具。

MWeb for Mac

Android 7 原始碼分析系列導讀

圖例繪製

流程圖、類圖、時序圖、系統架構圖等各種圖例採用EdrawMax來繪製,Visio也比較好用,可惜Mac下沒有。

EdrawMax

Android 7 原始碼分析系列導讀

圖片處理

Gif圖的製作用的是VideoGIF。

Android 7 原始碼分析系列導讀

VideoGIF

圖片閱覽

本系列的文字會涉及各種時序圖、UML圖、系統結構圖等,這些圖片有時候會很大,為了讀者能更加清晰的閱覽,筆者不僅提供了png格式的圖片,還
提供了壓縮更好的svg(可縮放向量圖形)格式,該種格式用xml語言來描述圖片資訊,在mac下可用Gapplin開啟。

Android 7 原始碼分析系列導讀

Gapplin

三 書籍篇

站在前輩的肩膀上,我們能看的更遠,進步的更快。以下是學習框架與原始碼一些不錯的書籍。

Android 原始碼設計模式解析與實戰:何紅輝,關愛民 著

Android 7 原始碼分析系列導讀

Android系統原始碼情景分析:羅昇陽 著

Android 7 原始碼分析系列導讀

Android開發藝術探索:任玉剛 著

Android 7 原始碼分析系列導讀

本系列文章也提供了一些經典的書籍資源

pan.baidu.com/s/1bOQgua#l…

Android 7 原始碼分析系列導讀

好了,以上就是全部的基礎、工具與書籍,如果你還沒有下載Android原始碼,現在我們就去下載吧。

四 原始碼篇

4.1 原始碼下載

官方地址:source.android.com/index.html

清華大學開源軟體映象站:mirror.tuna.tsinghua.edu.cn/help/AOSP/

原始碼版本

android-7.1.1_r1

電腦環境

Android 7 原始碼分析系列導讀

1 建立區分大小寫磁碟

開啟磁碟工具

Android 7 原始碼分析系列導讀

建立空白映像

Android 7 原始碼分析系列導讀

設定區分大小寫

Android 7 原始碼分析系列導讀

注意!注意!建立區分大小寫磁碟很重要,如果你不想下了一天的原始碼,結果編譯的時候報這個錯誤。

Android 7 原始碼分析系列導讀

不要問我為什麼有這個報錯的圖片,都是淚,我在Windows下劃分的ExFat格式的行動硬碟,天真的我以為它是區分大小寫的。?

搞不清自己磁碟格式的同學,可以用diskutil info 命令看一下,只有有case-sensitive字樣的才是區分大小寫的磁碟,其他的都是耍流氓。?

Android 7 原始碼分析系列導讀

2 下載repo工具

mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo複製程式碼

如果你沒有翻牆,可以使用清華大學的repo映象:mirrors.tuna.tsinghua.edu.cn/help/git-re…

下載完成後將bin/repo開啟,將裡面的REPO_URL改成清華大學的映象:

https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/`複製程式碼

Android 7 原始碼分析系列導讀

3 下載原始碼

1 建立工作目錄

mkdir WORKING_DIRECTORY
cd WORKING_DIRECTORY複製程式碼
$ git config --global user.text "Your Name"
$ git config --global user.email "you@example.com"複製程式碼

2 初始化倉庫

repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest複製程式碼

如果需要某個特定的Android版本,可以在後面指定版本號。

Android系統各版本號:source.android.com/source/buil…

repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-7.1.1_r28複製程式碼

注:更多原始碼版本可以參見source.android.com/source/buil…

3 下載原始碼

同步原始碼樹,開始下載原始碼,如果後續下載中斷,也可以重複執行這個命令。

repo sync複製程式碼

原始碼的下載會經常中斷,我們可以寫一個指令碼自動repo sync,儲存成repo.sh,放到WORKING_DIRECTORY目錄下

#!/bin/bash   
#FileName  jkYishon.sh  
PATH=~/bin:$PATH   
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-7.1.1_r28
repo sync   
while [ $? = 1 ]; do   
echo "================sync failed, re-sync again ====="   
sleep 3   
repo sync   
done複製程式碼

配置可執行許可權,執行即可。

chmod 777 repo.sh
./repo.sh複製程式碼

開始下載

Android 7 原始碼分析系列導讀

下載完成

Android 7 原始碼分析系列導讀

原始碼目錄

Android 7 原始碼分析系列導讀

我下載的是android-7.1.1_r28版本的原始碼,一共65G左右,?光原始碼都這麼大,真是個浩大的工程。

3 將原始碼匯入Android Studio

原始碼下載完成以後,你可以使用我上面推薦Understand來匯入閱讀原始碼,它是一種類似於Windows平臺上的SourceInsight的工具。但是我們如果希望能夠除錯原始碼,則就
需要將原始碼匯入到Android Studio中。

① 進入原始碼目錄,執行命令

$ source build/envsetup.sh複製程式碼

Android 7 原始碼分析系列導讀

② 執行命令,生成android.ipr檔案

$ make idegen && development/tools/idegen/idegen.sh複製程式碼

在執行這個命令的時候,可能會報錯。

Android 7 原始碼分析系列導讀

解決方案:開啟build/core/combo/mac_version.mk

# mac_sdk_versions_supported :=  10.8 10.9 10.10 10.11
mac_sdk_versions_supported :=  10.12複製程式碼

然後就可以執行成功了,成功以後會在原始碼目錄下生成android.ipr檔案。

Android 7 原始碼分析系列導讀

③ 匯入Android Studio

接下來我們就要匯入原始碼,但是原始碼的體積很大,如果全部匯入會比較卡,我們可以排除一些程式碼。例如我只想研究framework裡的程式碼,我們
可以在android.iml了新增以下內容。

<excludeFolder url="file://$MODULE_DIR$/.repo" />
<excludeFolder url="file://$MODULE_DIR$/abi" />
<excludeFolder url="file://$MODULE_DIR$/art" />
<excludeFolder url="file://$MODULE_DIR$/bionic" />
<excludeFolder url="file://$MODULE_DIR$/bootable" />
<excludeFolder url="file://$MODULE_DIR$/build" />
<excludeFolder url="file://$MODULE_DIR$/cts" />
<excludeFolder url="file://$MODULE_DIR$/dalvik" />
<excludeFolder url="file://$MODULE_DIR$/developers" />
<excludeFolder url="file://$MODULE_DIR$/development" />
<excludeFolder url="file://$MODULE_DIR$/device" />
<excludeFolder url="file://$MODULE_DIR$/docs" />
<excludeFolder url="file://$MODULE_DIR$/external" />
<excludeFolder url="file://$MODULE_DIR$/hardware" />
<excludeFolder url="file://$MODULE_DIR$/libcore" />
<excludeFolder url="file://$MODULE_DIR$/libnativehelper" />
<excludeFolder url="file://$MODULE_DIR$/ndk" />
<excludeFolder url="file://$MODULE_DIR$/out" />
<excludeFolder url="file://$MODULE_DIR$/packages" />
<excludeFolder url="file://$MODULE_DIR$/pdk" />
<excludeFolder url="file://$MODULE_DIR$/prebuilt" />
<excludeFolder url="file://$MODULE_DIR$/prebuilts" />
<excludeFolder url="file://$MODULE_DIR$/sdk" />
<excludeFolder url="file://$MODULE_DIR$/system" />
<excludeFolder url="file://$MODULE_DIR$/tools" />複製程式碼

這樣幾分鐘就匯入成功了。

Android 7 原始碼分析系列導讀

好了,以上便是我們開始分析Android原始碼所需的全部準備工作,這個系列的文章已經開始有幾個月了,Android顯示框架的相關內容已經完成,其他的也在進行中,具體可以
關注Android Open Source Project Analysis.

相關文章