24 February 2014
因緣際會下,剛好有機會可以練習如何build android source code,
(是android source code!不是app!)

不過練習完以後,發現其實build android真的很簡單!
難的在於prepare build environment.....
所以這篇會從頭做起,從一個完全乾淨的ubuntu 12.04開始做起!



1. install ubuntu 12.04

第一步就是去下載ubuntu 12.04 64 bits
要裝server版或者是desktop版都可以,
安裝desktop版的好處就是你build好image的時候,
要測試很簡單!
像我是用server版build,因為沒有x-window,我也不想再裝!
就只好把build好的image抓出來,抓到我自己的mac上,
然後透過emulator來測試!


2. install add-apt-repository

剛安裝完的ubuntu預設是沒有add-apt-repository這個package的,
所以得手動安裝,請安裝下列兩項packages
sudo apt-get install software-properties-common
sudo apt-get install python-software-properties


3. install sun-java6-sdk

那因為不能用openjdk build android,
所以得換成sun(oracle)的版本,
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java6-installer


4. install required packages

安裝一些必要的packages,
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-glx:i386 \
libgl1-mesa-dev g++-multilib mingw32 tofrodos \
python-markdown libxml2-utils xsltproc zlib1g-dev:i386
sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so


5. Configuring USB Access

因為linux預設無法access到USB device,
所以得加一些udev的rule,
先在udev底下建立一個檔案,
sudo vim /etc/udev/rules.d/51-android.rules

然後貼入下列的內容!注意!!請把owner改成你自己的ubuntu user name!
# adb protocol on passion (Nexus One)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e12", MODE="0600", OWNER="ken"
# fastboot protocol on passion (Nexus One)
SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", ATTR{idProduct}=="0fff", MODE="0600", OWNER="ken"
# adb protocol on crespo/crespo4g (Nexus S)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e22", MODE="0600", OWNER="ken"
# fastboot protocol on crespo/crespo4g (Nexus S)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e20", MODE="0600", OWNER="ken"
# adb protocol on stingray/wingray (Xoom)
SUBSYSTEM=="usb", ATTR{idVendor}=="22b8", ATTR{idProduct}=="70a9", MODE="0600", OWNER="ken"
# fastboot protocol on stingray/wingray (Xoom)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="708c", MODE="0600", OWNER="ken"
# adb protocol on maguro/toro (Galaxy Nexus)
SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", ATTR{idProduct}=="6860", MODE="0600", OWNER="ken"
# fastboot protocol on maguro/toro (Galaxy Nexus)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e30", MODE="0600", OWNER="ken"
# adb protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d101", MODE="0600", OWNER="ken"
# adb protocol on panda (PandaBoard ES)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="d002", MODE="0600", OWNER="ken"
# fastboot protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d022", MODE="0600", OWNER="ken"
# usbboot protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d00f", MODE="0600", OWNER="ken"
# usbboot protocol on panda (PandaBoard ES)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d010", MODE="0600", OWNER="ken"
# adb protocol on grouper/tilapia (Nexus 7)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e42", MODE="0600", OWNER="ken"
# fastboot protocol on grouper/tilapia (Nexus 7)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e40", MODE="0600", OWNER="ken"
# adb protocol on manta (Nexus 10)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee2", MODE="0600", OWNER="ken"
# fastboot protocol on manta (Nexus 10)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee0", MODE="0600", OWNER=“ken"


6. install Repo

接著要安裝Repo這個tool,
Repo是一個讓你可以輕鬆使用git的tool,

先在你的home目錄建立一個bin目錄,
mkdir ~/bin
PATH=~/bin:$PATH

開始下載repo tool
curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo


7. Initialize a Repo client and Download Android source

安裝好repo以後,就開始來設定他,
首先先建立一個資料夾,這資料夾準備用來存android source code,
mkdir WORKING_DIRECTORY
cd WORKING_DIRECTORY

接著就init,其實就跟git差不多,
最後-b的意思就是checkout哪個branch的意思,
repo init -u https://android.googlesource.com/platform/manifest -b android-4.4.2_r2


設定完repo以後,就開始下載android source吧!
repo sync

8. change the default shell environment

完成下載以後,在開始build之前,還有一些要設定,
ubuntu的預設的shell是dash,
那據說用dash build會fail,
所以要把它換成bash,就使用下面的指令,
使用以後,就選No!就完成了!
sudo dpkg-reconfigure dash


9. Initialize build environment

接著就要initialize你的build environment,
很簡單,靠下面一個script就可做到,
. build/envsetup.sh


10. Choose a Target

接著就要選擇你要build的target,
有很多種可以選,可以來這看(點我
那因為我們等等是用emulator去做測試,
所以我們是選擇aosp_arm-eng!
lunch aosp_arm-eng


11. build code

接著就可以開始build,
直接下make就可以build,後面會帶一個參數是-jN,
N是一個數字,通常取決於你的hardware thread的數量!
build還蠻花時間的,我的機器在沒有做cache的情況下,build了差不多2小時..
所以耐心等待吧!
make -j4

build成功以後,應該會看到下面的字樣,
Install system fs image: out/target/product/generic/system.img 
out/target/product/generic/system.img+ maxsize=588791808 blocksize=2112 total=576716800 reserve=5947392


12. Test

接著就要來測試剛剛build好的image是否可以使用,
如果你是使用desktop的ubuntu,
理論上你只要下下面的指令就可以測試,
emulator

但剛好我是使用server版本去build...
我又懶得裝ubuntu-desktop,
我就只好抓回來我的mac環境來測試!
注意!前提是你的mac環境已經有android-sdk,而且你也把system.img也抓回來了!

首先請先建立一個avd,就是emulator,
注意!emulator的api level要是19!
為什麼呢?
因為我們剛剛checkout branch的時候是4.4.2!
你可以利用下面的指令來建立一個avd,
cd ~/your_android_sdk_dir/tools
./android create avd -n test-emulator -t 15 -c 100M --abi armeabi-v7a

接著就把你的system.img複製到剛剛建立的avd資料夾下!
只要搬到該資料夾下,等emluator啟動時,就會試著去load那個system.img!
cp system.img ~/.android/test-emulator

啟動emulator
./emulator -avd test-emulator

理論上看到android字樣的開機畫面,應該就代表build成功了!




















blog comments powered by Disqus