过去的几个月里,我一直在为 Nuxeo 内容管理平台开发 Android SDK,在制作该 SDK 的第一个官方发布版本的过程中,我又在上面做了更多的工作。现在我想和大家分享一些 Android 开发相关的测试和仿真方面的实践经验。做了几天开发之后,我发现 Android 仿真器实在是我的心头之痛,因为它实在太慢了。

首先,它启动缓慢,而且即便使用快照(Snapshot)加速启动过程,该执行过程仍然非常缓慢,特别是如果使用了调试模式的话。

就算调整 Qemu 参数也收效甚微,仿真器依然非常慢,这可能是大多数 Android 开发人员想通过 USB 连接实体设备的原因了。

不管怎样,我想要找到一个解决方案,同时也是因为我想能够通过一辆“宝马”来验证某个应用,而不是通过一个缓慢的应用。


“仿真”对“模拟”

我不是苹果软件开发人员,但貌似 iPhone 模拟器不会有 Android 仿真器同样的问题。

导致该局面的原因之一由于 iPhone 仿真器使用的 CPU 指令和宿主机(x86)所使用的完全相同,因此它没有运行“真正的仿真器”。

相反,Android 仿真器在 x86 处理器之上模仿真正的 ARM 处理器。这造成了很大的开销。

至少,从快速测试和验证的目的出发,我不需要模仿一个 ARM 处理器,我只需要能够运行 Android 和我的应用就够了。


Android_x86

幸运的是,有个开源项目将 Android OS 移植到了 x86 CPU 之上:http://www.android-x86.org/

该项目提供了数个镜像文件,即使从逻辑上来说,他们无法与所有 Android SDK 发行版保持同步更新,但他们为 Android 2.3 这个令人关注的 target(目标)提供了镜像。
通过 VirtualBox 设置 Android_x86

第一步是下载一个 Android_x86 ISO 镜像。我使用了从 http://www.android-x86.org/download 下载的android-x86-2.3-RC1-eeepc.iso。

接下来是创建可运行该镜像的虚拟机(Virtual Machine)。

我用了 Virtual Box 来创建,但据我了解,使用 QEmu 也是可以的。

因此,在 Virtual Box 中你应该创建一台新的机器:

target OS(目标 OS): 选择 Linux

target OS version(目标 OS 版本): others

我选择了 1GB 内存和 1 个 CPU(其他选项保留默认值)

增加一个新的硬盘:VDI drive,动态大小,512M

在 storage(存储)选项中添加一个指向所下载 iso 镜像的 CDROM

从 boot(启动)菜单中选择 install to hard disk(安装到硬盘)。

enter image description here

在设置过程中,进行如下操作:

创建一个新的分区

将它格式化成 ext3 格式

选择该分区用作 Android 安装

一旦安装完成:

关闭 VM(虚拟机)

移除指向 ISO 的光驱(通过 VirtualBox 的配置对话框)

启动 VM;现在应该有一个可以运行的 Android x86 镜像了。

但由于默认情况下其配置是为 Eee PC 设定的,用于测试面向智能手机的应用来说并不非常理想。

我们将修改设置来匹配手机屏幕。

关闭虚拟机和 VirtualBox。

第一步是定义定制的分辨率模式。我定义了 3 种模式:

VBoxManage setextradata "Android2.3" "CustomVideoMode1" "320x480x16"
VBoxManage setextradata "Android2.3" "CustomVideoMode2" "640x960x16"
VBoxManage setextradata "Android2.3" "CustomVideoMode3" "480x720x16"


其中 "Android2.3" 是 VirtualBox 中虚拟机的名称。

现在已经新的模式已经声明好,可以开始使用它们了。为此我们需要修改 kernel 参数。

为了完成这项工作,我们需要重启 VM,并在 boot 菜单中选择Debug mode(调试模式),而后 Android 将会以命令行模式启动。

启动之后,我们可以将 boot 分区以 read/write(读写)模式重新挂载,以便于修改 Grub 配置。

mount -o remount,rw /mnt

然后可以编辑 menu.lst 文件。

vi /mnt/grub/menu.lst

然后是复制第一个菜单条目(3行)并编辑 kernel 参数(第一个 "title" 条目及之后的两行)。

默认参数是:

quiet root=/dev/ram0 androidboot_hardware=eeepc acpi_sleep=s3_bios,s3_mode DPI=240 SRC=/android-2.3-RC1

我使用的参数是:

quiet root=/dev/ram0 androidboot_hardware=generic_x86 acpi_sleep=s3_bios,s3_mode DPI=240 UVESA_MODE=480x720 SRC=/android-2.3-RC1

对该标题设定所要的参数。

如果希望能够在启动时选择分辨率,还可以使用:

quiet root=/dev/ram0 androidboot_hardware=generic_x86 acpi_sleep=s3_bios,s3_mode vga=ask SRC=/android-2.3-RC1

