Android開發環境搭建
1 安裝VirtualBox
通過鏈接http://www.virtualbox.org/wiki/Downloads頁面選擇◦VirtualBox 4.0.8 for Windows hosts x86/amd64下載,下載得到的文件是VirtualBox-4.0.8-71778-Win.exe,直接雙擊,一步一步next完成安裝。
2 在VirtualBox中安裝Ubuntu
l 下載Ubuntu,網址http://www.ubuntu.org.cn/getubuntu/download/,我選的是最新的11.04,64-bit
l 啓動VirtualBox
l 點擊”新建”圖標,進入[新建虛擬電腦]對話框。點擊”next”,在【操作系統】中選擇linux,【版本】選Ubuntu(64 bit)
l 爲虛擬機分配內存,這裏我選擇1024,視機器配置而定,不宜超過綠色部分
l 爲虛擬機選擇虛擬硬盤,我們沒有虛擬硬盤,所以點擊【創建新的虛擬硬盤】
l 創建虛擬硬盤的時候,選擇【固定大小映像】
l 設置虛擬硬盤的位置和大小
l 生成虛擬硬盤的摘要,點擊[Finish],就開始創建虛擬硬盤,可能要等待一段時間。
l 把剛剛創建好的硬盤設爲虛擬機的啓動盤,點擊[next]
l 生成系統摘要,點擊[Finish].創建虛擬機完成
l 設置虛擬光驅,加載Ubuntu安裝光盤(剛剛下載的ubuntu-11.04-desktop-amd64.iso)。
l 在【設置】中點擊【Storage】,IDE控制器,CD/DVD Drive中,選中ubuntu安裝包
l 點擊【系統】,”處理器”tab,勾選”啓用PAE/NX”,”硬件加速”tab,勾選“啓用VT-x/AMD-v”和”啓用Nested Paging”。驅動順序可以設置爲”軟驅,硬盤,光驅”。
l 重啓,BIOS設置中,enable virtual system
l 打開Virtualbox,啓動虛擬機開始Ubuntu的安裝過程。
l 安裝增強功能。Ubuntu安裝完成後,啓動,非全屏,需要安裝addon。設備—>分配光驅àIDE控制器àchoose a virtual cd/vcd disk file,選中virtualbox裏面的“VBoxGuestAddition.iso”,我的在Program Files/Oracle/VirtualBox目錄下。Restart ubuntu,在終端中/media/VBOXADDITIONS_4.0.8_71778下執行
sudo ./VBoxLinuxAdditions.runs。Restart,完成。
l 創建共享目錄(參考http://blog.csdn.net/hz_chenwenbiaoTMB/archive/2010/07/02/5709573.aspx)。”設備”à”分配數據空間”—>”添加”。設置好數據空間位置和名字,選”固定”,名字最好中文。不要勾選”Auto-mount”。
在linux終端中:
sudo mkdir /mnt/winshare
通過mount命令就可以加載共享目錄(其中share就是剛纔設置的名字,共享文件夾的名稱不要和掛載點名稱一樣)
sudo mount –t vboxsf share /mnt/winshare
如果不想每次都手動掛載,可以在/etc/fstab中添加一項
share /mnt/winshare vboxsf defaults 0 0
l 啓用usb設備(http://blog.csdn.net/zmyde2010/archive/2010/10/16/5945008.aspx)
3 準備編譯環境
http://source.android.com/source/initializing.html
sudo apt-get install g++-multilib
4 下載android source code
http://source.android.com/source/downloading.html
5 編譯
http://source.android.com/source/building.html
6 運行模擬器
編譯成功後,emulator在~/mydroid/out/host/linux-x86/bin下,ramdisk.img,system.img和userdata.img則在~/mydroid/out/target/product/generic下(我的android目錄爲mydroid)
編輯~/.bashrc,增加環境變量
export ANDROID_PRODUCT_OUT=~/mydroid/out/target/product/generic
ANDROID_PRODUCT_OUT_BIN=~/mydroid/out/host/linux-x86/bin
export PATH=$PATH:$ANDROID_PRODUCT_OUT_BIN:$ANDROID_PRODUCT_OUT
同步這些變化
$source ~/.bashrc
運行
$emulator
7 編譯模塊
android中的一個應用程序可以單獨編譯,編譯後要重新生成system.img
在源碼目錄下執行
$ source build/envsetup.sh
就多出一些命令:
- croot: Changes directory to the top of the tree.
- m: Makes from the top of the tree.
- mm: Builds all of the modules in the current directory.
- mmm: Builds all of the modules in the supplied directories.
- cgrep: Greps on all local C/C++ files.
- jgrep: Greps on all local Java files.
- resgrep: Greps on all local res/*.xml files.
- godir: Go to the directory containing a file.
可以加—help查看用法
我們可以使用mmm來編譯指定目錄的模塊,如編譯聯繫人:
$ mmm packages/apps/Contacts/
編完之後生成兩個文件:
out/target/product/generic/data/app/ContactsTests.apk
out/target/product/generic/system/app/Contacts.apk
可以使用
$ make snod
重新生成system.img,再運行模擬器
8 tips
l 由於emulator虛擬arm指令,CPU佔用比較高,所以啓動比較慢,特別是第一次啓動,要有耐心。
l 運行模擬器時可以打開內核log輸出,看下是否有嚴重錯誤發生
$emulator –show-kernel
l 可以關閉開機動畫,加速啓動過程
$emulator –no-boot-anim
l 指定內存大小(缺省爲256M),可能對模擬器響應速度有幫助
$emulator –memory 1024
l 如果不調試audio,可以關閉audio
$emulator –noaudio
l 請help emulator的選項
$emulator –help
l 如果模擬器一直無法開啓,且無法從kernle log中分析出原因,可以看系統log,結合linux ps,top等命令,或者使用ddms工具進行分析。
$adb logcat
l MountService Patch
我在運行模擬器的時候通過logcat發現,Android啓動後卡在下面的語句上,不斷的輸出這條語句:
W/MountService( 546): Waiting too long for mReady
google之,發現需要打補丁
http://blog.csdn.net/AndyTsui/archive/2011/02/16/6188900.aspx
l 關掉重新啓動試試
9 內核編譯
l 瞭解之前編譯的android所用的內核
$adb shell
$cd proc
$cat version
顯示
Linux version 2.6.29-00261-g0097074-dirty ([email protected]) (gcc version 4.4.0 (GCC) ) #20 Wed Mar 31 09:54:02 PDT 2010
$cat cpuinfo
顯示
Processor : ARM926EJ-S rev 5 (v5l)
BogoMIPS : 153.60
Features : swp half thumb fastmult vfp edsp java
CPU implementer : 0x41
CPU architecture: 5TEJ
CPU variant : 0x0
CPU part : 0x926
CPU revision : 5
Hardware : Goldfish
Revision : 0000
Serial : 0000000000000000
爲了減少版本匹配方面的問題,確定下載2.6.29的gold_fish版本。
l 下載Android的linux內核(kernel爲本地內核保存文件夾):
$git clone git://android.git.kernel.org/kernel/common.git kernel
$cd kernel
$git branch
顯示:
$android-2.6.36
$cd kernel
顯示所有head分支
$git branch –a
顯示
$* android-2.6.36
remotes/origin/HEAD -> origin/android-2.6.36
remotes/origin/android-2.6.35
remotes/origin/android-2.6.36
remotes/origin/android-2.6.37
remotes/origin/android-2.6.38
remotes/origin/android-2.6.39
remotes/origin/archive/android-2.6.25
remotes/origin/archive/android-2.6.27
remotes/origin/archive/android-2.6.29
remotes/origin/archive/android-2.6.32
remotes/origin/archive/android-gldfish-2.6.29
remotes/origin/archive/android-goldfish-2.6.27
remotes/origin/linux-bcm43xx-2.6.39
remotes/origin/linux-wl12xx-2.6.39
此處注意2.6.26的goldfish縮寫成gldfish。
Check out android-goldfish-2.6.29版本
$git checkout -b android-goldfish-2.6.29 remotes/origin/archive/android-gldfish-2.6.29
等待下載完數據,再次確認工作分支
$git branch
顯示
android-2.6.36
* android-goldfish-2.6.29
l 交叉編譯環境設置
android代碼樹中有一個prebuilt項目,包含了我們編譯內核所需的交叉編譯工具。
tom@tom-VirtualBox:~/froyo/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin$ ls
arm-eabi-addr2line arm-eabi-c++ arm-eabi-g++ arm-eabi-gccbug arm-eabi-gdbtui arm-eabi-nm arm-eabi-ranlib arm-eabi-size
arm-eabi-ar arm-eabi-c++filt arm-eabi-gcc arm-eabi-gcov arm-eabi-gprof arm-eabi-objcopy arm-eabi-readelf arm-eabi-strings
arm-eabi-as arm-eabi-cpp arm-eabi-gcc-4.4.0 arm-eabi-gdb arm-eabi-ld arm-eabi-objdump arm-eabi-run arm-eabi-strip
$gvim ~/.bashrc
增加如下一行:
export PATH=$PATH: ~/froyo/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin
保存後,同步變化
$source ~/.bashrc
修改Kernel目錄下的Makefile文件,把CROSS_COMPILE指向的prebuilt中的arm-eabi編譯器
CROSS_COMPILE ?= arm-eabi-
把
LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,2 $(call ld-option, l$(comma)?build-id,))
這一行註釋掉,並且添加一個空的LDFLAGS_BUILD_ID定義
LDFLAGS_BUILD_ID =
l 拷貝goldfish配置文件到kernel目錄
$cp arch/arm/configs/goldfish_defconfig .
l 編譯
$make goldfish_defconfig
$make –j2
編譯較快,最後兩行信息
OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready
l 測試編譯成功的內核
$emulator –memory 1024 –show-kernel –no-boot-anim –kernel arch/arm/boot/zImage
內核啓動的log中可以看出運行了剛編譯成功的zImage。
Linux version 2.6.29-gb0d93fb-dirty (tom@tom-VirtualBox) (gcc version 4.4.0 (GCC) ) #1 Wed Jun 1 18:18:53 CST 2011