什么是aosp:
"Android Open-Source Project"的縮寫。中文意為"Android 開(kāi)放源代碼項(xiàng)目"。
下載
下載前的準(zhǔn)備工作:
1.ubuntu 操作系統(tǒng)
雖然Google官方證實(shí)在mac os 上也可以成功編譯,但是目前我用macbook編譯從來(lái)沒(méi)有成功過(guò),總是報(bào)一些莫名奇妙的錯(cuò)誤也找不到原因,無(wú)奈將一臺(tái)舊Windows筆記本改裝ubuntu18.04后成功編譯。Google官方推薦的源碼編譯環(huán)境也是ubuntu,所以選擇ubuntu編譯Android源碼是最保險(xiǎn)的策略,考慮到Android源碼占用空間極大,磁盤最好預(yù)留250G以上空間。
ubuntu就的安裝不再贅述了,安裝成功打開(kāi)終端,開(kāi)始接下來(lái)的操作吧。
2.下載repo工具
mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
這里的訪問(wèn)可能會(huì)被墻,使用清華鏡像代替之:
mkdir ~/bin
PATH=~/bin:$PATH
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo
chmod a+x ~/bin/repo
參考 repo清華鏡像
執(zhí)行curl時(shí)可能會(huì)提示curl沒(méi)有,下載之:
sudo apt-get install curl
3.找個(gè)合適的位置新建文件夾:
mkdir aosp
cd aosp
4.環(huán)境準(zhǔn)備
// 1.安裝python
sudo apt-get install python
// 2.安裝git:
sudo apt-get install git
// 3.配置git郵箱和賬戶
git config --global user.email “you@example.com”
git config --global user.name “Your Name”
// 4.安裝jdk8:
sudo apt-get install openjdk-8-jdk
// 5.然后執(zhí)行Java -version判斷版本是否為8,如果不是需要配置,命令如下
sudo update-alternatives --config java
sudo update-alternatives --config javac
5.初始化倉(cāng)庫(kù)
因?yàn)锳ndroid源碼工程巨大無(wú)比,而且因?yàn)閴Φ拇嬖冢苯渔溄覩oogle的資源鏈接可能不穩(wěn)定,因此在這里使用國(guó)內(nèi)清華aosp鏡像
參考清華AOSP鏡像使用幫助
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest
此時(shí)可能會(huì)提示無(wú)法連接到 gerrit.googlesource.com,這是因?yàn)閞epo的運(yùn)行過(guò)程中會(huì)嘗試訪問(wèn)官方的git源更新自己,如果想使用清華的鏡像源進(jìn)行更新,可以將如下內(nèi)容復(fù)制到你的~/.bashrc里,并重啟終端模擬器
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'
參考 repo清華鏡像
如果需要某個(gè)特定的 Android 版本,
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-8.1.0_r75
同步源碼樹(shù):
repo sync
接下來(lái)就是漫長(zhǎng)的源碼下載過(guò)程....,在源碼下載過(guò)程中會(huì)遇到各種各樣的問(wèn)題,然后終端進(jìn)程就中止在那里不動(dòng)了,解決這個(gè)問(wèn)題,可以使用自動(dòng)化腳本去同步,當(dāng)進(jìn)程中止后重新開(kāi)始sync,步驟如下:
1.在aosp文件夾下創(chuàng)建一個(gè)腳本:
#!/bin/bash
repo sync
while [ $? = 1 ]; do
echo “======sync failed, re-sync again======”
sleep 3
repo sync
done
在shell中執(zhí)行如下命令:
chmod a+x down.sh
./down.sh
接下來(lái)就是漫長(zhǎng)的源碼下載過(guò)程,整個(gè)8.1的源碼大概70多個(gè)G,耐心等待吧。
編譯
1.源碼編譯
安裝編譯所需要的軟件:
sudo apt-get install git gnupg flex bison gperf build-essential
sudo apt-get install zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev
sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386
sudo apt-get install libgl1-mesa-dev g++-multilib mingw32 tofrodos
// 這里會(huì)提示不能夠下載mingw32,則需要在source.list文件中增加
deb http://us.archive.ubuntu.com/ubuntu trusty main universe
sudo apt-get install python-markdown libxml2-utils xsltproc zlib1g-dev:i386
sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so
// 在本用戶的.bashrc文件中增加
export LC_ALL=C
// 修改prebuilts/sdk/tools/jack-admin文件,找到文件中的這一行:
JACK_SERVER_COMMAND="java -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -cp $LAUNCHER_JAR $LAUNCHER_NAME"
// 然后在該行添加-Xmx4096m,如:
JACK_SERVER_COMMAND="java -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -Xmx4096m -cp $LAUNCHER_JAR $LAUNCHER_NAME"
重啟終端
進(jìn)入aosp文件夾,創(chuàng)建環(huán)境變量
source build/envsetup.sh
執(zhí)行l(wèi)unch命令,會(huì)列出所有可編譯的Android架構(gòu)版本
選擇要編譯的room,比如要編譯arm架構(gòu)lunch命令就是
lunch aosp_arm-eng
接下來(lái)執(zhí)行編譯命令:
make
可以視電腦配置狀況適當(dāng)增加線程數(shù),增加編譯速度,如:
make -j4
接下來(lái)又是漫長(zhǎng)的等待,我自己大概是20小時(shí)后編譯完成,繼續(xù)耐心等待。
導(dǎo)入AndroidStudio
以下操作來(lái)自大神gityuan的博客,我只是文字的搬運(yùn)工
1.終端進(jìn)入aosp文件夾,依次執(zhí)行如下命令:
soruce build/envsetup.sh
mmm development/tools/idegen/
./development/tools/idegen/idegen.sh
2.打開(kāi)Android Studio, 點(diǎn)擊File -> Open,選中前面生成的android.ipr文件即可, 該過(guò)程較耗時(shí)
加載后提速:
如果已經(jīng)把全部項(xiàng)目導(dǎo)入到Android Studio,又想刪除怎么辦,其實(shí)有一個(gè)簡(jiǎn)單的方法就是進(jìn)入目錄Project Structure -> Modules, 可快速去除某些模塊, 其中紅色代碼Exclueded選項(xiàng)(即代表已刪除的目錄), 如下圖:

