如之前的文章提到的,现在我们已经可以在Ubuntun上通过qemu模拟beagleboard了,进一步可以测试的是在这个qemu的beagleboard上运行Android。
相关阅读:
【Ubuntu】测试Qemu上的beagleboard
在Ubuntu上通过Qemu模拟beagleboard
主要工作是制作一个qemu-system-arm可以识别的模拟sd卡文件。
在上一篇文章中我们已经分析了 linaro-media-create所创建的img文件,当时也考虑了可以将创建的img文件loop回到/dev/loopx上,然后修改这个img文件,让它包含启动Android需要的文件。不过整个过程比较麻烦。
在网上看了一下,发现Linaro项目中就有一个linaro-anroid-media-create工具可以用于创建Android的模拟sd卡,测试一下发现之前安装qemu-system的时候已经安装了linaro-anroid-media-create 工具,使用方式如下:
linaro-anroid-media-create --dev $BOARD --image-file ./myandroid.img --boot boot.tar.bz2 --system system.tar.bz2 --userdata userdata.tar.bz2
对应BeagleBoard的命令就是:
linaro-anroid-media-create --dev beagle --image-file ./myandroid.img --boot boot.tar.bz2 --system system.tar.bz2 --userdata userdata.tar.bz2
剩下的问题就是找的BeagleBoard对应的boot.tar.bz2 , system.tar.bz2 , userdata.tar.bz2这三个文件了。
下载了以上三个文件,然后执行linaro-anroid-media-create命令生成myandroid.img文件,再通过以下命令通过qemu-system-arm启动这个系统
sudo qemu-system-arm -M beaglexm -m 512 -sd ./myandroid.img -clock unix -serial stdio
然后就可以看到qemu启动,本来满心欢喜地等待Android的启动,没想到系统启动过程出错,跑到booting the kernel的时候报如下错误:
Uncompressing Linux... done, booting the kernel.
omap2_inth_read: Bad register 0x00000020
看错误的话MLO和u-boot.bin都没有问题,应该是linux kernel有问题,于是将myandroid.img文件的第一个分区loop回来,命令如下:
sudo mount -o loop,offset=$[63*512] ./myandroid.img ./mountpoint
然后删除了uImage文件,拷贝了一个之前为BeagleBoard编译Android的时候做好的uImage文件,再次启动。
这次启动成功了,看到了Android小机器人,adb也启动了,不过后面的界面就跑不起来了。查看了一下错误,可能是qemu上的模拟BeagleBoard没办法模拟HDMI的原因。于是没有细究,毕竟咱不是用这个来调试Android上的应用的,需要调试Android应用的话就直接用Android SDK上的模拟器了,有意思的是Android SDK上的Android模拟器其实也是基于qemu模拟器的。
下面是运行截图: