performance - 为什么Android模拟器这么慢? 我们如何加快Android模拟器的速度?



android-emulator genymotion qemu (25)

我在x86 Windows XP Professional机器上有一个2.67 GHz Celeron处理器和1.21 GB RAM。

我的理解是Android Emulator应该在这样的机器上相当快地启动,但对我来说,它不会。 我已经按照设置IDE,SDK,JDK等的所有说明进行操作,并且在快速启动模拟器方面取得了一些成功,但这种情况非常罕见。 如果可能的话,我怎样才能解决这个问题?

即使它启动并加载主屏幕,它也非常缓慢。 我在3.5版 (Galileo)和3.4版 (Ganymede)中尝试过Eclipse IDE


Answers

好吧,既然有人建议Android x86作为替代测试模拟器,我也会提出我最喜欢的。这可能不是每个人的替代品,但对我来说它是完美的!

使用Bluestacks播放器。它运行Android 2.3.4并且非常流畅和快速。有时甚至比普通设备更快。唯一的缺点是,您可以只在一个屏幕尺寸上测试API级别10上的应用程序,但它非常适合测试它是否正常工作。与只需连接播放器adb运行

adb connect 127.0.0.1 

编译后,它会立即安装。考虑到我有相当普通的计算机硬件(具有4 GB RAM的双核),这是非常令人印象深刻的。


我在加载Eclipse(3.6.1)的Xubuntu 10.04 VirtualBox 3.2.12 guest 上运行的Intel Core i7 920 2.67 GHz CPU上有间歇慢速仿真器(SDK v8.0)加载时间,最多三分钟。我将VirtualBox guest虚拟机内存从1024 MB更改为2048 MB,从那时起,我再也没有遇到过缓慢(加载时间一致为33秒,CPU负载一致为20%)。Eclipse和模拟器都是内存生成器。


更新

您现在可以为Android Emulator启用快速启动选项。 这将保存模拟器状态,它将在下次启动时快速启动模拟器。

单击“模拟器”编辑按钮,然后单击“ 显示高级设置” 。 然后启用Quick Boot如下面的截图。

Android开发工具(ADT)9.0.0 (或更高版本)具有允许您保存AVD(模拟器)状态的功能,您可以立即启动模拟器。 您必须在创建新AVD时启用此功能,或者稍后可以通过编辑AVD来创建它。

此外,我已将Device RAM Size增加到1024 ,从而实现了非常快速的仿真器。

有关详细信息,请参阅下面给出的屏幕截图。

使用保存快照功能创建新的AVD。

从快照启动模拟器。

为了加速你的模拟器,你可以参考加速你的Android模拟器!



Android SDK rev。 17支持使用AMD和Intel虚拟化技术的虚拟机加速。

此功能可以大大提高仿真器的性能!

有关更多详细信息,请参阅Android模拟器文档中的以下部分: 配置虚拟机加速

不要忘记为您的操作系统安装适当的驱动程序:

安装驱动程序并下载Android X86系统映像后(如文档中所述),您应该能够使用x86映像创建新的AVD:

例如:

  • 目标:英特尔凌动x86系统映像 - API级别10
  • CPU / ABI:Intel Atom(x86)

这是我注意到没人提到的。

将所有可用的处理器分配给模拟器

这是你可以尝试的。它确实为我加速了模拟器,特别​​是在加载时。我注意到模拟器只使用可用CPU的单核。我将其设置为使用所有可用的处理器。

我正在使用Windows 7。

当Android模拟器启动时,打开任务管理器,在Process选项卡下查找“emulator-arm.exe”或“emulator-arm.exe * 32”...右键单击它,选择Processor Affinity和为仿真器分配尽可能多的处理器。


您可以使用以下命令创建emulator.bat以启动模拟器。 它会更快开始。

emulator.exe -cpu-delay 0 -no-boot-anim @<avd name>

或者在Unix(Mac或Linux版本)上:

emulator -cpu-delay 0 -no-boot-anim @<avd name>

我注意到如果没有连接Dalvik Debug Monitor Server(DDMS),模拟器的启动速度会快得多。 因此,如果从Virtual Device Manager“SDK Setup.exe”启动模拟器并且Eclipse未启动,则模拟器的工作速度会更快。