- 配置源碼正確跳轉(zhuǎn)
這里的配置JDK/SDK,是用于解決在分析和調(diào)試源碼的過(guò)程,能正確地跳轉(zhuǎn)到目標(biāo)源碼,而非SDK中的代碼。 點(diǎn)擊File菜單下的Project Structure.
Step 1 新建JDK
Project Structure -> SDKs, 新建 JDK(None), 其中JDK目錄可選擇跟原本JDK一致即可, 然后刪除其classpath和SourcePath的內(nèi)容,確保使用Android系統(tǒng)源碼文件

Step 2 配置SDK
Project Structure -> SDKs, 選中Android API 25 Platform, 然后選擇其Java SDK為前面新建的JDK(None)

Step 3 選擇SDK
Project Structure -> Project -> 選中Project SDK, 選擇前面的Android API 25 Platform

Step 4 建立依賴
Project Structure -> Modules -> android -> Dependencies: 先刪除Android API 28 Platform之外的所有依賴, 然后點(diǎn)擊下圖綠色的+號(hào)來(lái)選擇Jars or directories,將frameworks添加進(jìn)來(lái), 也可添加其他所關(guān)注的源碼;

下圖便是添加后的結(jié)果圖:

自此,Android源碼的下載、編譯、導(dǎo)入AS的操作全部完成,我們可以愉快地在AS中閱讀代碼了
Android 內(nèi)核工程下載
在下載編譯完成后便開(kāi)心的閱讀起了源碼,但是讀著讀著發(fā)現(xiàn)有些不對(duì)勁,怎么Android 內(nèi)核文件夾是空的?
網(wǎng)上搜索了一下,原來(lái)aosp工程是不包含kernel代碼的,aosp編譯時(shí)使用的是prebuilts里面預(yù)先編譯好的Linux文件,
如果需要閱讀kernel代碼需要另行下載,好在這方面的資料也很多,找起來(lái)也不費(fèi)勁
Android Kernel工程下載引導(dǎo)
這個(gè)網(wǎng)站詳細(xì)說(shuō)明了如何下載Kernel工程,有不同的Cpu架構(gòu)對(duì)應(yīng)的kernel工程可選
· common
· exynos
· goldfish
· lk
· samsung
· tegra
· msm
· omap
比如想下載common架構(gòu)的kernel工程,git地址為:
git clone https://android.googlesource.com/kernel/common.git
因?yàn)閴Φ拇嬖?,這個(gè)地址是很難訪問(wèn)到的,使用清華鏡像地址代替:
git clone https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/kernel/common.git
下載完成后切換到aosp工程Android版本對(duì)應(yīng)的分支即可