前言:已經是第二次編譯Android原始碼了,由於距離第一次編譯Android原始碼的時間較長,所以有一些編譯原始碼的命令以及編譯的時候遇到問題的解決方法都忘記了,需要重新查詢相關資料,這樣就顯得有些事倍功半了,故寫下這篇文章記錄編譯Android原始碼的方式以及編譯的時候遇到的問題。
編譯前的準備
工欲善其事,必先利其器。在編譯原始碼前需要進行一些相關環境的配置,有以下幾點需要準備
- 電腦需要安裝Linux系統(不推薦虛擬機器)
- 配置Java環境
- 已經安裝過Git
- 安裝編譯原始碼需要的依賴
我編譯原始碼的時候用的是Ubuntu16.04的系統,關於Ubuntu16.04的安裝以及Java環境的配置大家可以自己搜尋,這裡就介紹一下編譯原始碼時需要的依賴的安裝方法,可以通過以下命令進行安裝
sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib
sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386
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
sudo apt-get install libc6-dev-i386
sudo apt-get install lib32ncurses5-dev x11proto-core-dev libx11-dev
sudo apt-get install libgl1-mesa-dev libxml2-utils xsltproc unzip m4
sudo apt-get install lib32z-dev ccache
複製程式碼
同步原始碼
這裡推薦清華大學開源軟體映象站進行原始碼的同步,下載速度真的很快,清華大學開源軟體映象站提供了兩種同步原始碼的方式,我採用的是第一種,好像這種同步下來的原始碼都是最新的Android原始碼,第一種同步原始碼的方式如下
下載安裝repo工具
mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
## 如果上述 URL 不可訪問,可以用下面的:
## curl https://storage-googleapis.proxy.ustclug.org/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
複製程式碼
同步原始碼
wget -c 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程式碼
複製程式碼
注:這裡在執行repo sync的時候可能會出現下面的錯誤
error: .repo/manifests/: contains uncommitted changes
複製程式碼
這時我們在搜尋引擎搜尋這個錯誤,出來的答案大都如下
先 cd .repo/manifests
再執行 Git stash 和 git clean -f -d
然後再repo sync 就可以通過了
但是,這答案對我並沒用,歷經千辛萬苦最後終於找到了解決這個錯誤的辦法,執行以下命令
git config core.filemode false
# 加入忽略檔案許可權的配置
複製程式碼
然後在執行 repo sync便能同步成功。可能在同步的過程中會遇到下面的錯誤
error:Exited sync due to fetch errors
複製程式碼
解決辦法就是再執行一次repo sync或 repo sync -f 命令。
編譯原始碼
進入解壓後的aosp資料夾,執行下面的命令
source build/envsetup.sh
複製程式碼
下面是執行命令後的結果
可以看出這個命令是將一些指令碼檔案包含進來,接著執行一下命令
lunch
複製程式碼
執行後的結果如下
這時我們只要輸入相應的序號,就可以指定編譯目標的格式了,如此時輸入序號‘1’,則編譯的目標格式為aosp_arm-eng,所謂的編譯目標就是生成的映象要執行在什麼樣的裝置上。下面介紹一下編譯目標格式,編譯的目標格式都是BUILD-BUILDTYPE形式,BUILD就是
BUILD指的是特定功能的組合的特定名稱,即表示編譯出的映象可以執行在什麼環境.其中,aosp(Android Open Source Project)代表Android開源專案;arm表示系統是執行在arm架構的處理器上,arm64則是指64位arm架構;處理器,x86則表示x86架構的處理器;
BUILDTYPE就是
BUILD TYPE則指的是編譯型別,通常有三種: -user:代表這是編譯出的系統映象是可以用來正式釋出到市場的版本,其許可權是被限制的(如,沒有root許可權,不鞥年dedug等) -userdebug:在user版本的基礎上開放了root許可權和debug許可權. -eng:代表engineer,也就是所謂的開發工程師的版本,擁有最大的許可權(root等),此外還附帶了許多debug工具
瞭解了編譯目標格式,我們根據自己的需要輸入相應的序號即可。如果你是準備編譯原始碼後在電腦上執行,那麼推薦選擇序號“5”進行編譯,因為這樣在執行時速度會快很多。
開始編譯
輸入下面的命令則編譯開始
make -j8
複製程式碼
注:這裡的 -j8代表的時啟用編譯的執行緒數,參與編譯的執行緒並不是越多越好,通常是根據你機器cup的核心來確定:core*2,即當前cpu的核心的2倍.比如,我現在的筆記本是雙核四執行緒的,因此根據公式,最快速的編譯可以make -j8(通過
cat /proc/cpuinfo檢視相關cpu資訊)
。
如果編譯的過程中沒有出現什麼錯誤,那麼在幾個小時後你應該會看見下面的輸出
make completed successfully
複製程式碼
那麼恭喜你完成了Android的原始碼編譯。
執行模擬器
如果你是在編譯完後立刻執行模擬器,可以通過以下命令來執行模
emulator
複製程式碼
否則,通過以下命令來執行
source build/envsetup.sh
lunch
(選擇剛才你設定的目標版本,比如這裡了我選擇的是5)
emulator
複製程式碼
下面看下,我此次編譯後執行的模擬器
結束語
編譯原始碼的時候還是有一些坑的,本文的目的就是讓大家在編譯原始碼時少入坑,節省時間做更有意義的事情。至此,已經成功編譯了Android原始碼,有了Android的原始碼,你就可以更深入的研究Android了。
ps: 歷史文章中有乾貨哦!
轉載請註明出處:www.wizardev.com