深入浅出安卓电量、CPU、内存分析

182 阅读4分钟

深入浅出安卓电量、CPU、内存分析

一、电量分析——手机电池的"会计系统"

1. 电量消耗主要元凶

  • 屏幕:像一直开着的电灯泡(占比30-50%)
  • 网络:4G像大功率空调,WiFi像节能风扇
  • CPU:高性能模式像猛踩油门
  • GPS:像一直开着的雷达扫描

2. 分析工具

(1) Battery Historian(电池历史学家)
# 收集数据
adb shell dumpsys batterystats --reset
adb shell dumpsys batterystats > batterystats.txt
python historian.py batterystats.txt > batterystats.html

报告解读

  • 横轴:时间线
  • 纵轴:电量变化
  • 颜色块:不同组件的耗电情况
(2) Android Studio Profiler

操作路径: View → Tool Windows → Profiler → Energy

3. 优化技巧

  • 减少唤醒锁定:像不让手机睡懒觉
// 错误示范
PowerManager.WakeLock wakeLock = powerManager.newWakeLock(
    PowerManager.FULL_WAKE_LOCK, "MyApp:WakeLock");
wakeLock.acquire();

// 正确做法
wakeLock.acquire(10*60*1000); // 设置超时
  • 批量处理网络请求:像集中收发快递
  • 使用JobScheduler:像智能排班表
JobInfo job = new JobInfo.Builder(JOB_ID, serviceComponent)
    .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
    .setRequiresCharging(true)
    .build();
jobScheduler.schedule(job);

二、CPU分析——手机大脑的"体检报告"

1. 关键指标

  • CPU利用率:大脑使用率(理想值<70%)
  • 线程数:像同时思考的事情(建议<50)
  • 主线程耗时:超过16ms会卡顿(60FPS)

2. 分析工具

(1) Android Studio CPU Profiler

操作路径: Profiler → CPU → Record

四种记录方式

  • Sampled:定时快照(低开销)
  • Instrumented:详细记录(高开销)
  • Trace System Calls:系统调用追踪
  • Sample Java Methods:Java方法采样
(2) Perfetto(新一代系统追踪)
# 命令行记录
adb shell perfetto --txt -c /data/misc/perfetto-configs -o /data/misc/perfetto-traces

3. 常见问题定位

(1) 主线程卡顿

查找Choreographer#doFrame耗时

(2) 线程爆炸

检查Thread.start()调用栈

(3) CPU长期高负载

查找热点方法(火焰图顶部)

4. 优化代码示例

// 优化前:在主线程解析JSON
String json = loadJsonFromAsset();
User user = new Gson().fromJson(json, User.class);

// 优化后:使用子线程
Executors.newSingleThreadExecutor().execute(() -> {
    User user = new Gson().fromJson(json, User.class);
    runOnUiThread(() -> updateUI(user));
});

三、内存分析——手机内存的"仓库管理"

1. 内存关键指标

指标健康值警告值危险值
Java堆<50%可用<30%可用OOM
原生内存<100MB100-200MB>200MB
线程数<5050-100>100

2. 分析工具

(1) Android Studio Memory Profiler

操作路径: Profiler → Memory → Record allocations

内存快照分析技巧

  1. 按包名过滤
  2. 按Retained Size排序
  3. 检查Activity/Fragment泄漏
(2) LeakCanary(内存泄漏检测)
dependencies {
    debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.7'
}

自动检测Activity/Fragment泄漏

3. 常见内存问题

(1) 内存泄漏(Memory Leak)

典型场景

  • 静态引用Activity
  • 未取消的Handler/RxJava订阅
  • 单例持有Context

解决方案

// 错误示范
public class AppManager {
    private static Activity sActivity; // 内存泄漏!
}

// 正确做法
public class AppManager {
    private WeakReference<Activity> activityRef;
}
(2) 内存抖动(Memory Churn)

特征:频繁GC,锯齿状内存曲线

优化方案

  • 对象复用(ViewHolder模式)
  • 避免在循环中创建对象
// 错误示范
for (int i = 0; i < 1000; i++) {
    String str = new String("hello"); // 创建1000个对象
}

// 正确做法
String template = "hello";
for (int i = 0; i < 1000; i++) {
    String str = template; // 复用对象
}

4. 内存优化高级技巧

(1) 大图加载优化
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2; // 缩略图
options.inPreferredConfig = Bitmap.Config.RGB_565;
Bitmap bitmap = BitmapFactory.decodeFile(path, options);
(2) 使用Memory Reducer
// 在onTrimMemory时释放资源
public void onTrimMemory(int level) {
    if (level >= TRIM_MEMORY_MODERATE) {
        clearCache();
    }
}

四、联合分析实战案例

场景:列表页滑动卡顿

  1. 电量分析:发现CPU唤醒频繁
  2. CPU分析:主线程有JSON解析
  3. 内存分析:滑动时内存抖动

优化方案

  • 改用RecyclerView
  • 预解析JSON数据
  • 使用对象池复用ViewHolder
// 优化后代码示例
public class ViewHolderPool {
    private Queue<ViewHolder> pool = new ArrayDeque<>(10);
    
    ViewHolder getViewHolder() {
        ViewHolder holder = pool.poll();
        return holder != null ? holder : new ViewHolder();
    }
    
    void recycle(ViewHolder holder) {
        holder.reset();
        pool.offer(holder);
    }
}

五、性能分析黄金法则

  1. 分析顺序

    用户反馈 → 日志分析 → Profiler工具 → 代码定位
    
  2. 优化优先级

    卡顿问题 > 内存问题 > 电量问题
    
  3. 测试方法

    • 极端测试(低电量/低内存)
    • 长时间压力测试
    • 不同机型覆盖测试

六、总结

安卓性能分析就像给手机做全面体检:

  1. 电量分析:找出耗电大户

    • 工具:Battery Historian
    • 关键:减少唤醒、批量操作
  2. CPU分析:定位计算瓶颈

    • 工具:CPU Profiler
    • 关键:主线程不阻塞、合理使用线程
  3. 内存分析:解决泄漏和溢出

    • 工具:Memory Profiler + LeakCanary
    • 关键:避免泄漏、减少抖动

记住三个口诀:

  • 电量:少唤醒、多睡觉
  • CPU:主线程不干重活
  • 内存:谁申请谁释放,不囤货

掌握这些分析技巧,你就能让APP像专业运动员一样——力量大(性能好)、耐力久(省电)、不受伤(稳定)!