1、搭建Android4.0.4編譯環境;
2、在build/envsetup.sh中加入如下代碼:
[cpp]
export TARGET_TOOLS_PRFIX=mips-linux-gnu-
export USE_CCACHE=1
export TARGET_PRODUCT=sdk
export TARGET_BUILD_TYPE=sdk
export TARGET_ARCH_VERSION=mips32r2
export TARGET_CPU_ARCH=24kec
export TARGET_CPU_TUNE=24kec
export TARGET_ARCH=mips
export SHOW_COMMANDS=1
編譯前要導入以下環境變量:
[cpp]
export TARGET_PRODUCT=generic
export TARGET_ARCH=mips
export TARGET_ARCH_VARIANT=mips32r2
source build/envsetup.sh
setpaths
settitle
編譯時發現TARGET_ARCH仍然是arm,後來debug發現在config.mk中執行 include$(board_config_mk)後更改了TARGET_ARCH的值,在board_config_mk賦值前加上TARGET_DEVICE:=generic_mips。發現一個奇怪的問題,執行export TARGET_DEVICE:=generic_mips 不能把變量導入到config.mk中,TARGET_DEVICE:=generic。
3、編譯時遇到的問題:
[cpp]
target Dex: framework
make: *** [out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/noproguard.classes-with-local.dex] Killed
網上說是內存不足引起的,資料有提到修改/build/core/definitions.mk中-JXmx的大小,原來是1536M,改為1024M仍然不行,改為512M後有如下錯誤:
[cpp]
UNEXPECTED TOP-LEVEL ERROR:
java.lang.OutOfMemoryError: GC overhead limit exceeded
at java.util.HashSet.<init>(HashSet.java:125)
at com.android.dx.dex.code.StdCatchBuilder.getCatchTypes(StdCatchBuilder.java:97)
at com.android.dx.dex.code.DalvCode.getCatchTypes(DalvCode.java:166)
at com.android.dx.dex.file.CodeItem.addContents(CodeItem.java:126)
at com.android.dx.dex.file.MixedItemSection.prepare0(MixedItemSection.java:280)
at com.android.dx.dex.file.Section.prepare(Section.java:214)
at com.android.dx.dex.file.DexFile.toDex0(DexFile.java:486)
at com.android.dx.dex.file.DexFile.toDex(DexFile.java:196)
at com.android.dx.command.dexer.Main.writeDex(Main.java:427)
at com.android.dx.command.dexer.Main.run(Main.java:180)
at com.android.dx.command.dexer.Main.main(Main.java:157)
at com.android.dx.command.Main.main(Main.java:89)
make: *** [out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/noproguard.classes-with-local.dex] Error 3
仍然是沒有足夠的內存。
後來看到一篇資料中有人提到增大交換分區大小,就分了2G給交換分區:
在根目錄下創建swap文件夾:
[cpp]
mkdir swap
cd swap
sudo dd if=/dev/zero of=swapfile bs=1024 count=5242880
sudo mkswap swapfile //把生成的文件轉換成 Swap 文件
sudo swapon swapfile //激活 Swap 文件
再次make不會有以上錯誤。
卸載swap文件的方法:sudo swapoff swapfile
如果需要一直保持這個 swap ,可以把它寫入 /etc/fstab 文件swapfilepath swap swap defaults 0 0,需要用具體操作是 vi打開/etc/fstab 在最後追加 /xxx/xxx swap swap defaults 0 0
4、編譯成功後在/out/target/product/generics/下生成三個img:ramdisk.img 、system.img、 user.img
5、在etc/profile中添加: www.2cto.com
[cpp]
export ANDROID_PRODUCT_OUT=/media/Android/android4.0/mipsandroid/out/target/product/generic
export ANDROID_PRODUCT_OUT_BIN=/media/Android/android4.0/mipsandroid/out/host/linux-x86/bin
export PATH=$PATH:$ANDROID_PRODUCT_OUT_BIN
6、進入/out/host/linux-x86/bin,運行:
[cpp]
./emulator -system ./data/system.img -data ./data/userdata.img -ramdisk ./data/ramdisk.img -kernel ./data/kernel-qemu -show-kernel
模擬器就運行起來了。
7、android中m,mm,mmm編譯命令的區別:
m:編譯所有的模塊
mm:編譯當前目錄下的模塊,當前目錄下要有Android.mk文件
mmm:編譯指定路徑下的模塊,指定路徑下要有Android.mk文件
要想使用這些命令,首先需要在Android源碼根目錄執行. build/envsetup.sh 腳本設置環境。
在根目錄下使用"make snod"重新生成system.img