前言:已是第二次編譯Android源碼了,因爲距離第一次編譯Android源碼的時間較長,因此有一些編譯源碼的命令以及編譯的時候遇到問題的解決方法都忘記了,須要從新查找相關資料,這樣就顯得有些事倍功半了,故寫下這篇文章記錄編譯Android源碼的方式以及編譯的時候遇到的問題。python
工欲善其事,必先利其器。在編譯源碼前須要進行一些相關環境的配置,有如下幾點須要準備git
我編譯源碼的時候用的是Ubuntu16.04的系統,關於Ubuntu16.04的安裝以及Java環境的配置你們能夠本身搜索,這裏就介紹一下編譯源碼時須要的依賴的安裝方法,能夠經過如下命令進行安裝api
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源碼,第一種同步源碼的方式以下bash
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的時候可能會出現下面的錯誤markdown
error: .repo/manifests/: contains uncommitted changes
複製代碼
這時咱們在搜索引擎搜索這個錯誤,出來的答案大都以下架構
先 cd .repo/manifestscurl
再執行 Git stash 和 git clean -f -d工具
而後再repo sync 就能夠經過了fetch
可是,這答案對我並沒用,歷經千辛萬苦最後終於找到了解決這個錯誤的辦法,執行如下命令flex
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