编译Android4.0.4

1、搭建Android4.0.4编译环境;按照 http://developer.mips.com/android/android-porting-guide/ 的guide下载和编译source code;

2、在build/envsetup.sh中加入如下代码:

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

编译前要导入以下环境变量:

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、编译时遇到的问题:

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后有如下错误:

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文件夹:

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中添加:

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,运行:

./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




你可能感兴趣的:(编译Android4.0.4)