可以参考:http://blog.csdn.net/luoshengyang/article/details/6559955
http://blog.csdn.net/ygm_linux/article/details/19165277
一. 下载Linux Kernel for Android源代码。
1. 使用GIT工具下载,执行以下命令:
$ mkdir kernel
$ cd kernel
$ git clone http://android.googlesource.com/kernel/goldfish.git
同样是经过漫长的等待后,在kernel目录下有一个goldfish目录,Linux内核代码就在这里了。
2. 下载完成后,可以查看下载的内核代码版本:
$cd goldfish
$git branch
android-2.6.36
3. 上面得到的是主线上的内核源代码,现在我们需要适用于模拟器用的内核,因此,我们需要checkout goldfish版本:
$ git branch -a
* android-2.6.36
remotes/origin/HEAD -> origin/android-2.6.36
remotes/origin/android-2.6.35
remotes/origin/android-2.6.36
选择android-gldfish-2.6.29:
USER-NAME@MACHINE-NAME:~/Android/kernel/goldfish$ git checkout remotes/origin/archive/android-gldfish-2.6.29
或者git checkout -b android-goldfish-2.6.29 remotes/origin/android-goldfish-2.6.29
二、下载andriod源码
拷贝源码则注意:http://blog.csdn.net/ygm_linux/article/details/19161159
将repo放到/usr/bin下
soft# apt-get install git-core gnupg
进入andriod_source目录下执行
#repo init -u http://android.googlesource.com/platform/manifest
#repo init -u http://android.googlesource.com/platform/manifest -b android-4.0.1_r1
#repo sync
repo sync出现“fatal: '../platform/abi/cpp.git' does not appear to be a git repository”的解决方案
在我下载Android源代码时,在最后一步调用repo sync,出现“fatal: '../platform/abi/cpp.git' does not appear to be a git repository”
1、在存放android系统源代码的目录(也就是执行repo sync命令的目录)下,有个.repo的隐藏目录,用ls -a可以查看的到,进入该目录:cd .repo;
2、打开.repo目录下的manifest.xml文件(命令vim manifest.xml)并找到fetch属性,在我的文件中显示fetch="..",将fetch修改为fetch="git://Android.git.linaro.org/",保存并退出;
3、继续repo sync就可以下载了。
三、交叉编译器arm-2009q1-203-arm-none-linux-gnueabi 安装
注意:参考http://blog.csdn.net/ygm_linux/article/details/19115109
(注意自己的虚拟机是32位还是64位的,这样需要下载不同的交叉编译器的;file 命令可以看自己下载的编译器是32还是64位的)
1. 下载包
cd /home/ygm/andriod/soft
wget http://www.codesourcery.com/sgpp/lite/arm/portal/package4571/public/arm-none-linux-gnueabi/arm-2009q1-203-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
2. 解压
tar -vxjf arm-2009q1-203-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
3. env设置
/etc/profile 最后加上
export PATH="/home/ygm/andriod/soft/arm-2009q1/bin:$PATH"
说明(我在12.04-32位下面时候,这样有的目录下不起作用的,解决方法:
#gedit /etc/bash.bashrc
输入
#compler
export PATH=$PATH:/home/ygm/compler/arm-2009q1/bin
)
4. 生效env设置
source /etc/profile
5. 测试
~$ arm-none-linux-gnueabi-gcc
最好注销下虚拟机额!
四、编译Linux Kernel
(图示可以参考老哥:http://blog.csdn.net/ygm_linux/article/details/19159465)
$cd goldfish
$gedit Makefile
修改193行左右:
# ARCH
?= (SUBARCH)
# CROSS_COMPILE
?=
改为
ARCH ?= arm
CROSS_COMPILE ?= arm-none-linux-gnueabi-
shanl@ubuntu:~/Android/android-2.3.5_r1/kernel/goldfish$ make goldfish_defconfig
或者make goldfish_armv7_defconfig (最后android模拟器加载时候需要arm v7的)
shanl@ubuntu:~/Android/android-2.3.5_r1/kernel/goldfish$ make
编译成功后,可看到下面两行:
OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready
在执行make命令前,你也可以执行make menuconfig先配置一下编译选项。
root@ygm-virtual-machine:/home/ygm/andriod/kernel/goldfish# cd arch/arm/boot/
root@ygm-virtual-machine:/home/ygm/andriod/kernel/goldfish/arch/arm/boot# ls
bootp compressed Image install.sh Makefile zImage
编译android源码
12.04编译器为4.6的,太高了,换为4.4的,参考http://blog.csdn.net/ygm_linux/article/details/19117847
编译出错参考:http://blog.csdn.net/ygm_linux/article/details/19161849
root@ubuntu:/home/ygm/android/android-down# ./build/envsetup.sh
including device/samsung/maguro/vendorsetup.sh
including device/samsung/tuna/vendorsetup.sh
including device/ti/panda/vendorsetup.sh
including sdk/bash_completion/adb.bash
root@ubuntu:/home/ygm/android/android-down# make
/bin/bash: bison: command not found
root@ubuntu:/home/ygm/android/android-down# apt-get install bison
root@ubuntu:/home/ygm/android/android-down# make
/usr/bin/ld: cannot find -lz
编译的时候出现"/usr/bin/ld: cannot find -lz"错误,需要安装zlib-dev这个包,在线安装命令为:apt-get install zlib1g-dev。
/bin/bash: flex: command not found
out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_y.cpp: In function ‘int yyparse()’:
out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_y.cpp:1827: warning: deprecated conversion from string constant to ‘char*’
out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_y.cpp:1970: warning: deprecated conversion from string constant to ‘char*’
Lex: aidl <= frameworks/base/tools/aidl/aidl_language_l.l
/bin/bash: flex: command not found
make: *** [out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_l.cpp] Error 127
解决方法: sudo apt-get install flex
出错
eglplatform.h:85: fatal error: X11/Xlib.h: No such file or directory
解决如下:
root@ubuntu:/home/ygm/android/android-down# apt-get install libx11-dev
出错
/usr/bin/ld: cannot find -lncurses
解决如下
apt-get install libncurses5-dev
出错
GLDispatch.cpp:22: fatal error: GL/glx.h: No such file or directory
解决如下
apt-get install libgl1-mesa-dev
出错
sh: 1: sh: 1: gperf: not found
解决
apt-get install gperf
-----------------------------------------------------------------------------------------------------------
最后 安装编译好的Android镜像到模拟器上。
说明:~ 表示/home/用户名/
1. 设置环境变量:
USER-NAME@MACHINE-NAME:~/Android$ export PATH=$PATH:/home/ygm/android/android-down/out/host/linux-x86/bin
USER-NAME@MACHINE-NAME:~/Android$
export ANDROID_PRODUCT_OUT=/home/ygm/android/android-down/out/target/product/generic
其中,
/home/ygm/android/android-down/out/host/linux-x86/bin
有我们要执行的emulator命令
,而
/home/ygm/android/android-down/out/target/product/generic
是Android镜像存放目录
,下面执行emulator命令时会用到。
2. 运行模拟器。
USER-NAME@MACHINE-NAME:~/Android$ emulator
模拟器运行需要四个文件,分别是Linux Kernel镜像zImage和Android镜像文件system.img、userdata.img和ramdisk.img。
执行emulator命令时,如果不带任何参数,则Linux Kernel镜像默认使用~/Android/prebuilt/android-arm/kernel目录下的kernel-qemu文件,而Android镜像文件则默认使用ANDROID_PRODUCT_OUT目录下的system.img、userdata.img和ramdisk.img,也就是我们刚刚编译出来的镜像问题。
当然,我们也可以以指定的镜像文件来运行模拟器,即运行emulator时,即:
USER-NAME@MACHINE-NAME:~/Android$ emulator
-kernel./prebuilt/android-arm/kernel/kernel-qemu
-sysdir./out/target/product/generic
-systemsystem.img
-datauserdata.img
-ramdiskramdisk.img
(上面连起来输入的额)
到这里,我们就可以在模拟器上运行我们自己编译的Android镜像文件了,是不是很酷呢?但是注意,这里说的Android镜像文件,只是包括system.img、userdata.img和ramdisk.img这三个文件,而Linux Kernel镜像用的是Android为我们预编译好的kernel-qemu镜像。那么,有没有办法使用我们自己编译的Linux Kernel镜像呢?答案上肯定的,这样我们就可以完全DIY自己的Android系统了!我将在下一篇文章描述如果编译自己的Linux Kernel镜像,敬请期待~
我的操作如下:
root@ubuntu:/# gedit /etc/bash.bashrc
#emulator
export PATH=$PATH:/home/skape/Android/Android-4.0-share/out/host/linux-x86/bin
export ANDROID_PRODUCT_OUT=/home/skape/Android/Android-4.0-share/out/target/product/generic
root@ubuntu:/# source /etc/bash.bashrc
再
#./emulator -kernel /home/skape/Android/kernel/goldfish/arch/arm/boot/zImage
-sysdir /home/skape/Android/Android-4.0-share/out/target/product/generic
-system system.img
-data userdata.img
-ramdiskramdisk.img
qemu: could not load initrd 'ramdisk.img'
所以:
root@ubuntu:/# emulator -kernel /home/skape/Android/kernel/goldfish/arch/arm/boot/zImage -sysdir /home/skape/Android/Android-4.0-share/out/target/product/generic -system system.img -data userdata.img
参考:
还有可能说ramdisk.img不能执行的,qemu: could not load initrd 'ramdisk.img'
请给权限 chmod 777 ./out/target/product/generic,并带上绝对路径out/target/product/generic/ramdisk.img,这样应该就能跑起来了;
还有一个就是启动黑屏的,请使用命令中的kernel,即:kernel-qemu-armv7
执行 emulator 提示 emulator: WARNING: system partition size adjusted to match image file (166 MB > 66 MB)
所需空间不足,emulator 加入参数 -partition-size 1024 (大于系统所要求的尺寸)即可,例如 emulator -partition-size 1024