如何将 Android(安卓)仿真器的速度提升 400%
16lz
2021-01-25
过去的几个月里,我一直在为 Nuxeo 内容管理平台开发 Android SDK,在制作该 SDK 的第一个官方发布版本的过程中,我又在上面做了更多的工作。现在我想和大家分享一些 Android 开发相关的测试和仿真方面的实践经验。做了几天开发之后,我发现 Android 仿真器实在是我的心头之痛,因为它实在太慢了。
首先,它启动缓慢,而且即便使用快照(Snapshot)加速启动过程,该执行过程仍然非常缓慢,特别是如果使用了调试模式的话。
就算调整 Qemu 参数也收效甚微,仿真器依然非常慢,这可能是大多数 Android 开发人员想通过 USB 连接实体设备的原因了。
我不是苹果软件开发人员,但貌似 iPhone 模拟器不会有 Android 仿真器同样的问题。
导致该局面的原因之一由于 iPhone 仿真器使用的 CPU 指令和宿主机(x86)所使用的完全相同,因此它没有运行“真正的仿真器”。
相反,Android 仿真器在 x86 处理器之上模仿真正的 ARM 处理器。这造成了很大的开销。
幸运的是,有个开源项目将 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 仿真器那样有延迟现象)。
可以参照 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 的速度大概要快上两倍。
首先,它启动缓慢,而且即便使用快照(Snapshot)加速启动过程,该执行过程仍然非常缓慢,特别是如果使用了调试模式的话。
就算调整 Qemu 参数也收效甚微,仿真器依然非常慢,这可能是大多数 Android 开发人员想通过 USB 连接实体设备的原因了。
不管怎样,我想要找到一个解决方案,同时也是因为我想能够通过一辆“宝马”来验证某个应用,而不是通过一个缓慢的应用。
我不是苹果软件开发人员,但貌似 iPhone 模拟器不会有 Android 仿真器同样的问题。
导致该局面的原因之一由于 iPhone 仿真器使用的 CPU 指令和宿主机(x86)所使用的完全相同,因此它没有运行“真正的仿真器”。
相反,Android 仿真器在 x86 处理器之上模仿真正的 ARM 处理器。这造成了很大的开销。
至少,从快速测试和验证的目的出发,我不需要模仿一个 ARM 处理器,我只需要能够运行 Android 和我的应用就够了。
幸运的是,有个开源项目将 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%
更多相关文章
- No.11 使用firewall配置的防火墙策略的生效模式
- Android(安卓)进阶2:Activity 的 Task 与启动模式
- Android中Activity和task,活动亲和力,启动模式,活动状态以及生命周
- Android模仿微信加号菜单模式
- Android关于Activity知识点总结(二)任务、返回栈与启动模式
- Activity 启动模式和 taskAffinity 属性详解
- Android中Activity启动模式详解,可以控制程序按home键后进来还会
- Android自动填写验证码
- Android(安卓)四大组件之Activity