Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android源碼編譯之Nexus5真機編譯

Android源碼編譯之Nexus5真機編譯

編輯:關於Android編程

1.前言

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

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

2.實驗環境與設備

實驗設備:Nexus5(日版 D821)。

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

3.准備工作

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

3.1. 對編譯環境的一些准備

我們參照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。

\

\

\

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

首先我們要找到jdk 1.6的包,目前在oracle的官方網站上已經無法下載了,只能自己百度。在此我提供一個jdk 1.6 for Linux x64的安裝包供大家使用:http://pan.baidu.com/s/1c2e8x6S。

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

\

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

\

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

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

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

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

\

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

\

\

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

source /etc/profile

執行這個命令之後,重啟。

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

\

修改成功!

有的環境中可能會出現make版本不符合要求的情況,針對這種情況可以參考這篇博客:http://blog.csdn.net/lr2131/article/details/45673603(內附make下載地址和安裝指南)。

另外,在編譯環境的配置上,我們還需要安裝一些依賴包,Google在AOSP official guide 中已經給出了不同版本的Ubuntu需要安裝哪些依賴(http://source.android.com/source/initializing.html),摘錄如下:

\\

3.2. 對源碼和驅動版本的一些准備

在准備好了編譯環境後,我們就該准備要編譯的源碼了。此次實驗的目標是將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的開機界面中)。

首先,我們需要確定我們的設備所對應的源碼分支是哪一個,我的設備是日版Nexus 5 (即D821)Nexus 5手機只分兩個大的版本:D820和D821,D820是面向美國本土發售的機型,俗稱美版,D821是除美版之外的所有版本,即所謂亞太版。當然,在不同國家和地區也會有不同的運營商定制版本,針對這種情況也要注意,看看有沒有對應專有的源碼分支。我們可以通過http://source.android.com/source/build-numbers.html來查詢自己的設備屬於對應的源碼分支,由於我們要編譯的是Android 4.4.x版本的源碼,因此只列出此版本的分支與設備的對應關系:

\\

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

第一列是build代碼,我們根據build碼查找對應設備的驅動程序,並下載之。

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

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

第四列是對應的設備名稱,值得注意的是,同一設備即便是不同運營商發布的也可能使用不同分支的源碼,例如android-4.4.4_r2就是只針對上述運營商的定制版本的分支,而r1就支持其余的Nexus 5設備。

這裡,我們選擇android-4.4.4_r1進行編譯,因為它支持我的設備。注意要記住這個分支的build號:KTU84P,後面我們要用這個碼查找對應的設備驅動並下載。

Official guide中獲取源碼的方式是通過git+ repo的方式在線獲取,而由於Android源碼的網站https://android.googlesource.com/在正常情況下無法訪問,因此我們不采取官方提供的方式獲取源碼。事實上,我們在百度上查找一下就會發現有很多已經下載並打包好的安卓源碼,比如百度網盤中就有很多,我也是從百度網盤上找到的,在此分享一下我所需源碼的鏈接,供大家下載使用:http://pan.baidu.com/s/1skJjkfj。注意,在解壓時最好是在Linux下直接解壓,切勿在Windows環境中使用圖形化工具,如2345好壓。親測證明,使用圖形化界面解壓會導致源碼中缺失文件和文件夾。我提供的源碼是一個7z格式的壓縮包,在Linux下解壓此種格式的文件的方法可參見:http://www.educity.cn/linux/1241489.html。

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

export USE_CCACHE=1

並使環境變量文件生效。然後,我們在命令行執行

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

即可。

下載好源碼之後,我們要將驅動文件加入源碼中。我們可以在https://developers.google.com/android/nexus/drivers中找到對應設備與源碼分支的硬件驅動。此時,上一步中的build碼就該派上用場了,我們根據build碼來找到對應的驅動程序,我們剛才選擇的源碼分支所對應的build碼是KTU84P,因此,就下載此代號的驅動程序即可。

\

下載得到的是三個tgz文件,我們只需依次解壓三個文件,得到的是三個shell腳本文件,我們先將其置於源碼根目錄中。

\\

\

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

4.編譯

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

\

初始化編譯環境,輸入

. build/envsetup.sh

會出現這樣的效果。

\\

加載機型,輸入lunch命令,會列出不同設備可能編譯出的結果。

\\

在這一步中,我們選擇6號:aosp_hammerhead_userdebug,因為我們的Nexus 5設備代號就是hammerhead。

\

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

\\

在選擇好設備之後,系統會生成詳細的編譯信息,這裡我們可以再確認一下源碼的分支,build號是否正確。

\\

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

make –j16

\\

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

\\

5.刷機

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

sudo adb reboot bootloader

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

\\

然後,我們開始刷機:

fastboot flashall –w 或者 fastboot -w flashall

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

\\

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

\\\\\\

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved