注意:编译此代码需要64位系统

从intel的官网上下载android源代码,从下面的地址下载

 http://software.intel.com/en-us/articles/android-43-jelly-bean-x86-emulator-system-image

我们下载Intel_x86_sysimg_4.3_Source_Files_20130802.tar.gz这个文件,下载解压之后分别是android的源代码和kernel的源代码,分别将其解压出来得到两个目录:

1 android-goldfish-kernel_3.4
2 Intel_x86_sysimg_4.3_Source_Files

我们将android的源代码重新命名为android-4.3,我们先编译andeoid的源码,编译命令如下:

cd android-4.3/
source build/envsetup.sh
lunch full_x86-eng
make -j2

如果碰到什么错误,估计也是一些依赖关系没有安装,只需要安装即可,另外说一下本人的系统是linux mint 64位,

编译完成之后就生成了system.img等文件

接下来我们编译内核需要注意的是此处我们编译的内核是在模拟器用的内核,是不可以装在真机上的,编译步骤如下:

1 export CROSS_COMPILE=`pwd`/prebuilts/gcc/linux-x86/x86/i686-linux-android-4.6/bin/i686-linux-android-

此处的工作目录还在android-4.3下,当我们声明了以上环境变量后,需要将工作目录切换至android-goldfish-kernel_3.4,需要注意的是此操作一定要在同一个终端下才可以,之后就可以编译kernel的代码了,编译命令如下:

make ARCH=x86 goldfish_defconfig
make ARCH=x86 CC="${CROSS_COMPILE}gcc -mno-android" bzImage

编译完成之后就生成了bzImage文件.

以上的编译将生成以下文件:

1 ramdisk.img   system.img  userdata.img  bzImage

接下来我们就可以使用模拟器来启动我们编译的系统了,具体的命令如下:

1 mulator64-x86 -avd android-4.3 -system /home/xxx/android-x86/android-4.3/out/target/product/generic_x86/system.img  -kernel /home/xxx/android-x86/android-goldfish-kernel_3.4/arch/x86/boot/bzImage  -ramdisk /home/xxx/android-x86/android-4.3/out/target/product/generic_x86/ramdisk.img

需要注意的是在这里为了方便我在这里直接写了文件的绝对路径,所以如果大家编译自己的这个路径还是要自己改的。如果不出意外这个时候的系统启动是正常的。

接下里我们修改一下framework的代码,然后使用mmm命令单独编译该模块,之后我们在启动系统,却发现系统启动不正常,用adb logcat 看到系统出现了段错误,导致一直在尝试启动。在这里一直很奇怪为什么,后来上网找了一下,在google的网站上找到了这样一段:

1 make snod and emulator builds.
2 Symptom: When using make snod (make system no dependencies) on emulator builds, the resulting build doesn't work.
3 
4 Cause: All emulator builds now run Dex optimization at build time by default, which requires to follow all dependencies to re-optimize the applications each time the framework changes.
5 
6 Fix: Locally disable Dex optimizations with export WITH_DEXPREOPT=false, delete the existing optimized versions with make installclean and run a full build to re-generate non-optimized versions. After that, make snod will work.

这个问题看来是使用了dex优化导致的,接下来我们需要修改几个文件:

grep 出build 目录下所有文件的WITH_DEXPREOPT变量,将其统一修改为:

1 WITH_DEXPREOPT := false

需要修改的文件如下:

1 core/main.mk  313
2 target/board/generic_x86/BoardConfig.mk  27
3 target/board/generic_mips/BoardConfig.mk  41

修改完该文件后,执行以下命令:

1 . build/envsetup.sh
2 lunch full_x86-eng
3 export WITH_DEXPREOPT=false
4 make installclean
5 make -j4
6 make snod 

当我们再次编译完成之后,再一次启动我们的系统,可以发现已经可以正常启动,并且可以进程正常的调试。执行完上述命令以后,当我们在编译时只需要执行单独的编译命令即可以上的命令将不用在执行,如我们编译framework/base下的模块,只需要执行下面两条命令即可:

mmm framework/base
make snod

至此Android的系统编译完成