基於Ubuntu 14.04 LTS編譯Android4.4.2源代碼

環境準備: html

基本環境:ubuntu-14.04-desktop-64bit LTS(裸機或者Windows下虛擬機安裝都可,12.04也能夠,但10.04目前不支持了) python

其餘要求:空閒磁盤空間100G以上,代碼部分接近10G,其餘爲git和編譯中間和目標文件準備 linux

========================================== android

第一部分:環境初始化 git

========================================== ubuntu

1. 安裝Oracle JDK api

注意:若是編譯Android4.4不能用OpenJDK,必須用Oracle JDK1.6,1.7目前是不支持的。 bash

具體如何安裝Oracle JDK,請參見個人另外一篇單獨的文章,[Ubuntu Linux下安裝Oracle JDK] http://blog.csdn.net/gobitan/article/details/24322561. markdown

2. 安裝必備工具軟件 網絡

注意:這裏與官方的有個包不一樣,官方的包會報錯.

 

  1. $sudo apt-get install git gnupg flex bison gperf build-essential zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dri:i386 libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386 dpkg-dev  
  2. $ sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so  

 

3. 配置USB訪問權限

將以下內容加入到/etc/udev/rules.d/51-android.rules文件中

 

  1. # adb protocol on passion (Nexus One)  
  2. SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e12", MODE="0600", OWNER="<username>"  
  3. # fastboot protocol on passion (Nexus One)  
  4. SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", ATTR{idProduct}=="0fff", MODE="0600", OWNER="<username>"  
  5. # adb protocol on crespo/crespo4g (Nexus S)  
  6. SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e22", MODE="0600", OWNER="<username>"  
  7. # fastboot protocol on crespo/crespo4g (Nexus S)  
  8. SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e20", MODE="0600", OWNER="<username>"  
  9. # adb protocol on stingray/wingray (Xoom)  
  10. SUBSYSTEM=="usb", ATTR{idVendor}=="22b8", ATTR{idProduct}=="70a9", MODE="0600", OWNER="<username>"  
  11. # fastboot protocol on stingray/wingray (Xoom)  
  12. SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="708c", MODE="0600", OWNER="<username>"  
  13. # adb protocol on maguro/toro (Galaxy Nexus)  
  14. SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", ATTR{idProduct}=="6860", MODE="0600", OWNER="<username>"  
  15. # fastboot protocol on maguro/toro (Galaxy Nexus)  
  16. SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e30", MODE="0600", OWNER="<username>"  
  17. # adb protocol on panda (PandaBoard)  
  18. SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d101", MODE="0600", OWNER="<username>"  
  19. # adb protocol on panda (PandaBoard ES)  
  20. SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="d002", MODE="0600", OWNER="<username>"  
  21. # fastboot protocol on panda (PandaBoard)  
  22. SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d022", MODE="0600", OWNER="<username>"  
  23. # usbboot protocol on panda (PandaBoard)  
  24. SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d00f", MODE="0600", OWNER="<username>"  
  25. # usbboot protocol on panda (PandaBoard ES)  
  26. SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d010", MODE="0600", OWNER="<username>"  
  27. # adb protocol on grouper/tilapia (Nexus 7)  
  28. SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e42", MODE="0600", OWNER="<username>"  
  29. # fastboot protocol on grouper/tilapia (Nexus 7)  
  30. SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e40", MODE="0600", OWNER="<username>"  
  31. # adb protocol on manta (Nexus 10)  
  32. SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee2", MODE="0600", OWNER="<username>"  
  33. # fastboot protocol on manta (Nexus 10)  
  34. SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee0", MODE="0600", OWNER="<username>"  

 

而後執行以下命令,將上述文件中的username替換爲你的用戶名。

$sudo sed -i 's/username/dennis/g' /etc/udev/rules.d/51-android.rules 

 

4. 配置ccache

安裝ccache並將export USE_CCACHE=1加入到~/.bashrc中。

  1. $sudo apt-get install ccache  
  2. $source ~/.bashrc  

 

==========================================

第二部分:源代碼下載

========================================== 

1. 安裝repo

(1) 建立目錄

  1. $ mkdir ~/bin  
  2. $ PATH=~/bin:$PATH  

 

(2) 下載repo工具

注:因爲防火牆的緣由,官方提供的連接沒法使用,需替換爲以下:

官方的爲curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo

可用的:

curl http://git-repo.googlecode.com/files/repo-1.12 > ~/bin/repo  

 

(3) 增長可執行權限

$ chmod a+x ~/bin/repo  

 

2. 初始化Repo客戶端

(1)建立目錄

  1. $mkdir aosp  
  2. $cd aosp  

(2) 初始化repo

