简介
现在,越来越多的移动最终用户设备支持 64 位架构。 使用 64 位安卓*系统是打入市场的理想方式。 本文将介绍英特尔® 64 位架构上的安卓系统及其独特的功能,其中包括技术详情、性能优势、问题说明,以及可用于英特尔® 凌动™ 处理器平台上的安卓系统的解决方案。
英特尔将继续针对其 64 位处理器推出领先的全新特性。 希望利用英特尔® 高级加密标准新指令(英特尔® AES-NI)以及其他创新技术的开发人员,只需在 64 位模式下对其应用进行编译即可。 英特尔正在优化面向 64 位架构的安卓系统,并创建能够为高级开发人员带来出色 CPU 功能的 SDK。
借助谷歌最近发布的 x86 64 位安卓 5.0 模拟器映像,开发人员能够针对基于英特尔凌动的设备创建 64 位应用。
安卓 32 位与 64 位
今天许多 64 位平台,包括 Solaris, AIX*、HP-UX*、Linux*、OS X*、BSD 和 BM z/OS*,都使用 LP64模式。 由于安卓系统基于 Linux 内核,安卓 64 位平台还可使用 LP64 模式 [1。 数据类型如图 1 所示。
图 1: LP32 和 LP64 模式上不同的数据类型大小
英特尔 64 位处理器具有 32 位兼容模式。 尽管 32 位应用可在 64 位处理器上运行,但使用 64 位优化编译器进行编译可帮助其充分利用 64 位环境的架构优势。
如何构建 64 位安卓应用
对于基于 NDK 的安卓应用,您需要构建原生库支持 64 位系统。 您可以执行以下步骤:
下载并安装正确的 NDK 版本。
您可以通过官方网站获得 [2] 或者从 AOSP 亲自构建。
[注: 现在针对 32 位和 64 位系统有两个版本的 NDK,首先以 R10 开始。]
对于 Windows* 和 Linux 系统,您需要解压 NDK 文件,并在系统 PATH 环境中设置正确的路径。构建库来支持 64 位系统。
记得使用 ABI x86_64 构建您的项目,使用 “ndk-build APP_ABI=x86_64” 命令。 这是在 x86 平台上针对 64 位安卓系统构建原生库的最佳方式。 对于其他平台,您需要将 APP_ABI 设置为 “arm64-v8a” 或 “mips64”。 或者,您可以将“APP_ABI = x86_64”行添加至 Application.mk,并直接使用“ndk-build”命令。
在大多数情况下,上述命令能够正常工作,但有时候会发生错误。 您应根据错误信息纠正原生代码。重新构建整个项目以获得新应用。
现在您可以安装新创建的应用,并在模拟器或目标设备上对其测试。
如何在模拟器上运行 64 位应用
如果您没有支持完整 64 位的设备,您可以在模拟器中测试您的应用。 幸运的是,Android Dev 宣布推出面向英特尔 x86 架构的安卓 L 64 位模拟器 [3]。 您可以使用安卓 SDK 管理器,下载并安装面向英特尔凌动处理器的 64 位系统映像。 如图 2 所示,在安卓 SDK 管理器中,您可以选择 Android 5.0 (API 21) 下方的“英特尔 x86 Atom_64 系统映像”并进行安装。
图 2: “安卓* SDK 管理器中的“英特尔® x86 Atom_64 系统映像”复选框
创建基于英特尔凌动处理器 64 位系统映像的新安卓虚拟设备 (AVD),并在 SDK 管理器或 ADT 中打开 AVD 管理器。 然后点击“创建”并填写相关字段,如图 3 所示。 现在 64 位 AVD 模拟器可以正常运行。
图 3: 在 AVD 中创建 x64 映像
按照下面的步骤操作在模拟器上运行 64 位应用:
- 将 /jni/application.mk 编辑为 APP_ABI := x86_64
- 编译原生文件
- 在 AVD 上作为安卓应用运行
图 4: 名为“x86_64 Hello-JNI” 的应用,在 x64 AVD 上运行
64 位 x86 安卓平台的性能
根据我们的测试,应用性能比 64 位系统更高。 我们在一台 64 位 IA 设备上运行加密演示,代号为 Bay Trail。 该加密演示可从最新版的安卓和英特尔 AES-NI 受益。 图 5 显示了加密 312M mp4 文件的结果。 在不包括 I/O 时间的情况下,32 位安卓 5.0 系统上的总时间为 1.56s;64 位安卓 5.0 系统上的总时间为 1.49s,性能提升 5% [4].
图 5: 借助英特尔® AES-NI 加密 mp4 的时间
下表中列出了详细的测试结果。
表 1: 运行加密应用的详细测试结果
总时间 (+SD R/W) | 加密时间 (-SD R/W) | ||
---|---|---|---|
安卓* 5.0 | 安卓 5.0 | 安卓 5.0 | 安卓 5.0 |
7.046. | 7.379. | 1.498. | 1.649. |
7.152. | 7.27. | 1.49. | 1.529. |
7.011. | 7.368. | 1.529. | 1.57. |
7.151. | 7.196. | 1.487. | 1.522. |
7.182. | 7.282. | 1.468. | 1.548. |
7.1084. | 7.299. | 1.4944. | 1.5636. |
此外,我们还构建了 64 位 FFMPEG 并验证了安卓 5.0 的性能。 结果显示,在相同的 Bay Trail 平台上,64 位版的平均 FPS 性能比 32 位版高 7% [4]。
图 7: 1080p MP4 播放的 FPS(通过 64 位安卓* 系统上的 FFMPEG)
下面的两个示例显示了英特尔平台上的 64 位安卓系统的性能优势。 在中国针对多个 ISV 软件的性能指标评测显示,相比使用 32 位系统,使用 64 位系统可带来 7-8% [4] 的性能提升。
一家 ISV 的多媒体解码应用:
该基准测试显示,所有格式(3gp, avi, flv, mkv, mov, mp4, rmvb, wmv)的播放性能提高约 20% (64 位相对于 32 位系统的性能提升) [4]。
图 8: 64 位安卓* 系统上的多媒体解码应用的 FPS
一家 ISV 的语音识别应用:
针对 64 位安卓系统而启用的语音组合引擎在 64 位+ ART 上的性能提升约为 ~40% (与使用 32 位相比,使用 64 位性能提升约 10% [4]。
图 9: 64 位安卓* 系统上的语音组合引擎初始化时间
我们分别在 64 位和 32 位安卓平台上分析了该 TTS 演示模块,其中包括 get token 成本、sty cpy 成本、流成本和 getline 成本: (ms)
图 10: 64 位安卓* 系统上的 TTS 密钥模块成本
该结果显示了 64 位应用的优势,尤其是对于内存 I/O 和流操作。
总结
支持 64 位技术(面向基于英特尔凌动处理器的平台)的安卓 L 现在可帮助开发人员优化其应用。 构建 64 位安卓应用与构建传统的 32 位安卓应用一样简单。 您现在可以使用官方安卓 64 位模拟器来运行和调试 64 位应用。 为了测试 64 位 x86 安卓平台的性能,我们重新构建了多个 64 位开源项目,并邀请中国多家顶级 ISV 构建 64 位版的应用。 与使用 32 位相比,使用 64 位使系统性能提升 7-8%(在某些特殊情况下甚至高达 20%)。
相关文章
64 位 Android* 操作系统
https://software.intel.com/zh-cn/android/articles/64-bit-android-os
了解安卓平台上的 x86 与 ARM 内存对齐:
https://software.intel.com/zh-cn/blogs/2011/08/18/understanding-x86-vs-arm-memory-alignment-on-android
参考资料
[1] http://en.wikipedia.org/wiki/64-bit_computing
[2] http://developer.Android.com/tools/sdk/ndk/index.html
[3] https://plus.google.com/+AndroidDevelopers/posts/XG1WmNDMe8H
[4] 性能测试中使用的软件和工作负载可能仅在英特尔微处理器上针对性能进行了优化。 诸如 SYSmark* 和 MobileMark* 等测试均系基于特定计算机系统、硬件、软件、操作系统及功能。 上述任何要素的变动都有可能导致测试结果的变化。 请参考其它信息及性能测试(包括结合其它产品使用时的运行性能)以对目标产品进行全面评估。 配置: [Asus T100 (CPU-英特尔凌动 Baytrail T Z3740,内存-2G, SSD),性能指标评测,测试人:Zhang Li& Zhou Zhen]。 更多信息敬请登录http://www.intel.com/performance
作者介绍
Zhen Zhou 拥有上海交通大学软件工程专业的硕士学位。 他于 2011 年加入英特尔,在开发商关系部门移动支持团队担任一名应用工程师。 他与内部相关各方与外部 ISV、SP 和 运营商密切合作,负责在英特尔凌动处理器、传统英特尔架构和嵌入式英特尔架构平台等领域设计新的使用模式以及开发原型。
Zhang Li 在英特尔软件和服务事业部 (SSG) 开发人员关系部门移动支持团队担任应用工程师。 他主要负责安卓平台上支持的应用。