天天看點

[Android Pro] Android源碼編譯之Nexus5真機編譯reference to : http://blog.csdn.net/liu1075538266/article/details/51272398 1.   前言 2.   實驗環境與裝置 3.   準備工作 4.   編譯 5.   刷機

在Android安全的研究工作中,我們時常要對Android進行改進并對其進行源碼編譯,由于目前幾乎所有的手機廠商均對其底層驅動實行封閉政策,導緻我們在完成Android編譯後無法将我們編譯好的系統刷到普通的Android手機上,是以在一般的科學實驗中我們更多的是将修改好的android源碼編譯成模拟器,以模拟器的形式證明實驗的成功與否。

事實上,Android作為一款開放源代碼的移動裝置作業系統,Google最初就考慮到了真機編譯的問題,而關于這個問題的解決方案展現在每次Google I/O大會釋出的官方手機,即Nexus系列手機上。Nexus系列手機作為Google釋出的Android标杆機,不僅在一定程度上代表和引領了該年度的Android手機發展方向,更解決的開發者真機編譯源碼的問題。此系列裝置采用了完全開放裝置的層驅動的形式使得開發者可以實作将自己的源碼燒錄到真機的功能,進而使得源碼編譯真機調試不再是難題。下面,我就來介紹一下這項工作是如何完成的。

實驗裝置:Nexus5(日版 D821)。

實驗環境:Ubuntu14.04 (x64) + JDK 1.7 + python 2.7.6 + make 3.81

首先要聲明的一點是,這是一部零基礎教程,上述實驗環境是作者電腦最初的狀态,它不一定符合我們此次試驗的要求,是以會在後面逐漸完善實驗環境,這樣寫的目的也是為了将我在實驗中所遇到的問題以及解決方案原原本本展示給大家,讓大家少走一些彎路。