注:後面可能出現網絡錯誤,請先將以下內容加入到/etc/hosts中而後作後面的步驟。

  1. 74.125.71.82 www.googlesource.com  
  2. 74.125.31.82 android.googlesource.com  
  3. 203.208.46.172 cache.pack.google.com  
  4. 59.24.3.173 cache.pack.google.com  
  5. 至於爲何要出現網絡錯誤,你懂的!

$repo init -u https://android.googlesource.com/platform/manifest -b android-4.4.2_r2  

 

注意:若是是在虛擬機中執行,須要採用email驗證的方式,詳細參見參考資料[2].

設置git的用戶名和郵件地址,將您的真實email地址和name替換了:

  1. git config --global user.email "you@example.com"  
  2. git config --global user.name "Your Name"  

修改aosp/.resp/manifest.xml,將fetch=".."改成:

fetch="https://android.googlesource.com/"

3. 下載源代碼

$repo sync  

注意:系統可能會提示你升級repo,最好不要升級,除非你有十足信息解決升級後的一系列問題。

 

好了,慢慢等吧,短則數小時,長則幾天幾夜!我花了5個小時

==========================================

第三部分:源代碼編譯 

==========================================

1. 設置ccache

注:aosp爲源代碼根目錄

  1. $ cd aosp  
  2. $ prebuilts/misc/linux-x86/ccache/ccache -M 50G  

2. 設置輸出目錄

略:因爲我未分區,所以採用默認的out目錄

3. 初始化編譯環境

  1. dennis@dubuntu1404:~/devenv/aosp$ . build/envsetup.sh   
  2. including device/samsung/manta/vendorsetup.sh  
  3. including device/generic/mips/vendorsetup.sh  
  4. including device/generic/armv7-a-neon/vendorsetup.sh  
  5. including device/generic/x86/vendorsetup.sh  
  6. including device/lge/mako/vendorsetup.sh  
  7. including device/lge/hammerhead/vendorsetup.sh  
  8. including device/asus/tilapia/vendorsetup.sh  
  9. including device/asus/deb/vendorsetup.sh  
  10. including device/asus/grouper/vendorsetup.sh  
  11. including device/asus/flo/vendorsetup.sh  
  12. including sdk/bash_completion/adb.bash  
  13. dennis@dubuntu1404:~/devenv/aosp$   

4. 選擇編譯目標包

注:目標包的選擇跟你的硬件有關。我這裏選擇9,mako

  1. dennis@dubuntu1404:~/devenv/aosp$ lunch  
  2. You're building on Linux  
  3. Lunch menu... pick a combo:  
  4.      1. aosp_arm-eng  
  5.      2. aosp_x86-eng  
  6.      3. aosp_mips-eng  
  7.      4. vbox_x86-eng  
  8.      5. aosp_manta-userdebug  
  9.      6. mini_mips-userdebug  
  10.      7. mini_armv7a_neon-userdebug  
  11.      8. mini_x86-userdebug  
  12.      9. aosp_mako-userdebug  
  13.      10. aosp_hammerhead-userdebug  
  14.      11. aosp_tilapia-userdebug  
  15.      12. aosp_deb-userdebug  
  16.      13. aosp_grouper-userdebug  
  17.      14. aosp_flo-userdebug  
  18. Which would you like? [aosp_arm-eng] 9  
  19. ============================================  
  20. PLATFORM_VERSION_CODENAME=REL  
  21. PLATFORM_VERSION=4.4.2  
  22. TARGET_PRODUCT=aosp_mako  
  23. TARGET_BUILD_VARIANT=userdebug  
  24. TARGET_BUILD_TYPE=release  
  25. TARGET_BUILD_APPS=  
  26. TARGET_ARCH=arm  
  27. TARGET_ARCH_VARIANT=armv7-a-neon  
  28. TARGET_CPU_VARIANT=krait  
  29. HOST_ARCH=x86  
  30. HOST_OS=linux  
  31. HOST_OS_EXTRA=Linux-3.13.0-24-generic-x86_64-with-Ubuntu-14.04-trusty  
  32. HOST_BUILD_TYPE=release  
  33. BUILD_ID=KVT49L  
  34. OUT_DIR=out  
  35. ============================================  
  36. dennis@dubuntu1404:~/devenv/aosp$ make -j4  

 

注:j4中的數字跟你的CPU個數和核數有關,詳細參見參考資料[3].

整個編譯過程,大約花了三個小時。編譯成功後會在out目錄下生成img文件。

5. 將img加載到物理機

(1) 將手機用USB數據線鏈接到機器

(2) 安裝fastboot工具

$ sudo apt-get install android-tools-fastboot  

 

(3) 設置ANDROID_PRODUCT_OUT環境變量

將以下部分加入~/.bashrc文件中:

export ANDROID_PRODUCT_OUT=/home/dennis/devenv/aosp/out/target/product/mako  

 