如果你从Eclipse启动模拟器:DDMS就在那里,所以有时候模拟器非常慢,但有时它会更快。


在开发了一段时间后,我的模拟器变得非常慢。我选择了擦除用户数据,而且效果要好得多。我猜你需要花时间加载你部署的每个APK文件。


英特尔于2012年5月15日发布了ICS仿真器的推荐安装说明 。这对我有用。 模拟器现在很快,UI很流畅。

上半部分说明已经足够详细,因此我假设您可以使用Android SDK管理器以及Intel HAXM安装Intel x86 Atom系统映像。

现在确保设置其他所有内容,以便您可以享受高性能的模拟器:

然后开始吧:

sudo kextload -b com.intel.kext.intelhaxm (mac)

如果HAXM工作正常,您可能会在启动模拟器时看到此消息:

HAX正在运行,模拟器以快速virt模式运行

否则您可能会看到此错误:

HAX无法正常工作,仿真器在仿真模式仿真器中运行:
无法打开hax模块

  • 使用GPU模拟。 在撰写本文时,使用GPU仿真时无法使用“快照”选项。 确保GPU仿真设置为“是”。

  • 将设备内存设置为1024 MB或更多 ,但不超过Intel HAXM设置。 我每台设备使用1024 MB,HAXM使用2048。

保存后请务必仔细检查设置! 模拟器对于它允许您设置的内容非常挑剔,它将在不告诉您的情况下还原配置。

使用这些设置,软件键盘不再出现,屏幕后退,菜单和最近的键也不再出现。 这似乎是当前ICS Intel x86系统映像的限制。 您需要使用键盘快捷键

在Mac OS上,您需要按住fn + control才能使F1 - F12键正常工作。 可以使用控制+箭头键执行向上/向下/向左/向右翻页。


尝试禁用您的防病毒软件。 也许它会使模拟器更快一点。


从Android SDK Tools的第17版开始,模拟器可以使用图形加速和CPU提供的扩展来提高效率。 先决条件和完整配置以及用户注释位于:

http://developer.android.com/guide/developing/devices/emulator.html#acceleration

要启用GPU备用,请从命令行运行仿真器或将“-gpu on”添加到AVD配置中的其他仿真器命令行选项。

emulator -avd <avd_name> -gpu on

要使用CPU机器扩展,必须安装驱动程序(请注意,因为它可能与现有的VirtualBoxVMware驱动程序冲突)。 安装完成后,只要您使用基于x86的AVD,它就会自动使用。


尝试使用genymotion.com for Android Studio。炽热快!只需要一次安装。没有更多的AVD疼痛。


试试Android x86 。 它比谷歌Android模拟器快得多。 跟着这些步骤:

  1. 安装VirtualBox
  2. 下载所需的ISO文件
  3. 创建一个虚拟机,如Linux 2.6 /其他Linux,512 MB RAM,HD 2 GB。 网络:PCnet-Fast III,连接到NAT 。 您也可以使用桥接适配器,但您的环境中需要DHCP服务器。
  4. 在模拟器上安装Android x86,运行它。
  5. Alt + F1 ,键入netcfg ,记住IP地址,按Alt + F7
  6. 在Windows XP系统上运行cmd,将目录更改为Android工具目录,键入adb connect <virtual_machine_IP>
  7. 启动Eclipse,打开ADT插件,找到设备,享受吧!

我注意到我的模拟器(Eclipse插件)因我的Nvidia显卡抗锯齿设置而显着减慢。从图形菜单中删除2x抗锯齿并将其更改为应用程序控制使其响应更快。它仍然很慢,但比以前更好。



Eclipse(旧版)Eclipse中包含的模拟器非常慢。

最近的模拟器比2010年更快。更新SDK / IDE。

就个人而言,我使用真正的手机进行测试。 它更快,测试更真实。 但是如果你想在很多不同的Android版本上测试你的应用程序并且不想购买几部手机,你将不得不经常使用模拟器。


使用Intel x86仿真器加速器

首先,安装Intel x86仿真器加速器(HAXM)。 这可以直接从英特尔下载或使用Android SDK Manager下载。 在SDK Manager中,它位于Extras下。

