Android原始碼閱讀-編譯8.0原始碼

ostracod發表於2017-11-26

前面的話

搞Android的人不編譯一下Android的原始碼感覺人生好像不大完整似的。早就想編譯Android原始碼,但是前前後後經歷好長時間都沒有把它搞出來,就這樣拖著,直到昨天晚上才真正的把Android8.0原始碼給編譯出來。一開始在Mac下面編譯的,但是環境搭建配置非常麻煩,而且問題特別多,編譯到最後一步時出現問題,Google了好幾天都沒有解決,最後轉戰Ubuntu,一次性編譯成功。來欣賞一下編譯成果!

image

編譯環境

1、Ubuntu16.04
2、Android8.0原始碼
複製程式碼

對於Ubuntu16.04系統,有的人認為虛擬機器裡面安裝也可以,我沒有試過,因為電腦配置不夠,我怕跑不起來,所以直接用了公司的Windows7桌上型電腦安裝了Ubuntu、windows雙系統,所以建議還是在原生的Ubuntu系統裡面進行編譯,防止出現各種詭異的問題。

配置環境

  • Ubuntu16.04系統安裝

對於Ubuntu16.04系統,我是是通過u盤來安裝的,方便快捷,這裡就不說怎麼安裝系統了,不會的話建議百度。

  • Android8.0原始碼下載

Android8.0原始碼的下載就比較蛋疼了,因為我們只有通過VPN才能訪問Google的一些東西,對於原始碼這東西,動不動幾十個G的話,通過VPN來下載的話,肯定懵逼啊,所以我們得另闢途徑。清華大學開源軟體映象站,這個站點就提供Google的Android原始碼下載,最好使用裡面的每月更新的初始化包來下載,我是通過迅雷下載的,初始化包大概有42G,用迅雷,我這邊大概花了3個小時就下載好了。這裡說個題外話。我一開始是在Ubuntu裡面的Firefox直接下載原始碼,大概試了三四次,都沒有成功,也不知道為什麼,前兩次都是下載到20G左右的時候,就停了,不再繼續下載,第三次下載到40G左右時停掉了,莫名其妙,也不能斷點下載,所以換了個方式,直接在Mac裡面迅雷下載好了,再傳到Ubuntu中,太耗時間了!!!

下載好了初始化包,我們把它放到一個資料夾下面,隨便建一個目錄即可,然後解壓,解壓下來你會發現裡面什麼都沒有,是個空的,又是一個大大的懵逼!!!,其實裡面存在一個隱藏的檔案**.repo**,我們通過這個檔案在sync一下就可以了。

image

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

開啟上面的repo檔案,將裡面的REPO_URL改成下面的

REPO_URL = 'https://aosp.tuna.tsinghua.edu.cn/android/git-repo'

複製程式碼

可能有些某種原因,所以自備梯子。

wget https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar # 下載初始化包
tar xf aosp-latest.tar
cd AOSP   # 解壓得到的 AOSP 工程目錄
# 這時 ls 的話什麼也看不到,因為只有一個隱藏的 .repo 目錄
repo sync # 正常同步一遍即可得到完整目錄
# 或 repo sync -l 僅checkout程式碼
複製程式碼

這是清華大學開源軟體映象站提供的方法,按照這個做,沒錯,只不過耗時而已,看個人的網速。當然了也可以下載指定的Android版本原始碼,具體方法,請檢視介紹: Android 映象使用幫助

  • 首先我們需要安裝一些依賴:
sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386 
sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib 
sudo apt-get install tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386 
sudo apt-get install dpkg-dev libsdl1.2-dev libesd0-dev
sudo apt-get install git-core gnupg flex bison gperf build-essential  
sudo apt-get install zip curl zlib1g-dev gcc-multilib g++-multilib 
sudo apt-get install libc6-dev-i386 
sudo apt-get install lib32ncurses5-dev x11proto-core-dev libx11-dev 
sudo apt-get install lib32z-dev ccache
sudo apt-get install libgl1-mesa-dev libxml2-utils xsltproc unzip m4
複製程式碼
  • 設定編譯器快取記憶體
prebuilts/misc/linux-x86/ccache/ccache -M 50G
複製程式碼
  • 安裝openJDK8
sudo apt-get install openjdk-8-jdk
複製程式碼
  • 接著匯入編譯Android原始碼所需的環境變數和其它引數:
source build/envsetup.sh
複製程式碼
  • 使用 lunch 選擇要編譯的目標。確切的配置可作為引數進行傳遞
lunch aosp_arm-eng
複製程式碼
  • 編譯程式碼
make -j4
複製程式碼

通過以上幾步,我們就可以耐心的等待編譯了,我這邊是下班的時候開始編譯的,等到第二天早上過來的時候,就提示已經編譯成功,我也沒想到一次性編譯通過,畢竟在Mac上面編譯了一個多月,基本都是在1%的時候就會報錯,然後就一直Google,奈何一直找不到解決方法,就換成Ubuntu了,沒想到一次性編譯通過。


我們編譯Android原始碼的主要目的還是檢視分析Android原始碼,所以接下來我們得生成AndroidStudio檢視原始碼的格式。

  • AndroidStudio檢視原始碼環境

以上若已經編譯成功的話,我們進入到Android原始碼的路徑下面,首先我們需要生成AndroidStudio所需要的格式

mmm development/tools/idegen/
複製程式碼

執行成功之後再次執行

sh ./development/tools/idegen/idegen.sh
複製程式碼

通過以上兩條命令的話,就可以生產AS 所需要的檔案了android.ipr,進入Android原始碼根目錄,開啟AndroidStudio,匯入這個檔案即可,初次匯入,時間比較久。

以上便是大概的過程,我大概經歷了一個多月的時間才真正的編譯成功,這期間放棄、繼續、放棄、繼續,來回掙扎,所以如果真想編譯Android原始碼的話,建議,耐心一點,出現問題,找Google,換種思路繼續,堅持到最後應該就可以了編出來了。


關於作者

github: github.com/crazyandcod… 部落格: crazyandcoder.github.io 掘金:juejin.im/user/56b96a…

相關文章