作为 Android 11 开发者预览版的一部分,Google 已经发布了 Android 11 系统镜像,它们能够执行 ARM 二进制文件,性能得到了显著提升。 以前,依赖于 ARM 库而无法构建 x86 变体应用程序的开发人员要么必须使用具有完全 ARM 仿真的系统映像,这比在基于 x86 的计算机上运行的 x86 系统映像要慢得多,要么求助于物理设备。新的 Android 11 系统镜像能够在不影响整个系统的情况下将 ARM 指令翻译成 x86 指令。这允许执行 ARM 二进制文件进行测试,而不需要完全的 ARM 仿真的性能开销。
详情
这样做的意义可能需要一些上下文,特别是如果你只使用 Kotlin 或 Java 编程语言构建应用程序的话。不像 Kotlin 或 Java 编程语言,它们都在 Android Runtime (ART)上执行,Android 应用程序中的任何 C++ 都会直接编译成机器指令。这意味着需要根据目标设备的体系结构以不同的方式进行编译。移动电话往往有 ARM 处理器; 因此,许多 C++ 的依赖库,你可能会添加到你的应用程序,如相机条形码扫描器库,只兼容 ARM 处理器。如果你使用基于 x86 处理器的计算机进行开发,这将是一个问题,因为它会阻止你运行应用程序。
以前,如果你想绕过这个限制,在 x86 机器上执行一个为 ARM 构建的应用程序,你必须使用一个完全仿真 ARM 的模拟器系统映像。由于将整个系统价值的 ARM 指令转换为 x86 的开销,在 x86 主机上运行时,具有完全 ARM 仿真的仿真系统映像往往比基于 x86 的系统映像运行得慢得多。此外,具有完整 ARM 仿真的仿真系统映像无法利用 x86 处理器提供的硬件加速和 CPU 虚拟化技术。
新的与 ARM 兼容的 Android 11 系统镜像可以像往常一样利用虚拟化技术本地运行 x86 系统镜像。当一个应用程序的进程需要一个 ARM 二进制文件时,这个二进制文件会在该进程中独占地被翻译成 x86。这允许进程的其余部分继续在 x86 中执行,包括 Android Runtime (ART)和其他性能关键库,如 libGLES 和 libvulkan。此外,转换器避免了昂贵的内存访问插装和相关性能的影响,因为它避免了执行低级别的特定于硬件的库。这些新的模拟器系统映像既可以在本地使用,也可以在您自己的持续集成基础设施上使用。由于与 ARM 有限公司的合作,这是可能的。
展望未来
如果你之前因为缺乏对 ARM 的支持而选择了物理设备,那么试试 Android 11 系统镜像,它们现在可以和 Android 11 开发者预览版一起使用。 这些系统映像可以通过 SDK 管理器或 Android 虚拟设备管理器在 Android Studio 中下载。
一旦你让你的应用在模拟器上运行,可以考虑把它改造成适用于 Chrome OS的应用。 还支持在 x86 笔记本电脑上运行为 ARM 开发的 Android 应用程序。 构建 Chrome 操作系统提供了一个大屏幕设备的实质性生态系统,使你的应用程序能够触及全球更多的用户。
这项技术将使更多的开发人员能够使用 Android 模拟器进行测试。 尽管如此,Google 仍然建议开发者同时发布 x86 和 ARM ABI 的应用程序变种,以达到最佳的物理设备性能,并尽可能多地接触到用户。展望未来,Google 计划将该技术推广到更广泛的各种 API 级别,并确保它支持测试物理设备将要使用的所有用例。鉴于这是一项新技术,请通过 Google 官方的问题跟踪器反馈任何问题。
注意,ARM to x86 翻译技术使 ARM 有限公司拥有的知识产权得以实施。 它只能在 Google api 和 Play Store 系统映像上使用,并且只能用于 x86 台式机、笔记本电脑、客户本地服务器和客户购买的基于云的环境中的应用程序开发和调试。该技术不应用于提供商业托管服务。
原文作者:Michael Hazard
原文地址:https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html
版权声明
禁止一切形式的转载-禁止商用-禁止衍生 申请授权