用户对一个 App 的第一印象来自启动速度,长期使用体验则取决于流畅度和电量消耗。本文整理一份可逐项检查的 Android 性能优化清单,覆盖从冷启动到后台运行的完整生命周期。
启动优化:每一毫秒都重要
Google 建议冷启动时间控制在 500ms 以内(到首帧渲染)。优化手段:
- 延迟初始化:非关键 SDK(统计、推送、地图)放到
Application.onCreate()之后的 IdleHandler 或协程中 - Baseline Profile:用 Macrobenchmark 生成 AOT 编译配置,启动提速 20–30%
- 闪屏优化:Android 12+ 使用 SplashScreen API,避免自定义闪屏页额外耗时
- ContentProvider 审计:第三方 SDK 通过 ContentProvider 自动初始化,用
InitializationProvider的remove禁用非必要项
<!-- AndroidManifest.xml 中禁用不需要的自动初始化 -->
<provider
android:name="androidx.startup.InitializationProvider"
tools:node="merge">
<meta-data
android:name="com.example.SomeSdkInitializer"
tools:node="remove" />
</provider>
卡顿治理:主线程零容忍
Android Vitals 将 ANR 率超过 0.47% 的应用标记为「不良行为」。常见主线程阻塞源:
- SharedPreferences
commit()— 改用apply()或 DataStore - 主线程网络请求 — Retrofit + 协程默认在 IO 线程
- 大 JSON 解析 — 移到 Default 调度器
- 复杂 RecyclerView/LazyColumn item 布局 — 简化层级,使用 ConstraintLayout
使用 StrictMode 在 Debug 构建中检测主线程磁盘/网络访问,使用 Perfetto / Systrace 分析帧耗时。
内存管理
OOM 是 Android 应用被系统杀死的头号原因:
- 图片加载:Coil/Glide 按目标尺寸采样,列表中及时
dispose - 内存泄漏:LeakCanary 检测 Activity/Fragment 泄漏,注意静态引用和未取消的协程
- 大对象:单个 Bitmap 不超过屏幕像素数 × 4 字节,必要时分块加载
- onTrimMemory:响应系统内存压力回调,释放非必要缓存
电量与后台行为
Android 14+ 对后台行为限制更严格:
- 使用 WorkManager 替代自定义 AlarmManager 轮询
- 定位请求选择
Priority.PRIORITY_BALANCED_POWER_ACCURACY而非高精度 - 避免 WakeLock 长时间持有,使用
setAndAllowWhileIdle的精确闹钟需申请权限 - 前台服务必须显示通知且类型匹配(
foregroundServiceType)
网络与包体积
- 启用 R8 全模式混淆和资源压缩,APK 体积通常减少 30–50%
- 使用 App Bundle + Dynamic Feature Module 按需交付功能
- 网络层启用 HTTP/2 多路复用和 Brotli 压缩
- 接口响应使用 Protocol Buffers 替代 JSON,解析速度提升 3–5 倍
监控体系
上线后持续监控比一次性优化更重要:
- Firebase Performance:自动采集启动、网络、帧率
- Android Vitals:Google Play 控制台查看 ANR、崩溃、唤醒锁
- 自定义埋点:关键页面 TTI(Time to Interactive)和业务操作耗时
小结
Android 性能优化没有银弹,但有清晰的优先级:启动 → 卡顿 → 内存 → 电量 → 包体积。建立基准测试、逐项优化、持续监控,比追求一次性完美更有价值。