關於作者
郭孝星,程式設計師,吉他手,主要從事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一樣強大。
簡報
簡報是用Keynote來做的。
文章寫作
文章都是用Markdown來寫的,工具用的是MWeb,一款很強大的Markdown編輯工具。
圖例繪製
流程圖、類圖、時序圖、系統架構圖等各種圖例採用EdrawMax來繪製,Visio也比較好用,可惜Mac下沒有。
圖片處理
Gif圖的製作用的是VideoGIF。
圖片閱覽
本系列的文字會涉及各種時序圖、UML圖、系統結構圖等,這些圖片有時候會很大,為了讀者能更加清晰的閱覽,筆者不僅提供了png格式的圖片,還
提供了壓縮更好的svg(可縮放向量圖形)格式,該種格式用xml語言來描述圖片資訊,在mac下可用Gapplin開啟。
三 書籍篇
站在前輩的肩膀上,我們能看的更遠,進步的更快。以下是學習框架與原始碼一些不錯的書籍。
Android 原始碼設計模式解析與實戰:何紅輝,關愛民 著
Android系統原始碼情景分析:羅昇陽 著
Android開發藝術探索:任玉剛 著
本系列文章也提供了一些經典的書籍資源
好了,以上就是全部的基礎、工具與書籍,如果你還沒有下載Android原始碼,現在我們就去下載吧。
四 原始碼篇
4.1 原始碼下載
官方地址:source.android.com/index.html
清華大學開源軟體映象站:mirror.tuna.tsinghua.edu.cn/help/AOSP/
原始碼版本
電腦環境
1 建立區分大小寫磁碟
開啟磁碟工具
建立空白映像
設定區分大小寫
注意!注意!建立區分大小寫磁碟很重要,如果你不想下了一天的原始碼,結果編譯的時候報這個錯誤。
不要問我為什麼有這個報錯的圖片,都是淚,我在Windows下劃分的ExFat格式的行動硬碟,天真的我以為它是區分大小寫的。?
搞不清自己磁碟格式的同學,可以用diskutil info 命令看一下,只有有case-sensitive字樣的才是區分大小寫的磁碟,其他的都是耍流氓。?
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/`複製程式碼
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.1.1_r28版本的原始碼,一共65G左右,?光原始碼都這麼大,真是個浩大的工程。
3 將原始碼匯入Android Studio
原始碼下載完成以後,你可以使用我上面推薦Understand來匯入閱讀原始碼,它是一種類似於Windows平臺上的SourceInsight的工具。但是我們如果希望能夠除錯原始碼,則就
需要將原始碼匯入到Android Studio中。
① 進入原始碼目錄,執行命令
$ source build/envsetup.sh複製程式碼
② 執行命令,生成android.ipr檔案
$ make idegen && development/tools/idegen/idegen.sh複製程式碼
在執行這個命令的時候,可能會報錯。
解決方案:開啟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 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原始碼所需的全部準備工作,這個系列的文章已經開始有幾個月了,Android顯示框架的相關內容已經完成,其他的也在進行中,具體可以
關注Android Open Source Project Analysis.