注意:編譯此代碼需要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的系統編譯完成