我們參照android opensource project官網(http://source.android.com/source/requirements.html)上的guide來進行實驗,在AOSP的guide中對編譯的硬體要求和軟體要求做出了詳細的規定。此次我們要編譯的源碼是Android 4.4.x版本,根據官網中的資訊,我們要使用64位Ubuntu進行編譯,并且至少有100G的磁盤空間;在軟體方面,由于我們編譯的是4.4.x (Kitkat) 版本的源碼,是以需要JDK 1.6,除此之外,official guide中還有一些其他要求:Python2.6 -- 2.7,GNU Make 3.81 -- 3.82,Git1.7 or newer(這裡我們不需要配置git,因為在officialguide中源碼的擷取是通過git + repo線上下載下傳完成的,而我們采取另一種方式擷取源碼)。

在我的編譯環境中,作業系統為64位Ubuntu 14.04,磁盤空間預留100G,JDK版本為1.7,make 版本3.81,python 版本2.7.6。

[Android Pro] Android源碼編譯之Nexus5真機編譯reference to : http://blog.csdn.net/liu1075538266/article/details/51272398 1.   前言 2.   實驗環境與裝置 3.   準備工作 4.   編譯 5.   刷機
[Android Pro] Android源碼編譯之Nexus5真機編譯reference to : http://blog.csdn.net/liu1075538266/article/details/51272398 1.   前言 2.   實驗環境與裝置 3.   準備工作 4.   編譯 5.   刷機
[Android Pro] Android源碼編譯之Nexus5真機編譯reference to : http://blog.csdn.net/liu1075538266/article/details/51272398 1.   前言 2.   實驗環境與裝置 3.   準備工作 4.   編譯 5.   刷機

現在我們可以發現,java環境的版本比要求的jdk 1.6要高,是以下面,我們需要進行jdk的降級工作。

Jdk 1.6的安裝包是一個bin檔案,我們需要先安裝它。

[Android Pro] Android源碼編譯之Nexus5真機編譯reference to : http://blog.csdn.net/liu1075538266/article/details/51272398 1.   前言 2.   實驗環境與裝置 3.   準備工作 4.   編譯 5.   刷機

把這個檔案放到你自己定義的地方,這裡我放到了Home下的java檔案裡,當然也可以放在别的地方。首先要修改這個檔案的權限,否則直接安裝會報錯,系統會告訴你權限不夠。

[Android Pro] Android源碼編譯之Nexus5真機編譯reference to : http://blog.csdn.net/liu1075538266/article/details/51272398 1.   前言 2.   實驗環境與裝置 3.   準備工作 4.   編譯 5.   刷機

chmod 777 jdk-6u45-linux-x64.bin

修改完權限後就可以運作安裝了。

./jdk-6u45-linux-x64.bin

這個過程其實就是生成了jdk的目錄。

[Android Pro] Android源碼編譯之Nexus5真機編譯reference to : http://blog.csdn.net/liu1075538266/article/details/51272398 1.   前言 2.   實驗環境與裝置 3.   準備工作 4.   編譯 5.   刷機

Jdk1.6的目錄生成後,我們需要修其改環境變量,原有的java變量是在/etc/profile中配置的,在此隻需要修改此檔案中的環境變量就可以了。

[Android Pro] Android源碼編譯之Nexus5真機編譯reference to : http://blog.csdn.net/liu1075538266/article/details/51272398 1.   前言 2.   實驗環境與裝置 3.   準備工作 4.   編譯 5.   刷機
[Android Pro] Android源碼編譯之Nexus5真機編譯reference to : http://blog.csdn.net/liu1075538266/article/details/51272398 1.   前言 2.   實驗環境與裝置 3.   準備工作 4.   編譯 5.   刷機

修改之後隻需使/etc/profile生效即可。

source /etc/profile

執行這個指令之後,重新開機。

然後我們可以檢視一下是否生效:java –version

[Android Pro] Android源碼編譯之Nexus5真機編譯reference to : http://blog.csdn.net/liu1075538266/article/details/51272398 1.   前言 2.   實驗環境與裝置 3.   準備工作 4.   編譯 5.   刷機

修改成功!

[Android Pro] Android源碼編譯之Nexus5真機編譯reference to : http://blog.csdn.net/liu1075538266/article/details/51272398 1.   前言 2.   實驗環境與裝置 3.   準備工作 4.   編譯 5.   刷機

在準備好了編譯環境後,我們就該準備要編譯的源碼了。此次實驗的目标是将Android4.4.x編譯後燒錄到Nexus 5上,由于Google的官方裝置目前已經更新至第七代,而且種類繁多,不僅有智能手機,還有平闆電腦,智能手表,筆記本電腦等其他智能裝置,而且不同代次的裝置所相容的源碼版本也是處在一定範圍内的。是以,Google對Android源碼建構了種類繁多而又詳細的分支,使其分别适配不同的裝置,例如:分支android-5.1.1_r3( build: LMY48B )隻支援Nexus 5,而android-5.1.1_r1(build: LMY47V )支援的是Nexus 7 (flo/grouper), Nexus 10, Nexus Player;由于存在不同的營運商定制版裝置,不同的營運商定制的裝置甚至都不能共用一個分支的源碼,例如:android-5.1.1_r4( build: LMY47Z )支援除T-Mobile美國之外的所有Nexus6裝置,而T-Mobile定制版本的Nexus 6裝置則需要android-5.1.1_r5( build: LYZ28E )分支來支援。綜上所述,我們可以得出結論,在真機編譯中,選擇正确的源碼分支至關重要,否則一旦沒有選擇對,耗費了大量的時間進行編譯,即便燒錄到真機中也會出現開不了機的情況(最常見的就是手機開機後卡在Google的開機界面中)。

[Android Pro] Android源碼編譯之Nexus5真機編譯reference to : http://blog.csdn.net/liu1075538266/article/details/51272398 1.   前言 2.   實驗環境與裝置 3.   準備工作 4.   編譯 5.   刷機

先來解釋一下表格中每一列代表什麼:

第一列是build代碼,我們根據build碼查找對應裝置的驅動程式,并下載下傳之。

第二列是分支(branch)代碼,不同的分支會對應不同的裝置。

第三列是Android版本代号,這裡我們關注的是4.4系列的版本,是以是KitKat。

第四列是對應的裝置名稱,值得注意的是,同一裝置即便是不同營運商釋出的也可能使用不同分支的源碼,例如android-4.4.4_r2就是隻針對上述營運商的定制版本的分支,而r1就支援其餘的Nexus 5裝置。

這裡,我們選擇android-4.4.4_r1進行編譯,因為它支援我的裝置。注意要記住這個分支的build号:KTU84P,後面我們要用這個碼查找對應的裝置驅動并下載下傳。

在編譯工作開始之前,我們可以使用編譯器高速緩存工具complier cache(ccache)來加快編譯速度。首先,我們在環境變量中加入:

export USE_CCACHE=1

并使環境變量檔案生效。然後,我們在指令行執行

prebuilts/misc/linux-x86/ccache/ccache -M 50G

即可。

[Android Pro] Android源碼編譯之Nexus5真機編譯reference to : http://blog.csdn.net/liu1075538266/article/details/51272398 1.   前言 2.   實驗環境與裝置 3.   準備工作 4.   編譯 5.   刷機

下載下傳得到的是三個tgz檔案,我們隻需依次解壓三個檔案,得到的是三個shell腳本檔案,我們先将其置于源碼根目錄中。

[Android Pro] Android源碼編譯之Nexus5真機編譯reference to : http://blog.csdn.net/liu1075538266/article/details/51272398 1.   前言 2.   實驗環境與裝置 3.   準備工作 4.   編譯 5.   刷機
[Android Pro] Android源碼編譯之Nexus5真機編譯reference to : http://blog.csdn.net/liu1075538266/article/details/51272398 1.   前言 2.   實驗環境與裝置 3.   準備工作 4.   編譯 5.   刷機

依次執行這三個腳本檔案,這裡要注意,三個腳本檔案的作用是生成驅動檔案,但是在執行操作前,它會讓你閱讀相關協定,你必須一直按enter鍵一行一行往下讀,更不能一鍵摁到底,因為程式在最後會讓你輸入“I ACCEPT”,如果你一鍵摁到底,也就是說最後一步也摁enter鍵的話它就會執行預設操作,即不接受此協定,那生成驅動檔案的操作就不會執行。這裡有個小竅門,一直摁住enter,注意指令行中閃過的協定項,當讀到第八項時可以放慢速度,一下一下的摁enter鍵了,最後慢慢的到最後一步,輸入I ACCEPT即可。這三個檔案都是這樣的操作流程。上圖展示了在執行完腳本檔案後生成的驅動檔案目錄。

在完成了以上任務之後,我們就可以進行源碼的編譯工作了。首先,我們在terminal中進入Android源碼所在目錄,我就把我的源碼放在了Home下。

[Android Pro] Android源碼編譯之Nexus5真機編譯reference to : http://blog.csdn.net/liu1075538266/article/details/51272398 1.   前言 2.   實驗環境與裝置 3.   準備工作 4.   編譯 5.   刷機

初始化編譯環境,輸入

. build/envsetup.sh

會出現這樣的效果。

[Android Pro] Android源碼編譯之Nexus5真機編譯reference to : http://blog.csdn.net/liu1075538266/article/details/51272398 1.   前言 2.   實驗環境與裝置 3.   準備工作 4.   編譯 5.   刷機

加載機型,輸入lunch指令,會列出不同裝置可能編譯出的結果。

[Android Pro] Android源碼編譯之Nexus5真機編譯reference to : http://blog.csdn.net/liu1075538266/article/details/51272398 1.   前言 2.   實驗環境與裝置 3.   準備工作 4.   編譯 5.   刷機

在這一步中,我們選擇6号:aosp_hammerhead_userdebug,因為我們的Nexus 5裝置代号就是hammerhead。

[Android Pro] Android源碼編譯之Nexus5真機編譯reference to : http://blog.csdn.net/liu1075538266/article/details/51272398 1.   前言 2.   實驗環境與裝置 3.   準備工作 4.   編譯 5.   刷機

aosp則代表着編譯出的系統是純淨的、沒有Google服務架構的。而buildtype也分為user、userdebug和eng,具體差別見下圖。

[Android Pro] Android源碼編譯之Nexus5真機編譯reference to : http://blog.csdn.net/liu1075538266/article/details/51272398 1.   前言 2.   實驗環境與裝置 3.   準備工作 4.   編譯 5.   刷機

在選擇好裝置之後,系統會生成詳細的編譯資訊,這裡我們可以再确認一下源碼的分支,build号是否正确。

[Android Pro] Android源碼編譯之Nexus5真機編譯reference to : http://blog.csdn.net/liu1075538266/article/details/51272398 1.   前言 2.   實驗環境與裝置 3.   準備工作 4.   編譯 5.   刷機

然後我們就可以進行編譯了,輸入make –j16 或make –j8,j後面的參數取決于你電腦處理器的核心數,j=核心數*2,由于我的電腦是8核的,是以我選擇

make –j16

[Android Pro] Android源碼編譯之Nexus5真機編譯reference to : http://blog.csdn.net/liu1075538266/article/details/51272398 1.   前言 2.   實驗環境與裝置 3.   準備工作 4.   編譯 5.   刷機

在經過将近三個小時的編譯後,我們的源碼終于編譯完成,而此時,在源碼根目錄中多出了一個out目錄,編譯的結果就存放在裡面。

[Android Pro] Android源碼編譯之Nexus5真機編譯reference to : http://blog.csdn.net/liu1075538266/article/details/51272398 1.   前言 2.   實驗環境與裝置 3.   準備工作 4.   編譯 5.   刷機

源碼編譯完成後,我們開始将編譯好的系統燒錄進手機中。首先,先将我們的Nexus 5連接配接到電腦上,注意一定要打開USB調試,連接配接後手機可能會提示電腦要調試這台手機,允許即可。然後,我們令手機進入recovery模式,還是剛才的terminal(在源碼根目錄下),輸入以下指令:

sudo adb reboot bootloader

随後手機就會進入recovery模式。

[Android Pro] Android源碼編譯之Nexus5真機編譯reference to : http://blog.csdn.net/liu1075538266/article/details/51272398 1.   前言 2.   實驗環境與裝置 3.   準備工作 4.   編譯 5.   刷機

然後,我們開始刷機:

fastboot flashall –w  或者 fastboot -w flashall

刷機的過程大概在一至兩分鐘左右,刷機結束後會自動開機。

[Android Pro] Android源碼編譯之Nexus5真機編譯reference to : http://blog.csdn.net/liu1075538266/article/details/51272398 1.   前言 2.   實驗環境與裝置 3.   準備工作 4.   編譯 5.   刷機

 刷機成功,我們看到了我們編譯好的原生aosp版本的源碼。

[Android Pro] Android源碼編譯之Nexus5真機編譯reference to : http://blog.csdn.net/liu1075538266/article/details/51272398 1.   前言 2.   實驗環境與裝置 3.   準備工作 4.   編譯 5.   刷機
[Android Pro] Android源碼編譯之Nexus5真機編譯reference to : http://blog.csdn.net/liu1075538266/article/details/51272398 1.   前言 2.   實驗環境與裝置 3.   準備工作 4.   編譯 5.   刷機
[Android Pro] Android源碼編譯之Nexus5真機編譯reference to : http://blog.csdn.net/liu1075538266/article/details/51272398 1.   前言 2.   實驗環境與裝置 3.   準備工作 4.   編譯 5.   刷機

本文轉自demoblog部落格園部落格,原文連結http://www.cnblogs.com/0616--ataozhijia/p/7611392.html如需轉載請自行聯系原作者

demoblog