当前位置:操作系统 > 安卓/Android >>

编译Android4.0.4

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.zzzyk.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
 
补充:移动开发 , Android ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,