而後保存執行". .bashrc"使其生效。

(4) 以fastboot模式重啓手機

$ adb reboot bootloader  

 

此時手機會重啓,呈現一個與往不一樣的fastboot界面

(5) 將編譯的img刷到目標機

  1. dennis@dubuntu1404:~/devenv/aosp/out$ fastboot flashall -w  
  2. --------------------------------------------  
  3. Bootloader Version...: PRIMEMD04  
  4. Baseband Version.....: I9250XXLJ1  
  5. Serial Number........: 0146A0D00600900B  
  6. --------------------------------------------  
  7. checking product...  
  8. FAILED  
  9. Device product is 'tuna'.  
  10. Update requires 'mako'.  
  11. finished. total time: 0.035s  

(注:因爲個人物理機三星I9250在lunch裏沒有對應的型號,所以會加載失敗,這裏這是記錄過程)

===================================

若是須要編譯其餘版本,可執行以下步驟,這裏選擇虛擬機用的通用版本aosp_arm-eng。

  1. $ cd aosp  
  2. dennis@dubuntu1404:~/devenv/aosp$ . build/envsetup.sh  
  3. including device/samsung/manta/vendorsetup.sh  
  4. including device/generic/mips/vendorsetup.sh  
  5. including device/generic/armv7-a-neon/vendorsetup.sh  
  6. including device/generic/x86/vendorsetup.sh  
  7. including device/lge/mako/vendorsetup.sh  
  8. including device/lge/hammerhead/vendorsetup.sh  
  9. including device/asus/tilapia/vendorsetup.sh  
  10. including device/asus/deb/vendorsetup.sh  
  11. including device/asus/grouper/vendorsetup.sh  
  12. including device/asus/flo/vendorsetup.sh  
  13. including sdk/bash_completion/adb.bash  
  14. dennis@dubuntu1404:~/devenv/aosp$ lunch aosp_arm-eng  
  15. ============================================  
  16. PLATFORM_VERSION_CODENAME=REL  
  17. PLATFORM_VERSION=4.4.2  
  18. TARGET_PRODUCT=aosp_arm  
  19. TARGET_BUILD_VARIANT=eng  
  20. TARGET_BUILD_TYPE=release  
  21. TARGET_BUILD_APPS=  
  22. TARGET_ARCH=arm  
  23. TARGET_ARCH_VARIANT=armv7-a  
  24. TARGET_CPU_VARIANT=generic  
  25. HOST_ARCH=x86  
  26. HOST_OS=linux  
  27. HOST_OS_EXTRA=Linux-3.13.0-24-generic-x86_64-with-Ubuntu-14.04-trusty  
  28. HOST_BUILD_TYPE=release  
  29. BUILD_ID=KVT49L  
  30. OUT_DIR=out  
  31. ============================================  
  32. dennis@dubuntu1404:~/devenv/aosp$ make -j4  
  33. ============================================  
  34. PLATFORM_VERSION_CODENAME=REL  
  35. PLATFORM_VERSION=4.4.2  
  36. TARGET_PRODUCT=aosp_arm  
  37. TARGET_BUILD_VARIANT=eng  
  38. TARGET_BUILD_TYPE=release  
  39. TARGET_BUILD_APPS=  
  40. TARGET_ARCH=arm  
  41. TARGET_ARCH_VARIANT=armv7-a  
  42. TARGET_CPU_VARIANT=generic  
  43. HOST_ARCH=x86  
  44. HOST_OS=linux  
  45. HOST_OS_EXTRA=Linux-3.13.0-24-generic-x86_64-with-Ubuntu-14.04-trusty  
  46. HOST_BUILD_TYPE=release  
  47. BUILD_ID=KVT49L  
  48. OUT_DIR=out  
  49. ============================================  
  50. including ./abi/cpp/Android.mk ...  
  51. including ./art/Android.mk ...  
  52. ....中間過程省略  
  53. Install system fs image: out/target/product/generic/system.img  
  54. out/target/product/generic/system.img+ maxsize=588791808 blocksize=2112 total=576716800 reserve=5947392 

編譯完成,執行以下命令能夠將您剛build好的ROM在模擬器裏運行起來,第一次啓動的時間可能比較長:

$ emulator &

注意:若是提示找不到emulator命令,可將以下環境變量從新初始化一遍(也就是每次從新進入系統運行的時候,都須要初始化一遍),lunch後面的參數要與你編譯的ROM選項一致。

  1. $. build/envsetup.sh  
  2. $lunch aosp_arm-eng  

參考資料:

1. http://source.android.com/source/initializing.html 

2. http://source.android.com/source/downloading.html 

3. http://source.android.com/source/building-running.html 

相關文章
相關標籤/搜索