(好久沒上簡(jiǎn)書了唐全,這是一篇兩年前寫的簡(jiǎn)單教程哨啃,忘記發(fā)了哈哈哈哈,補(bǔ)上U迳骸)
我們經(jīng)澄看到一些技術(shù)文章分析,例如 Android源碼分析Activity啟動(dòng)流程、Android Luncher實(shí)現(xiàn)分析囤踩,還有涉及到硬件層的同學(xué)會(huì)面對(duì)的Wifi旨椒,Bluetooth實(shí)現(xiàn)分析等等。
然后堵漱,問題來(lái)了综慎,這些源碼在哪里看?
如何閱讀源代碼勤庐,大概是每個(gè)Android學(xué)習(xí)者都繞不過的問題示惊。
當(dāng)年的我也是這樣小白過來(lái)的,翻了翻Sdk里下載的源碼愉镰,怎么人家說(shuō)的這些文件夾我都沒有? 我都全局搜索了怎么還是沒有他說(shuō)的這個(gè)類米罚?這個(gè)XML哪里來(lái)的?...
各種尷尬迷茫不知所措....
直到我百度到了AOSP
什么是AOSP
AOSP丈探,即 Android Open Source Project录择。
作為一個(gè)開源項(xiàng)目,內(nèi)容我們可以簡(jiǎn)單理解為Android完整源代碼,下面這張是我們每個(gè)開始學(xué)習(xí)Android的同學(xué)都接觸過的一張Android架構(gòu)圖隘竭。
第二張圖是源自AOSP官網(wǎng)說(shuō)明的概覽截圖塘秦。
其中的Android堆棧圖和我們見過的Android架構(gòu)圖基本一致,只是在Linux內(nèi)核層上多出了HAL动看,硬件抽象層尊剔,看說(shuō)明主要是包含音視頻,藍(lán)牙菱皆,傳感器之類的硬件內(nèi)容须误。(未免誤人子弟就不多講了,畢竟我也不不怎么熟悉搔预,內(nèi)容已經(jīng)嚴(yán)重偏離標(biāo)題霹期。。拯田。)
于是乎历造,大家應(yīng)該理解了,不同于SDK中的閹割版源碼(通常只能用來(lái)查看常用類)船庇,
AOSP項(xiàng)目是包含上述架構(gòu)圖中全部?jī)?nèi)容吭产,完整可編譯的,甚至可以直接打包成rom給手機(jī)刷機(jī)的版本鸭轮。
完整的Android源碼是包含Application層的臣淤,也即包含許多Android內(nèi)置應(yīng)用,如堆棧圖中標(biāo)注的Luncher窃爷,短信邑蒋,相機(jī),聯(lián)系人等等應(yīng)用的完整代碼按厘。如果想要實(shí)現(xiàn)類似功能医吊,對(duì)比Android原生實(shí)現(xiàn)是一定要做的。
出于學(xué)習(xí)逮京,這些項(xiàng)目也是個(gè)很好的選擇卿堂,對(duì)理解Android系統(tǒng)運(yùn)行的機(jī)制和實(shí)現(xiàn)原理都非常有幫助。
(扯了這么久終于到了今天的重點(diǎn))
通常我們有兩種方法獲取源代碼懒棉,一是直接前往一些在線網(wǎng)站瀏覽草描,二是自己下載一份完整代碼到本地。
在線瀏覽AOSP源代碼
這里分享一個(gè)比較好用的網(wǎng)站 AndroidXRef 策严,這個(gè)也是許多大神的共同推薦(強(qiáng)行給自己拉高下檔次)
網(wǎng)站上有Android各個(gè)歷史版本的完整代碼穗慕,支持文件搜索,還是很好用的享钞。特別是需要查看特定版本差異時(shí)揍诽,不是下載一份Aosp就能搞定的诀蓉。
本地獲取AOSP項(xiàng)目源碼
然而在線代碼僅能用于瀏覽栗竖,并受限于網(wǎng)絡(luò)暑脆,使用起來(lái)也不是那么順暢。自然狐肢,獲取一套本地的Aosp代碼就餓很有必要了添吗,不僅是可以方便查看學(xué)習(xí),還可以自己修改,編譯打包份名。通常如果想要成為一名系統(tǒng)或是驅(qū)動(dòng)工程師碟联,這是必不可少的一步。
Aosp官網(wǎng)有詳細(xì)的教程指導(dǎo)我們一步步按順序獲取并編譯運(yùn)行源代碼僵腺。
但是在獲取代碼這一步鲤孵,考慮到AOSP體積龐大,國(guó)際網(wǎng)絡(luò)需要翻墻還不穩(wěn)定辰如,真的使用官方說(shuō)明來(lái)操作普监,絕對(duì)是一次痛不欲生的經(jīng)歷。所以本文采用的是通過清華大學(xué)鏡像站的說(shuō)明方法來(lái)獲取代碼琉兜。
在獲取代碼后凯正,可以繼續(xù)學(xué)習(xí)Aosp官網(wǎng)上的源碼編譯相關(guān)知識(shí)。
清華大學(xué)開源軟件鏡像站
AOSP官方網(wǎng)站 (需翻墻)
需要注意的是豌蟋,AOSP代碼只能在Linux和Mac上進(jìn)行編譯廊散,以往的
Windows用戶只能通過虛擬機(jī)或者安裝雙系統(tǒng)來(lái)解決。但是隨著
WSL的推出梧疲,我們也可以直接在windows上通過Linux子系
統(tǒng)來(lái)操作了允睹。
如果沒有合適的Linux操作途徑,windows用戶就只能下載來(lái)純看代碼了
準(zhǔn)備工作
1.一塊足夠大的硬盤幌氮,不說(shuō)編譯了缭受,就算存放代碼你也需要30G,建議留足100G的空間浩销,即使AOSP并不會(huì)用到這么多贯涎。
2.如果你是Win10電腦,必須已經(jīng)開啟了WSL慢洋,可以直接運(yùn)行ubuntu
bash塘雳。如果還沒有,請(qǐng)看 Win10 直接運(yùn)行內(nèi)置Linux子系統(tǒng)
3.通暢高速的網(wǎng)絡(luò)
開始
我使用的是Win10 Linux子系統(tǒng)來(lái)進(jìn)行操作普筹。
清華大學(xué)鏡像站說(shuō)明中提供了兩種方法败明,這里采用的是使用每月更新的初始化包。該方法獲取的是最新的AOSP代碼版本太防,如果需要下載指定版本的AOSP妻顶,可以參考說(shuō)明酸员,選擇傳統(tǒng)方法。
1.安裝Repo
Repo以 Git 為基礎(chǔ)構(gòu)建的代碼庫(kù)管理工具讳嘱,具體信息可以參考這里幔嗦。這里我們先簡(jiǎn)單的將Repo當(dāng)作獲取代碼,并保持更新的工具就好沥潭。
打開ubuntu on windows邀泉,分別執(zhí)行以下命令
# 在主目錄下創(chuàng)建bin文件夾 ~/是linux下的主目錄
mkdir ~/bin
# 將bin文件添加到PATH,類似windows下的環(huán)境變量
PATH=~/bin:$PATH
# 下載repo到路徑下
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
# 添加可執(zhí)行權(quán)限
chmod a+x ~/bin/repo
2.下載初始化包
在空余的硬盤下創(chuàng)建好存放代碼的文件夾AndroidSource钝鸽,
在bash中切換到指定目錄汇恤,使用執(zhí)行以下命令
一,使用傳統(tǒng)方法
切換到工作目錄拔恰,該節(jié)方法取自鏡像站說(shuō)明因谎。
初始化倉(cāng)庫(kù):
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest
**如果提示無(wú)法連接到 gerrit.googlesource.com,請(qǐng)參照[git-repo的幫助頁(yè)面](https://mirrors.tuna.tsinghua.edu.cn/help/git-repo)的更新一節(jié)颜懊。**
如果需要某個(gè)特定的 Android 版本([列表](https://source.android.com/source/build-numbers.html#source-code-tags-and-builds)):
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-4.0.1_r1
同步源碼樹(以后只需執(zhí)行這條命令來(lái)同步):
repo sync
二 财岔,下載每月更新的初始包
# 切換到我Z盤上的AndroidSource文件夾
cd /mnt/z/AndroidSource
# 下載初始化包
wget https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar
1.wget 是Linux下的下載命令
2.在WSL中mnt文件夾對(duì)應(yīng)windows的文件架構(gòu),例如通過 mnt/c 來(lái)訪問C盤
3.注意不要直接在bash主目錄下載大文件饭冬,Linux子系統(tǒng)位于系統(tǒng)盤使鹅,C盤會(huì)撐不住。
不過這里我開始下載后 Ctrl + C 取消掉了...
感覺網(wǎng)速有點(diǎn)慢昌抠,然后反應(yīng)過來(lái)在win10上完全不必要wget 患朱。
所以正確操作是打開迅雷,直接下載到目錄下..(會(huì)不會(huì)有看一行操作一行的同學(xué)想要打我)
換到迅雷預(yù)計(jì)時(shí)間減少36小時(shí),并且直觀的看到文件大小29G炊苫,這個(gè)才是Linux和win10的完美結(jié)合有沒有2锰!侨艾!
3.解壓并檢出代碼
漫長(zhǎng)的下載完成后执虹,解壓下載文件,并在bash中通過repo sync檢出完整目錄唠梨。
復(fù)制一下鏡像站的說(shuō)明
tar xf aosp-latest.tar
cd AOSP # 解壓得到的 AOSP 工程目錄
# 這時(shí) ls 的話什么也看不到袋励,因?yàn)橹挥幸粋€(gè)隱藏的 .repo 目錄
repo sync # 正常同步一遍即可得到完整目錄
# 或 repo sync -l 僅checkout代碼
tar是linux中的壓縮命令,xf表明解壓指定文件当叭。
這里同樣建議使用winrar等windows平臺(tái)軟件進(jìn)行解壓茬故,相對(duì)WSL的文件效率會(huì)高出很多。
當(dāng)代碼檢出完成蚁鳖,我們就可以在AOSP目錄下看到完整的項(xiàng)目源代碼了磺芭。
使用 repo sync 時(shí),可能會(huì)出現(xiàn) /usr/bin/env : python :No Such file or directory 提示醉箕,這是由于WSL中的Python沒有正確安裝钾腺。
輸入 apt-get install python 安裝python2.7即可徙垫。
然后繼續(xù)
sudo apt-get install git-core gnupg flex bison gperf build-essential
zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386
lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache
libgl1-mesa-dev libxml2-utils xsltproc unzip
上述軟件包是AOSP建議ubuntu14.04安裝的,WSL雖然版本為16.04了放棒,但由于過于精簡(jiǎn)姻报,缺失依賴比較嚴(yán)重,以上我們也最好在開始全部安裝一遍的哨查。不必?fù)?dān)心過多軟件會(huì)重復(fù)安裝逗抑,linux會(huì)自動(dòng)篩選缺失的程序剧辐。