在我使用的Android Studio版本(0.8.9)中,Android SDK Manager下载了HAXM,但实际上并没有运行安装程序(我假设这将在以后的版本中修复)。 要运行已安装的我必须转到C:\ Program Files(x86)\ Android \ android-studio \ sdk \ extras \ intel \ Hardware_Accelerated_Execution_Manager并手动启动intelhaxm.exe。

HAXM与英特尔设备配合使用,因此创建了一个带有英特尔CPU的新仿真器。

使用Intel Atom x86创建新的AVD

这大大改善了一些事情,但模拟器仍然感觉有些迟钝。 最后一步是在Android虚拟设备管理器(AVD)中选择使用主机GPU。

在这些更改之后,Android Emulator在5-10秒内启动并且运行时没有任何明显的延迟。 请注意,这些功能与硬件有关(CPU / GPU),可能无法在某些系统上运行。



模拟器似乎在空闲时放慢速度。 通过快速将鼠标放在侧面的键上并观察点亮响应,可以明显看出这一点。 作为一种解决方法,我在启动模拟器时将-icount auto传递给QEMU 。 您可以创建一个名为my_avd.bat的批处理文件来为您执行此操作:

emulator @my_avd -no-boot-anim -qemu -icount auto
  • @my_avd - 启动名为“my_avd”的虚拟设备
  • -no-boot-anim - 禁用动画以加快启动速度
  • -qemu args... - 将参数传递给qemu
  • -icount [N|auto] - 启用虚拟指令计数器,每条指令有2 ^ N个时钟周期

这使动画黄油变得光滑,加速adb install十倍。


模拟器的启动非常慢。 好消息是你只需要启动模拟器一次。 如果模拟器已在运行且您再次运行应用程序,则模拟器会相对快速地重新安装应用程序。 当然,如果你想知道它在手机上运行的速度有多快,最好在真正的手机上进行测试。



您可以查看Google I / O 2011:Android开发工具谈话中的模拟器问题,从0:40:20开始。

模拟器运行缓慢,因为完整的Android环境在模拟硬件上运行,并且指令也在模拟的ARM处理器上执行。

主要的窒息点是渲染,因为它不是在任何专用硬件上运行,而是实际上是通过软件渲染来执行的。 降低屏幕尺寸将大大提高仿真器性能。 获得更多/更快的内存无济于事。

他们当时提到他们正在开发一个接口,允许模拟器通过主机硬件管理某些指令,因此最终你将能够利用桌面硬件的原始功能来利用模拟器性能。


更新: Android studio(2.x)的最新版本对捆绑的模拟器进行了重大改进。 它具有响应性,并具有一大堆功能。

对于那些仍然感兴趣的人:尝试使用Genymotion 。 您可以在注册后下载适用于Windows / Mac OS X / Linux的版本。 Eclipse的插件也可用:

可以通过启动Eclipse并转到“帮助/安装新软件”菜单来完成插件的安装,然后只需添加一个带有以下URL的新更新站点: http://plugins.genymotion.com/eclipsehttp://plugins.genymotion.com/eclipse 。 按照Eclipse指示的步骤操作。

这个模拟器快速响应。

GenyMotion允许您控制设备的各种传感器,包括电池电量,信号强度和GPS。 最新版本现在还包含相机工具。


使用gcc并将diff应用于生成的程序集只会产生以下差异:

73c68,69
<   movss   LCPI1_0(%rip), %xmm1
---
>   movabsq $0, %rcx
>   cvtsi2ssq   %rcx, %xmm1
81d76
<   subss   %xmm1, %xmm0

cvtsi2ssq速度确实慢了10倍。

显然, float版本使用从内存加载的XMM寄存器,而int版本使用cvtsi2ssq指令将实际的int值转换为float ,花费大量时间。 将-O3传递给gcc并没有帮助。 (gcc版本4.2.1。)

(使用double而不是float不重要,只不过它将cvtsi2ssq更改为cvtsi2sdq 。)

更新

一些额外的测试表明它不一定是cvtsi2ssq指令。 一旦消除(使用int ai=0;float a=ai;并使用a而不是0 ),速度差异仍然存在。 所以@Mysticial是正确的,非规范化的花车有所作为。 这可以通过测试00.1f之间的值来看出。 上述代码中的转折点大约为0.00000000000000000000000000000001 ,当循环突然花费10倍的时间。

