Android 性能优化

Android 性能优化全景:启动、内存、渲染、包体积的系统化优化方法。

核心问题

如何系统化地进行性能优化?

性能优化不是碎片化的技巧堆砌,而是度量 → 定位 → 优化 → 验证的闭环。


知识脉络

第一层:启动优化

启动类型

类型场景耗时
冷启动进程不存在最慢
温启动进程在,Activity 销毁中等
热启动进程和 Activity 都在最快

优化策略

Application 阶段

// 1. 延迟初始化
class App : Application() {
    override fun onCreate() {
        // 只初始化必须的
        super.onCreate()
        // 其他在后台线程
        Thread { initNonEssential() }.start()
    }
}

// 2. App Startup 库
class MyInitializer : Initializer<Unit> {
    override fun create(context: Context) {
        // 异步初始化
    }
}

UI 阶段

  • 首屏精简
  • ViewStub 延迟加载
  • 避免主线程 IO

测量

adb shell am start -W com.example/.MainActivity

第二层:内存优化

指标

  • PSS(实际占用)
  • Java Heap
  • Native Memory

Bitmap 优化

// 采样加载
val options = BitmapFactory.Options().apply {
    inSampleSize = 4
}
val bitmap = BitmapFactory.decodeFile(path, options)

// 复用内存
options.inBitmap = reusedBitmap

内存泄漏检测

debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.12'

第三层:渲染优化

掉帧监控

Choreographer.getInstance().postFrameCallback { frameTimeNanos ->
    val jitter = frameTimeNanos - lastFrameTime
    if (jitter > 16_666_666) {
        Log.w("Frame", "Dropped ${jitter / 16_666_666} frames")
    }
}

过度绘制

开发者选项 → GPU 过度绘制:

颜色次数状态
0正常
1可接受
绿2警告
3需优化
4+严重

布局优化

  • ConstraintLayout 扁平化
  • ViewStub 按需加载
  • merge 减少层级

第四层:包体积优化

体积构成

类型占比优化
DEX40%R8 混淆
资源30%WebP、移除
Native20%只保留必要 ABI
Assets10%动态下发

配置

android {
    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
        }
    }
    defaultConfig {
        ndk {
            abiFilters 'armeabi-v7a', 'arm64-v8a'
        }
    }
}

面试高频点

Q1: ANR 排查?

  1. /data/anr/traces.txt 查看堆栈
  2. StrictMode 检测主线程 IO
  3. 重点关注:网络、数据库、文件操作

Q2: 内存抖动?

频繁 GC 导致卡顿。

表现:Memory Profiler 中锯齿状波动。

解决:避免循环内创建对象、对象复用。

Q3: Systrace 使用?

python $ANDROID_SDK/platform-tools/systrace/systrace.py \
    --app=com.example \
    -o trace.html \
    sched freq idle am wm gfx view

关注点:主线程 Block、CPU 频率、帧耗时。


优化工具箱

工具用途
CPU Profiler方法耗时
Memory Profiler内存分析
Network Profiler网络请求
Systrace系统级 trace
Layout Inspector布局层级
StrictMode主线程 IO 检测
LeakCanary内存泄漏

知识关联