解决常见的效果问题

为了提供顺畅、稳定且省电的应用体验,您需要找出并解决稳定性、界面呈现、内存消耗、后台工作、启动延迟和 build 优化方面的常见性能瓶颈。

本部分中的指南介绍了每种问题的底层 Android 平台行为,并逐步介绍了如何使用 Android Studio 性能剖析器、Perfetto、Logcat 和 ApplicationExitInfo 等工具来诊断、分析和修复这些问题。

稳定性

  • ANR:诊断并修复由界面线程阻塞、主线程 I/O、锁争用或广播接收器缓慢导致的应用无响应 (ANR) 错误。
  • 崩溃:读取堆栈轨迹、检查 Logcat 输出,并防止未处理的异常和原生信号。

渲染和启动

  • 呈现速度缓慢:找出并修复因布局开销过大、绑定传递或主线程停滞而导致的界面帧丢失或冻结(>16ms>700ms)。
  • 慢会话(仅限游戏):使用 SurfaceFlinger 衡量帧同步,并使用 Android Frame Pacing (Swappy)、Vulkan 和 Android 动态性能框架 (ADPF) 优化游戏帧速率。
  • 应用启动时间:了解冷启动、温启动和热启动的内部机制,测量初步显示所用时间 (TTID) 和完全显示所用时间 (TTFD),并优化启动工作。

内存管理

  • 低内存终止程序 (LMK):了解 Android 低内存终止守护程序 (lmkd) 如何通过 oom_adj_score 对进程进行优先级排序,以及如何在 Android Studio、Unity 和 Unreal Engine 中分析内存占用情况。
  • 内存用量(匿名 RSS + 交换空间):衡量并减少应用在前台、服务和后台状态下的匿名常驻内存大小 (RSS) 和交换内存占用量。
  • 位图内存用量:诊断过大或泄露的位图分配,并在界面组件移至后台时释放图形缓冲区。

电池和后台工作

  • 唤醒锁定操作过多:避免长时间持有部分唤醒锁定,并将后台任务迁移到 WorkManagerJobScheduler
  • 部分唤醒锁定被卡住:确保在所有执行路径和错误路径中,每个获取的部分唤醒锁定都被正确释放。
  • 过多的唤醒:减少精确闹钟唤醒次数,并批量处理或延迟预定的后台工作。
  • 后台 WLAN 扫描次数过多:尽量减少后台 WLAN 扫描频率,并使用被动或批处理的位置和连接 API。
  • 后台网络使用量过高:使用 WorkManager 限制批量处理和延迟后台移动网络传输。
  • 电池用量过高:通过分析 CPU、传感器和无线电活动,诊断移动设备和 Wear OS 设备上的电池电量消耗过快问题。

权限和 build 优化

  • 权限遭拒:在用户执行相关操作时请求运行时权限,并向用户清楚说明权限的用途。
  • DEX 代码优化:配置 R8 压缩、混淆和优化规则,以减小 DEX 大小并提升运行时性能。