Android 性能优化实战:启动速度、内存与渲染

为什么性能优化如此重要?

根据 Google 的研究,如果应用启动时间超过 5 秒,用户放弃率会急剧上升。一个流畅的应用不仅提升用户体验,还直接影响应用商店的评分和留存率。

一、应用启动优化

冷启动 vs 温启动 vs 热启动

  • 冷启动:应用进程被杀死后重新启动,耗时最长。
  • 温启动:Activity 被销毁但进程还在,可能是 trimMemory 导致的。
  • 热启动:Activity 仍驻留在内存中,最快。

优化手段

  1. 延迟初始化:将非首屏必须的第三方 SDK 放到 IdleHandler 或协程中延迟加载:
    Looper.myLooper()?.queue?.addIdleHandler {
        HeavySdk.init()
        false // 只执行一次
    }
  2. 启动主题优化:使用 windowBackground 设置一个占位背景,避免白屏。
  3. 减少 Application.onCreate 的工作:只做最必要的初始化。

二、内存优化

常见内存泄漏场景

  • 静态变量持有 Activity 引用
  • 非静态内部类 / 匿名类隐式持有外部类引用
  • Handler 消息未处理完
  • 未取消的协程 / RxJava 订阅
  • 单例持有 Context 引用(应该用 ApplicationContext)

检测工具

  • Android Studio Memory Profiler
  • LeakCanary:自动检测内存泄漏并给出引用链
  • MAT (Memory Analyzer Tool):分析 hprof 文件
// LeakCanary 集成(仅需一行)
dependencies {
    debugImplementation "com.squareup.leakcanary:leakcanary-android:2.12"
}

三、渲染优化

关键指标:16ms 帧

60fps 意味着每帧只有 16ms 的时间。任何超过这个时间的操作都会导致丢帧(jank)。

优化技巧

  • 减少布局层级:使用 ConstraintLayout 替代嵌套的 LinearLayout。
  • 使用 ViewStub:对不常显示的 View 延迟初始化。
  • 避免过度绘制:在开发者选项中开启”显示过度绘制区域”。
  • RecyclerView 优化:使用 setHasFixedSize(true)、DiffUtil、预取。
  • 图片加载:使用 Glide/Coil,避免直接在 UI 线程解码位图。

总结

性能优化不是一蹴而就的。建议先通过 Profiler 找到瓶颈,再针对性优化。务必在优化前后做好数据对比,验证效果。

沪ICP备2026038898号-1