最近一直在研究android原始碼的編譯,應該說研究的很辛苦,最難的是下原始碼,總是不停的斷掉,最後感謝公司的高網速,找到方法後12G的原始碼只花了1個小時就下完了。
一、環境設定:
官網上已經寫明ubuntu10.04,如果用其它版本編譯,可能會出現許多奇怪的問題,我採用的為ubuntu10.04-desktop-64bit,參考文章:http://www.cnblogs.com/jqyp/archive/2012/02/27/2369291.html
1、jdk的安裝
去jdk官網下載此檔案:jdk-6u45-linux-x64.bin,然後是安裝和設定java的環境變數,參考此網址:http://blog.csdn.net/jjjkl81/article/details/5895845
配置java環境變數,假設使用者名稱為:sa
# sudo gedit /home/alex/.bashrc
在 .bashrc檔案中加入:
export JAVA_HOME=/usr/lib/jvm/java/jdk1.6.0_45 export JRE_HOME=/usr/lib/jvm/java/jdk1.6.0_45/jre export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
2、安裝依賴庫
$ sudo apt-get install git-core gnupg flex bison gperf build-essential \ zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs \ x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev \ libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown \ libxml2-utils xsltproc
3、升級git,現在要求git版本最低1.7.2,因此如果發現下載的git低於1.7.2,可作如下動作:
$ sudo add-apt-repository ppa:git-core/ppa $ sudo apt-get update $ sudo apt-get install git-core curl
二、原始碼下載
(一)android4.0.1_r1原始碼下載
建議先改/etc/hosts檔案,增加檔案如下:
74.125.237.1 dl-ssl.google.com
74.125.31.82 www.googlesource.com 74.125.31.82 android.googlesource.com 203.208.46.172 cache.pack.google.com 59.24.3.173 cache.pack.google.com
1、下載Repo
$ mkdir ~/bin
$ PATH=~/bin:$PATH
$ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo
正常情況下,你已經在hosts中做了相應的更改並且重啟了機器,是不會出錯的了,如果很不幸,你連不上去,可參考這篇文章:http://www.w3c.com.cn/repo-%E8%8E%B7%E5%8F%96android%E6%BA%90%E7%A0%81,此文章可以得到可用的repo。之前我主要就是卡在域名對映這一塊,怎麼都下載不了,然後用上篇的方法下到了repo,也下到了一部份原始碼,可惜最多也只下到了5G,然後就一直連不上了,足足卡在這兒一個多星期,無比的痛苦。
2、修改執行許可權:
$ chmod a+x ~/bin/repo
3、建立並進入原始碼目錄:
$ mkdir android-4.0.1_r1
$ cd android-4.0.1_r1
4、下載android-4.0.1_r1的原始碼
$ repo init -u https://android.googlesource.com/platform/manifest
$ git --git-dir .repo/manifests/.git/ branch –a
$ repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1
$ repo sync
這一步正常的話,就是等待原始碼下載結束了,大約有12G多點。如果中途斷掉了,你可以重新執行以下命令,得以繼續下載。
$ repo sync
(二)kernel_sdk_x86原始碼下載
http://software.intel.com/en-us/blogs/2012/03/06/hands-on-notesbuild-android-x86-ics-4-virtualbox-from-google-virtualbox-target-and-intel-kernel此網頁中有一個Intel外掛的介紹:kernel_sdk_x86.tar.gz,這個是必須要用到的,點選其中的連結Intel_x86_sysimg_2.3.7_Source_Files.zip,將其下載下來即可,建議解壓縮直接到linux環境下進行,因在windows環境下會有檔案覆蓋的現象,恐會導致後面的編譯出錯。
三、原始碼編譯:
(一)kernel_sdk_x86原始碼編譯
1、之前下載的zip解壓後有一個壓縮包kernel_sdk_x86.tar.gz,這個正是我們需要的核心原始碼,將其再解壓,放置於home目錄,與android-4.0.1_r1目錄處於同一級
$ cd ~/kernel_sdk_x86
$ cp arch/x86/configs/vbox_defconfig .config
$ make ARCH=x86 menuconfig
彈出以下對話方塊:
特別注意:不能選中64-bit kernel,否則很可能編到最後會出錯,再選中兩處:
Device Driver->Input Device Support –> Mice
Network Device –>Wireless
點選Esc鍵(可能是兩次)退出儲存
2、編譯(j代表執行緒,一般用處理器數的2倍,我的有4核,所以用8執行緒編譯)
$ make ARCH=x86 –j8
After the compiling, if you see the last line that Kernel: arch/x86/boot/bzImage is ready .Then, your make is successful.
(二)android-4.0.1_r1原始碼編譯
1、進入原始碼目錄
cd ~/android-4.0.1_r1
2、拷貝核心資訊到此目錄
cp ~/kernel_sdk_x86/arch/x86/boot/bzImage ~/android-4.0.1_r1/prebuilt/android-x86/kernel/kernel-vbox
cp ~/kernel_sdk_x86/vmlinux ~/android-4.0.1_r1/prebuilt/android-x86/kernel/vmlinux-vbox
3、編譯原始碼
source build/envsetup.sh
你應該能看到以下資訊:
including device/samsung/maguro/vendorsetup.sh including device/samsung/tuna/vendorsetup.sh including device/ti/panda/vendorsetup.sh including sdk/bash_completion/adb.bash
4、lunch
$ lunch
出現以下資訊:
1. full-eng 2. full_x86-eng 3. vbox_x86-eng 4. full_maguro-userdebug 5. full_tuna-userdebug 6. full_panda-eng Which would you like? [full-eng] 3 (Note: make sure you select 3.vbox_x86-eng)
5、編譯
$ make -j8
編譯時間比較久,完了後會看到生成了一堆.img檔案。
6、設定DNS
echo "Net.eth0.dns1 = 8.8.8.8" >> ~/android-4.0.1_r1/out/target/product/vbox_x86/root/default.prop echo "Net.dns1 = 8.8.8.8" >> ~/android-4.0.1_r1/out/target/product/vbox_x86/root/default.prop
7、安裝virtualbox
apt-get install virtualbox-ose
8、編譯成vdi檔案
$ make android_disk_vdi –j8
$ make installer_vdi -j8
四、總結
至此,android原始碼基本算是結束了,關於jdk的安裝稍顯複雜了點,後面有機會我會測試直接通過命令安裝是否不需要這麼麻煩,virtualbox是必須要安裝的,否則無法生成vdi檔案,同樣,第2步拷貝的內容也是必須的,之前我忘記了這一步驟,結果一直報錯No rule to make target,把我折騰好久。