产品资讯

准备您的应用以适应更高的内存限制

阅读用时:2 分钟
查看 Blair Harmon 的个人资料
Blair Harmon Android 平台产品管理总监

提供出色的用户体验是 Android 的核心使命,而要实现这一目标,就必须确保设备快速、灵敏且可靠。正因如此,内存优化比以往任何时候都更加重要。在整个生态系统中,新设备都在因内存价格上涨而保持甚至降低其物理内存容量,但用户仍然希望获得同样流畅、高性能的应用体验。

在 Android 17 中,我们引入了应用级内存限制,首先在 Pixel 设备上实施,以帮助保护整体用户体验,防止应用使用过多内存并导致系统范围的运行速度变慢。在未来一年内,越来越多的制造商将在其设备 RAM 配置(从 4GB 到 16GB 以上)的整个产品组合中利用 Android 的应用内存限制。 如果您的应用超出这些限制,运行速度会变慢,并且可能会被终止。优化应用的内存占用空间对于防止操作系统节流和保持顺畅的用户体验至关重要。  

在本文中,我们将探讨这些限制在幕后是如何运作的,如何使用新的 Android Vitals 指标来衡量内存占用空间,以及如何采取切实可行的步骤来优化应用或游戏。

了解内存限制

当应用超出其内存预算时,Android 会采取渐进式措施来保护设备响应能力:

  1. zRAM 交换:如果应用达到其分配的限制,系统会将应用的页面强制移入 zRAM(压缩 RAM)。虽然 zRAM 可以防止立即逐出,但压缩和解压缩页面会增加 CPU 开销,从而导致明显的界面卡顿和体验变慢。
  2. 进程终止:如果应用继续增加其内存用量,超出 zRAM 阈值,系统会终止该应用。如需确定您的应用会话是否在实际应用中受到这些限制的影响,您可以在 ApplicationExitInfo 内调用 getDescription()。如果系统应用了限制,则退出原因会报告为 REASON_OTHER,并且说明字符串将包含“MemoryLimiter:AnonSwap”。您还可以利用使用 TRIGGER_TYPE_ANOMALY基于触发器的分析,在达到内存限制时自动捕获堆转储。  

如需详细了解各个应用的内存限制和系统强制执行,请参阅 Android 17 应用内存限制文档。如需在不同的设备配置上测试应用,请使用 Memory Limiter adb 命令

监控和诊断内存问题

如果连转化数据都测不准,优化就无从谈起。若要识别整个 Android 生态系统中的内存泄漏、过多的堆分配和内存不足 (OOM) 崩溃,需要利用互补的监控工具:

  • 利用 Android Vitals 了解宏观健康状况:为了在不增加额外开销的情况下获得广泛的人群级可见性,Google Play 管理中心的 Android Vitals 提供了一些基本指标,例如内存用量(匿名 RSS + 交换空间) 位图内存用量。这样一来,您就可以清晰地了解不同进程状态(前台、后台、用户感知到的服务和缓存)和 RAM 等级范围内的内存分布情况,从而帮助您发现内存异常值。
  • 通过 Firebase Crashlytics 跟踪内存限制器退出和 OOM:为了在严重内存降级影响关键指标之前及时了解相关情况,Crashlytics 版本 20.1.0 引入了额外的调试数据,可帮助您捕获、确定优先级并修复内存不足异常和内存限制器终止问题。通过跟踪这些事件以及自定义日志和键值对元数据,您可以在发生内存故障时立即了解进程状态。
  • 使用 ProfilingManager 进行实地跟踪:对于能够维护性能可观测性框架的团队,Android 15(API 级别 35)中引入的 ProfilingManager API 允许您的应用直接从生产设备以编程方式请求和收集详细的内存调试制品,例如 Java 堆转储和堆配置文件。您还可以根据特定的系统信号(例如 TRIGGER_TYPE_OOM 和 TRIGGER_TYPE_ANOMALY)触发堆转储捕获。 

如需详细了解其他内存监控技术,请参阅我们的文档

总结与后续步骤

随着 Android 在所有 RAM 类中扩大每个应用的内存限制,现在是审核内存占用情况的好时机:

  1. 优先考虑内存优化:使用最佳实践,防止应用受到应用内存限制的影响。
  2. 监控内存使用情况监控应用的内存行为,以检测和解决异常行为。  
  3. 优化游戏:遵循针对游戏和复杂多媒体应用的最新指南,最大限度地节省各种进程状态下的内存。

实用资源和参考资料

继续阅读