因緣際會下,剛好有機會可以練習如何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
3. install sun-java6-sdk
那因為不能用openjdk build android,
所以得換成sun(oracle)的版本,
4. install required packages
安裝一些必要的packages,
5. Configuring USB Access
因為linux預設無法access到USB device,
所以得加一些udev的rule,
先在udev底下建立一個檔案,
然後貼入下列的內容!注意!!請把owner改成你自己的ubuntu user name!
6. install Repo
接著要安裝Repo這個tool,
Repo是一個讓你可以輕鬆使用git的tool,
先在你的home目錄建立一個bin目錄,
開始下載repo tool
7. Initialize a Repo client and Download Android source
安裝好repo以後,就開始來設定他,
首先先建立一個資料夾,這資料夾準備用來存android source code,
接著就init,其實就跟git差不多,
最後-b的意思就是checkout哪個branch的意思,
設定完repo以後,就開始下載android source吧!
8. change the default shell environment
完成下載以後,在開始build之前,還有一些要設定,
ubuntu的預設的shell是dash,
那據說用dash build會fail,
所以要把它換成bash,就使用下面的指令,
使用以後,就選No!就完成了!
9. Initialize build environment
接著就要initialize你的build environment,
很簡單,靠下面一個script就可做到,
10. Choose a Target
接著就要選擇你要build的target,
有很多種可以選,可以來這看(點我)
那因為我們等等是用emulator去做測試,
所以我們是選擇aosp_arm-eng!
11. build code
接著就可以開始build,
直接下make就可以build,後面會帶一個參數是-jN,
N是一個數字,通常取決於你的hardware thread的數量!
build還蠻花時間的,我的機器在沒有做cache的情況下,build了差不多2小時..
所以耐心等待吧!
build成功以後,應該會看到下面的字樣,
12. Test
接著就要來測試剛剛build好的image是否可以使用,
如果你是使用desktop的ubuntu,
理論上你只要下下面的指令就可以測試,
但剛好我是使用server版本去build...
我又懶得裝ubuntu-desktop,
我就只好抓回來我的mac環境來測試!
注意!前提是你的mac環境已經有android-sdk,而且你也把system.img也抓回來了!
首先請先建立一個avd,就是emulator,
注意!emulator的api level要是19!
為什麼呢?
因為我們剛剛checkout branch的時候是4.4.2!
你可以利用下面的指令來建立一個avd,
接著就把你的system.img複製到剛剛建立的avd資料夾下!
只要搬到該資料夾下,等emluator啟動時,就會試著去load那個system.img!
啟動emulator
理論上看到android字樣的開機畫面,應該就代表build成功了!
(是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成功了!