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 04、編譯成功後在/out/target/product/generics/下產生三個img:ramdisk.img 、system.img、 user.img5、在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