如果沒整編過源碼,可以直接執(zhí)行如下命令單編idegen模塊:
source build/envsetup.sh
make idegen
如下截圖:


如上截圖可以看出,idegen模塊編譯成功。
idegen模塊編譯成功后,會(huì)在 out/host/linux-x86/framework目錄下生成idegen.jar。

執(zhí)行如下命令:
sudo development/tools/idegen/idegen.sh

這時(shí)會(huì)在源碼根目錄生成android.iml 和 android.ipr 兩個(gè)文件,這兩個(gè)文件一般是只讀模式,這里建議改成可讀可寫,否則,在更改一些項(xiàng)目配置的時(shí)候可能會(huì)出現(xiàn)無法保存的情況。如下截圖:

sudo chmod 777 android.iml
sudo chmod 777 android.ipr

執(zhí)行之后,如下截圖,android.iml 和 android.ipr已經(jīng)設(shè)置可讀可寫了。

由于要將所有源碼導(dǎo)入AS會(huì)導(dǎo)致第一次加載很慢,可以在android.iml中修改excludeFolder配置,將不需要看的源碼排除掉。
在android.iml中搜索excludeFolder,在下面加入這些配置。
<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$/kernel" />
<excludeFolder url="file://$MODULE_DIR$/out" />
<excludeFolder url="file://$MODULE_DIR$/pdk" />
<excludeFolder url="file://$MODULE_DIR$/platform_testing" />
<excludeFolder url="file://$MODULE_DIR$/prebuilts" />
<excludeFolder url="file://$MODULE_DIR$/sdk" />
<excludeFolder url="file://$MODULE_DIR$/system" />
<excludeFolder url="file://$MODULE_DIR$/test" />
<excludeFolder url="file://$MODULE_DIR$/toolchain" />
<excludeFolder url="file://$MODULE_DIR$/tools" />
<excludeFolder url="file://$MODULE_DIR$/.repo" />
如下截圖:

Exclude不需要的代碼目錄
File -> Project Structure -> Modules中可以通過Excluded來篩選代碼目錄,比如我們選擇bionic目錄,點(diǎn)擊Excluded,bionic目錄會(huì)變?yōu)槌壬?,bionic字段會(huì)出現(xiàn)在右側(cè)視圖中,說明該目錄已經(jīng)被Excluded掉,通俗來講就是被排除在工程之外。如果不希望bionic目錄被Excluded掉,再次點(diǎn)擊Excluded,bionic目錄會(huì)變?yōu)榛疑?。如下截圖:


從源碼目錄可以看出,部分目錄會(huì)變?yōu)槌壬?,說明該目錄已經(jīng)被Excluded掉,通俗來講就是被排除在工程之外。

Build framework源碼之后會(huì)發(fā)現(xiàn)類名出現(xiàn)橘黃色J的警告。并提示如下提示:

打開terminal,檢查當(dāng)前配置。
cat /proc/sys/fs/inotify/max_user_watches

65536
當(dāng)前值太小,需要修改 /etc/sysctl.conf 文件,修改這個(gè)文件需要root權(quán)限
第一步:在/etc/sysctl.conf文件的最后添加一行代碼。
1.使用 vim 編輯。vim /etc/sysctl.conf
2.最后一行添加代碼。fs.inotify.max_user_watches = 524288

3.該文件是只讀文件,保存到只讀文件。
:w !sudo tee %
4.會(huì)提示一個(gè)警告,大致是說 文件 /etc/sysctl.conf 已變動(dòng),并且在 Vim 中的緩沖區(qū)也已變動(dòng),確定([O]), 加載文件((L)),按 [O] ,之后按 [Enter],完成修改。
5.最后退出 vim,由于是只讀文件,使用強(qiáng)制退出:
:q!
第二步:運(yùn)行此命令將剛才的修改生效。
sudo sysctl -p

第三步:重啟 Android Studio。
源碼整編
source build/envsetup.sh
lunch
使用make -j8執(zhí)行編譯。
編譯過程當(dāng)中可能會(huì)出現(xiàn)編譯不通過,如下幾個(gè)問題進(jìn)行應(yīng)對(duì):
執(zhí)行make update-api命令:

需要安裝m4、gperf
命令如下:
sudo apt-get install m4
sudo apt install gperf
再次執(zhí)行make update-api命令,結(jié)果如下圖:

如果執(zhí)行make -j8命令后仍然出現(xiàn)如下編譯問題:

首先安裝apt-file
sudo apt-get install apt-file
安裝完成后,可能需要提示更新。

執(zhí)行sudo apt-file update命令
使用sudo apt-file search命令查找?guī)焖诘陌?,安裝對(duì)應(yīng)的包。


通過上面可以看到,libncurses.so對(duì)應(yīng)的是lib32ncurses-dev。需要執(zhí)行如下命令進(jìn)行安裝:
sudo apt-get install lib32ncurses-dev
繼續(xù)執(zhí)行如下make -j8進(jìn)行編譯仍然出現(xiàn)編譯問題,如下截圖:

繼續(xù)通過apt-file search命令查找?guī)焖诘陌?,安裝對(duì)應(yīng)的包,后續(xù)就不繼續(xù)截圖了。
經(jīng)過漫長等待,編譯后可能出現(xiàn)如下情況:

若出現(xiàn)上述錯(cuò)誤,需要切換python2.7。
1).查看ubuntu下的所有python版本
ls /usr/bin/python*
2)切換python版本
sudo update-alternatives --config python
如下截圖:

上圖可看出,已切換到phthon相應(yīng)的版本,再次執(zhí)行make -j12如下圖:

上述提示build completed successfully,說明編譯成功。
編譯成功后,執(zhí)行emulator命令啟動(dòng)模擬器,執(zhí)行后可能出現(xiàn)如下情況:

問題:
在window系統(tǒng)下,用VMware搭建ubuntu系統(tǒng),在ubuntu系統(tǒng)搭建安卓emulator,啟動(dòng)emulator時(shí)報(bào)錯(cuò)如上截圖。
解決方法:
1.關(guān)閉ubuntu系統(tǒng);
2.VMware右擊ubuntu虛擬機(jī)名字,選擇設(shè)置;
3.虛擬機(jī)設(shè)置界面選擇【硬件】下的【處理器】,勾選虛擬化引擎下的【虛擬化Intel VT-x/EPT或者AMD-V/RVI(V)】,點(diǎn)擊確定;
4.重啟ubuntu系統(tǒng)。

繼續(xù)emulator命令啟動(dòng)模擬器,如下圖:

emulator模擬器正式啟動(dòng)。

如上述,類名沒有出現(xiàn)橘黃黃色J的警告了,可以正式閱讀源碼了,和普通項(xiàng)目一樣,可以進(jìn)行Java代碼跳轉(zhuǎn)了,方便閱讀代碼了。