1. AOSP性能优化概述

各位同学,欢迎来到《AOSP性能瓶颈定位与优化实践》。第一章我们先聊聊AOSP性能优化的整体框架。说白了,就是搞清楚Android系统长什么样,性能好不好怎么看,以及我们到底要优化什么。

1.1 AOSP架构简介

AOSP(Android Open Source Project)采用分层架构,从上到下大概五层:应用层、应用框架层、运行时层、硬件抽象层(HAL)和Linux内核层。每一层负责不同的职责,性能问题可能出现在任何一层。

我个人习惯把AOSP看成一个洋葱。你想想看,用户只接触到最外层的应用,但里面每一层都在默默工作。我曾经在项目中遇到过一个卡顿问题,查了两天发现是HAL层的驱动没有及时释放buffer,导致上层waitForVsync超时。这种跨层的问题最难定位。

下面这张图展示了AOSP的层级结构以及性能关注点:

AOSP分层架构与性能关注点 应用层 应用框架层 运行时 + ART 硬件抽象层 (HAL) Linux 内核层 性能关注点 • 应用帧率、UI流畅度 • 界面绘制、输入事件分发 • 垃圾回收、JIT编译 • 驱动延迟、功耗管理 • 调度、内存、I/O 性能指标:FPS、延迟、内存占用、功耗 | 优化目标:流畅、低延迟、低内存、省电

1.2 核心性能指标

搞性能优化,第一件事就是定义"好"和"坏"。常用的指标有四个:FPS、延迟、内存和功耗。缺一不可。

1.2.1 FPS(帧率)

FPS就是每秒显示的帧数。Android默认刷新率是60Hz,对应FPS=60。但实际达到30以上用户体验就算流畅。我遇到过很多App号称60fps,但实际掉帧严重。可以用dumpsys gfxinfo来查看真实帧率。

1.2.2 延迟(Latency)

延迟包括触摸响应、网络请求、后台任务等。用户最敏感的其实是触摸到画面变化的延迟,一般要求<100ms。系统侧常见的延迟瓶颈在InputReader到应用绘制的流水线中。

1.2.3 内存

内存占用直接影响系统稳定性。低内存时系统会触发LMK(Low Memory Killer)杀死进程。我个人习惯先看/proc/meminfo,再配合dumpsys meminfo定位具体进程。注意区分PSS、RSS、USS,调优时主要盯PSS。

1.2.4 功耗

功耗是移动设备的命门。Android有Power Profile和BatteryStats可以监控。说实话,功耗优化往往和性能优化冲突——比如提升帧率可能增加CPU频率。需要平衡。

下面这个表格总结了四个指标的关键点和优化方向:

指标 关注点 常见瓶颈 优化方向
FPS画面流畅度过度绘制、VSYNC抖动减少层级、优化绘制
延迟响应速度IPC、Binder过长异步化、线程优化
内存系统稳定性内存泄漏、大对象引用管理、对象池
功耗续航时间唤醒锁、高频率运行Doze模式、频率缩放

我的经验:有一次项目交付前,客户反馈游戏掉帧厉害。我用Systrace抓了一次,发现SurfaceFlinger的HWC合成占了太多时间。最后通过减少GPU合成层数,帧率从40飙到了58。嗯,这种优化效果立竿见影。

1.3 优化目标与挑战

优化目标说白了就是让系统更流畅、更省电、更稳定。但现实很骨感——你想想看,要同时满足所有指标几乎不可能。

  • 流畅:保持稳定60fps,不掉帧;
  • 低延迟:触摸反馈<50ms,应用启动<1s;
  • 低内存:系统剩余内存>500MB(典型值);
  • 低功耗:平均电流<200mA(非游戏场景)。

挑战也很多。我曾经在优化一个低端设备时,发现内存和功耗互相制约:把内存压缩开起来,CPU负载就上去了,功耗反而增加。最后只能通过调整zRAM大小和swappiness找到一个平衡点。

还有一个常见的挑战是"碎片化"。不同厂商、不同芯片的硬件差异巨大。同样一段代码,在骁龙888上跑得飞起,在联发科G80上可能卡成PPT。所以你做的优化一定要考虑通用性,或者至少做到可配置。

避坑指南:千万不要为了追求单一指标而过度优化。我曾经看到一个团队为了降低内存占用,强行把所有后台进程杀掉,结果导致应用冷启动频繁,用户体验更差了。性能优化是系统工程,要兼顾。

1.4 性能优化方法论

做优化不能瞎猜。我一般遵循"测量-分析-优化-验证"的闭环。先用Systrace、Perfetto等工具采数据,找到热点,然后针对性地改,最后再测一次看是否达标。记住,没数据不要乱动代码。

另外,优化要有量化目标。比如"希望App启动时间降低20%",而不是"让App更快"。没有目标,你怎么知道自己做完了?

分享一个实际案例:我曾优化一个Android TV的开机时间。一开始以为只是kernel init慢,结果发现是在BOOT动画那里卡了3秒——因为动画帧率太高占用了CPU。调低帧率后开机时间降了2秒,效果显著。

好了,这一章我们先把AOSP的骨架搭起来。记住,性能优化没有银弹,理解原理才是根本。