更新<< 1

这个有趣的现象的一个小的可视化:

  • 第1列:浮动,每次迭代除以2
  • 第2列:这个浮点数的二进制表示
  • 第3栏:总计这个浮动1e7次所花费的时间

您可以清楚地看到指数(最后9位)变为其最低值,此时非规范化进入。此时,简单加法会变慢20倍。

0.000000000000000000000000000000000100000004670110: 10111100001101110010000011100000 45 ms
0.000000000000000000000000000000000050000002335055: 10111100001101110010000101100000 43 ms
0.000000000000000000000000000000000025000001167528: 10111100001101110010000001100000 43 ms
0.000000000000000000000000000000000012500000583764: 10111100001101110010000110100000 42 ms
0.000000000000000000000000000000000006250000291882: 10111100001101110010000010100000 48 ms
0.000000000000000000000000000000000003125000145941: 10111100001101110010000100100000 43 ms
0.000000000000000000000000000000000001562500072970: 10111100001101110010000000100000 42 ms
0.000000000000000000000000000000000000781250036485: 10111100001101110010000111000000 42 ms
0.000000000000000000000000000000000000390625018243: 10111100001101110010000011000000 42 ms
0.000000000000000000000000000000000000195312509121: 10111100001101110010000101000000 43 ms
0.000000000000000000000000000000000000097656254561: 10111100001101110010000001000000 42 ms
0.000000000000000000000000000000000000048828127280: 10111100001101110010000110000000 44 ms
0.000000000000000000000000000000000000024414063640: 10111100001101110010000010000000 42 ms
0.000000000000000000000000000000000000012207031820: 10111100001101110010000100000000 42 ms
0.000000000000000000000000000000000000006103515209: 01111000011011100100001000000000 789 ms
0.000000000000000000000000000000000000003051757605: 11110000110111001000010000000000 788 ms
0.000000000000000000000000000000000000001525879503: 00010001101110010000100000000000 788 ms
0.000000000000000000000000000000000000000762939751: 00100011011100100001000000000000 795 ms
0.000000000000000000000000000000000000000381469876: 01000110111001000010000000000000 896 ms
0.000000000000000000000000000000000000000190734938: 10001101110010000100000000000000 813 ms
0.000000000000000000000000000000000000000095366768: 00011011100100001000000000000000 798 ms
0.000000000000000000000000000000000000000047683384: 00110111001000010000000000000000 791 ms
0.000000000000000000000000000000000000000023841692: 01101110010000100000000000000000 802 ms
0.000000000000000000000000000000000000000011920846: 11011100100001000000000000000000 809 ms
0.000000000000000000000000000000000000000005961124: 01111001000010000000000000000000 795 ms
0.000000000000000000000000000000000000000002980562: 11110010000100000000000000000000 835 ms
0.000000000000000000000000000000000000000001490982: 00010100001000000000000000000000 864 ms
0.000000000000000000000000000000000000000000745491: 00101000010000000000000000000000 915 ms
0.000000000000000000000000000000000000000000372745: 01010000100000000000000000000000 918 ms
0.000000000000000000000000000000000000000000186373: 10100001000000000000000000000000 881 ms
0.000000000000000000000000000000000000000000092486: 01000010000000000000000000000000 857 ms
0.000000000000000000000000000000000000000000046243: 10000100000000000000000000000000 861 ms
0.000000000000000000000000000000000000000000022421: 00001000000000000000000000000000 855 ms
0.000000000000000000000000000000000000000000011210: 00010000000000000000000000000000 887 ms
0.000000000000000000000000000000000000000000005605: 00100000000000000000000000000000 799 ms
0.000000000000000000000000000000000000000000002803: 01000000000000000000000000000000 828 ms
0.000000000000000000000000000000000000000000001401: 10000000000000000000000000000000 815 ms
0.000000000000000000000000000000000000000000000000: 00000000000000000000000000000000 42 ms
0.000000000000000000000000000000000000000000000000: 00000000000000000000000000000000 42 ms
0.000000000000000000000000000000000000000000000000: 00000000000000000000000000000000 44 ms

关于ARM的等价讨论可以在问题中找到Objective-C中的非规范化浮点?





android performance android-emulator genymotion qemu