保存 menu.lst 文件(:wq)并使用 VirtualBox 菜单重启 VM。

现在可以启动一个外观类似手机的 Android VM了。

使用 VM 的快速提示:

如果再 Android 屏幕上没有看到鼠标指针,可以通过 VirualBox 菜单禁止 mouse integration(鼠标整合)( Host Key + I)。
Win键 相当于 Android 的 Home 按钮。
Esc 相当于 Android 的 Back 按钮
F2 相当于 Android 的 Menu 按钮
F3 相当于 Android 的 Search 按钮
Alt+F1 => 切换到控制台模式
Alt+F7 => 切换到图形界面模式

将 Android x86 VM 连接到 AVD 和 Eclipse

我们的目标是能够从 Eclipse 中使用 AVD 调用新的 VM 来测试和调试应用。为了做到这一点,网络配置必须允许主机(运行Eclispe的机器)和 VM 之间的连接。为此,在 VirtualBox 的 Network settings(网络设置)中我们有几个选择:

use Bridge mode(使用桥接模式):模式可行,但是需要宿主机配置 DHCP 服务器;
host only network(仅与宿主机有网络连接): 在 VM 和宿主机之间使用内部网络;这是最简单的方案。

enter image description here

一旦设置好网络,即可重启 VM 并进入命令行模式(Alt+F1),然后输入:

netcfg

该命令将输出 VM 当前的 IP。一般情况下,VM 大概是 192.168.56.101 这样的IP,而宿主机将会绑定为 192.168.56.1.

在宿主机打开一个命令行窗口,然后 cd 进入 android 的 platform-tools 目录。

adb connect 192.168.56.101

该命令将会把 VM 注册成一个新设备:

enter image description here

现在,我们可以在 Eclipse 环境中直接调用 Android x86 VM 运行和调试应用程序了。

正如你所将要看到的,速度提升非常非常显著:

VM 启动只需 2 秒而不是 30 秒。
应用的运行和调试速度飞快(不会像使用 ARM 仿真器那样有延迟现象)。


添加 SD 卡


可以参照 http://www.android-x86.org/documents/sdcardhowto 所提供的文档。

将文件伪装成 SD 卡

从 Android 命令行运行:

dd if=/dev/zero of=/data/sdcard.img bs=1024 count=65536 (64MB image)
losetup /dev/block/loop7 /data/sdcard.img
newfs_msdos /dev/block/loop7


然后以 debug(调试)模式重启 VM,以 RW 模式重新挂载分区,然后编辑 menu.lst,向 kernel 中添加一个参数。

SDCARD=/data/sdcard.img

使用独立的分区

这种玩法需要额外做一点工作。

首先需要在 VirtualBox 中创建一个新的硬盘,然后将其配属给 VM。

然后以调试模式启动 VM。使用 fdisk 创建一个新的分区。分区创建完成后,对它进行格式化:

newfs_msdos /dev/sdb1

现在编辑 menu.lst 文件添加参数:

SDCARD=sdb1

将 Android_x86 用作测试环境的反响
用法

目前为止,x86 VM 如期运作,除了速度之外我没有提到任何真正的差别。所有的 Android 项目得以正常部署。Android API 示例项目在 NDK 之外运行正常。

唯一的可见问题是 Gallery app(Cooliris)应用无法正常运行,使用了某个 nightly build 镜像之后,效果略微好转,但仍然有问题。

还有个问题是,在10%左右的情况下,VM 无法启动,必须对它进行复位操作。由于启动非常迅速,这不并不是什么大问题,因此我没有作深入研究。
速度

速度差别真的非常显而易见。

下面的表格显示了速度提升的大概情况:

enter image description here

Android ARM 仿真器的速度约只有 Nexus One 的一半,而 Android x86 VM 的速度大概要快上两倍。

原文链接:How to speed up the Android Emulator by up to 400%



更多相关文章

  1. No.11 使用firewall配置的防火墙策略的生效模式
  2. Android(安卓)进阶2:Activity 的 Task 与启动模式
  3. Android中Activity和task,活动亲和力,启动模式,活动状态以及生命周
  4. Android模仿微信加号菜单模式
  5. Android关于Activity知识点总结(二)任务、返回栈与启动模式
  6. Activity 启动模式和 taskAffinity 属性详解
  7. Android中Activity启动模式详解,可以控制程序按home键后进来还会
  8. Android自动填写验证码
  9. Android(安卓)四大组件之Activity

随机推荐

  1. android辅助开发工具包介绍
  2. React Native之如何在Android上添加阴影
  3. app在android studio的构建过程
  4. 如何设置Android软键盘的默认不弹出?
  5. Android是否可以实现静默安装模式
  6. Android中广播的使用
  7. 扬州旅游app(一)
  8. android插件开发机制研究
  9. 关于Android高德地图4.12无法显示地图只
  10. Android React Native使用原生模块