dianlunhui 2014-03-18
转载: http://software.intel.com/zh-cn/android/articles/speeding-up-the-android-emulator-on-intel-architecture/?utm_campaign=CSDN&utm_source=intel.csdn.net&utm_medium=Link&utm_content=intelandroid-moniqi
如果您是一名 Android* 开发人员,而且对 Android 模拟器的性能不满意,请阅读本文。 我们经常听到许多 Android 开发人员抱怨模拟器速度缓慢而且难以操作,但是事实并不应该如此! 如果您使用的是采用英特尔® 处理器且支持英特尔® 虚拟化技术并运行 Microsoft Windows* 或 Apple Mac OS* 的新电脑,那么您可以使用英特尔® 硬件加速执行管理器(英特尔® HAXM)或 KVM for Linux* 来轻松地大幅提升 Android 模拟器的性能,进而加快 Android 应用的测试和调试速度。 本文详细介绍了加速模拟器所需的步骤以及如何对其进行操作。 然后,我们将介绍如何使用 NDK 编译 x86 原生代码以及如何将包含 x86 原生库的 APK 提交至 Google Play 商店。 英特尔 HAXM 还可用于加速 Tizen* 模拟器,但这不在本文的讨论范围之内。 如欲获取更多信息,请访问 tizen.org,了解 SDK 部分的内容。
1. 简介
2. 安装
2.1. 前提条件
2.2. 在 Windows 上安装
2.3. 在 Linux 上安装
2.3.1. KVM 安装
2.4. 创建 AVD(Android* 虚拟设备)
3. 公认的最佳方法
3.1. 在 Eclipse 中使用模拟器测试应用
3.2. 提交多种面向不同 ABI 的 APK 与提交 fat 二进制文件至 Google Play
3.3. 编译面向 x86 的 NDK
3.3.1. 将 NDK 路径添加至环境变量
3.3.2. 使用 NDK 编译
3.3.3. 使用 NDK 编译的其他方法
本文将为您安装英特尔® 硬件加速执行管理器(英特尔® HAXM)提供指导。英特尔® HAXM 是一款硬件辅助虚拟化引擎(管理程序),它可通过英特尔® 虚拟化技术(英特尔® VT)在 Windows* 上加快 Android* 开发速度。 此外,它还介绍了如何在 Linux* 上安装硬件辅助 KVM,并介绍了如何使用公认的最佳方法进行原生编译并将应用提交至面向 x86 的 Google Play 商店。
安装 Android SDK 后,请打开 SDK 管理器。 在附加部分,您可以找到英特尔 HAXM。
勾选方框并点击“Install packages…”按钮,安装软件包后,状态即会显示为“Installed”,这是误导,事实并非如此。 SDK 仅在您的设备上复制了英特尔 HAXM 可执行文件,而是否安装这些可执行文件则取决于您。
如要安装英特尔 HAXM 可执行文件,请在您的硬盘中搜索 IntelHaxm.exe(在 Mac OS X 上请搜索 IntelHAXM.dmg)。 如果您设置为默认,该文件应该位于以下目录:C:\Program Files\Android\android-sdk\extras\Intel\Hardware_Accelerated_Execution_Manager\IntelHaxm.exe。
英特尔 HAXM 仅可与英特尔® 凌动? 处理器 x86 系统映像一起使用, 该映像可用于 Android 2.3.3 (API 10)、4.0.3 (API 15)、4.1.2 (API 16)、4.2.2 (API 17)。 通过 SDK 管理器,这些英特尔系统映像的安装方法与基于 ARM 的映像的安装方法完全相同。
点击 IntelHaxm 可执行文件时,将会显示如下欢迎界面:
您可以调整分配给英特尔 HAXM 的 RAM 内存容量。 然后请点击“Next”。 下一界面将确认内存分配。 如果符合您的要求,请点击“Install”。
为了能够安装英特 HAXM,您需要在 BIOS 中启用英特尔 VT-x,否则在安装过程中将会出现类似以下的错误:
如果出现此错误,请进入将您的 BIOS 并启用该特性。
第二种下载英特尔 HAXM 和 x86 模拟器系统映像的方法是直接访问以下网站: http://software.intel.com/en-us/android,并通过此网站下载必要的组件。
提升面向 Linux 的 Android 模拟器的性能的步骤与 Windows 和 Mac OS X 不同,因为英特尔 HAXM 与 Linux 不兼容,所以您需要使用 KVM(基于内核的虚拟机)来替代。 以下是使用 Ubuntu* 12.04 的执行步骤,可能会与其他 Linux 版本稍有不同。
在 Windows(和 Mac OS X)中操作时,首先要从 Android 开发人员站点下载 Android SDK。 您将会看到一个 ADT(Android 开发人员工具)包,其中包含 Eclipse* IDE 和 Android SDK。 下载 zip 文件并将其解压缩至您的 Linux 设备。 确保选择了适合您 Linux 版本的文件,32 位或 64 位。 您可以通过以下命令对此进行检查:
file /sbin/init
在开始安装 KVM 所需的软件包之前,建议您确认已具有最新的库,您可以通过输入以下命令进行确认:
sudo apt-get update
如要安装和运行 KVM(一款 x86 硬件之上面向 Linux 的完全虚拟化解决方案,即英特尔 VT),首先需要检查您的 CPU 是否支持硬件虚拟化。您可以通过输入以下命令来确认:
egrep –c ‘(vmx|svm)’ /proc/cpuinfo
如果结果为 0,则表明您的 CPU 不支持硬件虚拟化,而硬件虚拟化是运行 KVM 的必要条件。 如果结果为 1 或大于 1 ,则表明您可以安装和运行 KVM,但仍需确认是否已经在 BIOS 中开启这一功能(请参阅 2.2 节)。
接下来,如果您尚未安装 KVM,请进行安装。 您可以通过输入以下命令来检查您的处理器是否支持 KVM:
kvm-ok
如果您已具有 KVM,则会看到:
"INFO: Your CPU supports KVM extensions
INFO: /dev/kvm exists
KVM acceleration can be used"
否则的话,如果您看到以下消息,需要进入 BIOS,然后开启英特尔 VT:
"INFO: KVM is disabled by your BIOS
HINT: Enter your BIOS setup and enable Virtualization Technology (VT),
and then hard poweroff/poweron your system
KVM acceleration can NOT be used"
接下来需安装 KVM 和所需的其他几个软件包。 为此,请输入:
sudo apt-get install qemu-kvm libvirt-bin ubuntu-vm-builder bridge-utils
在下一窗口中,如果您不想变更配置,可以选择“No configuration”:
然后,将您的用户添加至 KVM 组和 libvirtd 组。 为此,请输入:
sudo adduser your_user_name kvm
sudo adduser your_user_name libvirtd
完成安装后,请重新登录,以使变更生效。 您可以通过输入以下命令对安装进行测试:
sudo virsh -c qemu:///system list
现在您可以准备进入下一步操作了,即创建和运行 AVD(Android 虚拟机)。 这一步操作对于 Linux 和 Windows 是相同的。
完成 SDK 和英特尔 HAXM(或 Linux 的 KVM)安装后,您可以创建一个带有硬件加速模拟的虚拟设备。 如要进行该操作,请进入 AVD 管理器并创建一个新设备。 确保将英特尔凌动 (x86) 选作 CPU/ABI。 只要安装了英特尔 x86 系统映像,即会在下拉菜单中显示选择,以便在创建 AVD 时在 GPU 模拟上顺畅地进行其他图形切换。
点击“New”并创建 x86 AVD。 确保选择了一个由 x86 系统映像支持的 API,将 CPU/ABI 设置为 x86,而且已经启用了 GPU (OpenGL ES*) 模拟。 完成该操作后,点击“Create AVD”,创建 AVD。 | |
可以通过依次点击“Start”和“Launch”来启动 x86 AVD。 |
如果您已成功安装,在模拟器启动时,将会出现一个对话框,显示英特尔 HAXM 已在快速虚拟模式下运行。
如果您需要进一步确认您使用的是否为 x86 系统映像,可以查看模拟器内“About phone”中的详细信息。
英特尔 HAXM 或 KVM 的性能取决于您的电脑、硬盘和内存等,但是会有 5 倍到 10 倍的大幅提升。 以下截图显示了 x86/HAXM 支持的 AVD 与基于 ARM 的 AVD 之间的详细对比。 x86 AVD 会在 15 秒内进入锁屏状态,而非英特尔 AVD 则会花费 40 秒钟,这是一个明显的差别。
[根据您的系统配置,英特尔 HAXM(或 KVM)的性能会有 5 到 10 倍的提升: 在性能检测过程中涉及的软件及其性能只有在英特尔微处理器的架构下方能得到优化。 诸如 SYSmark* 和 MobileMark* 等测试均系基于特定计算机系统、组件、软件、操作及功能。 上述任何要素的变动都有可能导致测试结果的变化。 请参考其他信息及性能测试(包括结合其他产品使用时的运行性能)以对目标产品进行全面评估。 配置: 在此案例中使用 Mac Book Pro 进行测试。 更多信息敬请登陆 http://www.intel.com/performance]
无论是基于 NDK 的应用还是 Dalvik* 应用,您都可以使用英特尔 HAXM 来提高您用于测试的模拟器的性能。 如果您使用 Eclipse 进行开发,在启动模拟器时,可以按照以下这些简单步骤确认您使用的是英特尔 HAXM。
首先,确认您已按照步骤 2 的描述创建了 AVD。如果已创建完成 AVD,请进入“Run As -> Run Config”,如下所示:
您应该会进入一个类似以下的页面:
您可以勾选相应的方框,选择您想要的 AVD。 创建 AVD 并进行相应配置后,可以选择“Run As -> Android Application”,使用模拟器对项目进行编译和调试。 这将自动开启硬件加速 AVD。
AVD 启动后,您应该可以看到应用的主界面(在屏幕解锁后)。
以前,您需要为所开发的应用提交一个 fat 二进制文件,其中应该包含所有库以及 NDK 文件,无法在架构间区分它们。 这就意味着用户必须下载整个 APK,但是其中包含的一些文件与特定的架构并无关联,即 x86 用户可能具有 ARM 代码,反之亦然。 其缺陷在于如果您具有一个 fat 二进制文件,会强迫用户下载大量数据,而这些数据可能并不适用于设备。 通常情况下,如果您的 APK 小于 10 到 20 MB,还是可以接受的。
英特尔/谷歌目前已经实施了 CPU 过滤机制,也就是说,您可以按照建议的版本代码(如下所示)进行操作,针对各架构提交多个包含不同库的 APK。
第一位数字代表 ABI(即 6 代表 x86);然后是您需要的 API 级别(即 11);屏幕大小(13);以及应用的版本编号: 3.1.0.
确保您至少具有一个 8 位的版本编号,并将最高的首位数分配给 x86 版本。 在上述示例中,您需要输入 6 来代表 x86、2 代表 ARMv7 以及 1 代表 ARMv5TE。 这样操作将会使得 x86 版本成为 x86 设备的首选,而 ARM 版本成为 ARM 设备的首选。
按照这些指南进行操作后,可以确定您的用户会在自身的设备上实现最佳性能。 此外,还可以避免用户由于代码转换问题尝试在特定的设备上运行应用。
如欲获取更多信息,请访问: http://software.intel.com/en-us/articles/google-play-supports-cpu-architecture-filtering-for-multiple-apk。
这一章节将向您介绍如何针对 x86 编译您应用的 NDK 部分。
为了能够让基于 NDK 的应用在 x86 AVD 上运行,您需要针对 x86 架构编译 NDK 库。 为此,请采取以下简单的步骤:
打开一个命令提示符,并导航至您 NDK 文件所在的文件夹,如下所示:
确保您已经设置了环境变量路径,以便从任意位置使用 ndk-build 脚本。
要想针对 NDK 设置环境变量。您需要右击“Computer”,然后选择“Properties”。 进入“Advanced system settings”并找到环境变量。 选择“Path”并点击“Edit”。 在“Variable Value”字符串的结尾,将路径添加至 NDK 的根文件夹,其中包含 ndk-build.cmd 文件,如下图所示:
将命令提示符导航至 NDK 文件夹后,执行:
ndk-build APP_ABI:=all
这将针对各架构变量编译 NDK 文件,即 ARMv5TE、ARMv7、x86 和 mips。
如要针对特定架构进行编译,请将“all”替换为不同的架构。 例如:
ndk-build APP_ABI:=armeabi armeabi-v7a x86 mips
确保在 Eclipse 中刷新项目以获取最新的设置,即 ndk-build 脚本创建的最新文件夹。 现在,在项目的文件夹库中,应该可以看到四个文件夹,每个架构一个文件夹。
现在,您可以在 x86 AVD 中使用您的 NDK 应用了。
针对所有架构(包括 x86 )编译原生代码还有另外的方法,即修改 Application.mk 文件,该文件位于 jni 文件夹中。 如果您没有 Application.mk 文件,可以自己创建一个并添加以下指令:
APP_ABI:=armeabi armeabi-v7a x86 mips
这样,在批处理文件时(即 ndk-build 脚本),将会针对所有可用架构编译库。
此外,为了简化应用,可以仅输入“all”,而不用列出所有架构:
APP_ABI:=all