最近开发一个APK的时候遇到了一个问题,CPU动不动就占用到40%以上,而且是一个服务型的常驻内存APK,这样子肯定不行的,CPU发热可能会过高。这个APK需要优化,包括内存优化,结构优化,CPU优化等等

1.获取APK内存占用情况

使用top命令,确定自己是不是占用了比较高的cpu

top

2.获取线程占用情况

直接执行top命令只能获取到整个进程总的cpu占用,但是我们的APK大多数是有很多线程的,我们要确定代码哪里有问题,需要知道哪个线程出问题,命令如下

top -m 10 -t -d 2

m代表最大显示的条目,t代表线程方式显示,这里就必要说到一个问题了,很多同学写JAVA线程(Thread)的时候,都不传线程名给super,这样子我们用top或者其它调优的时候在线程级别上调优就很麻烦了,命令不能看到线程名,只看到Thread-55之类的形式,所以请保持良好的习惯:

class MyThread extends Thread {
    public MyThread() {
        super("MyThread");//给线程取个名字,让系统知道,别让系统给你随机编号
    }
}

3.是哪个方法干了坏事

我们最终肯定是优化我们的代码,那么就需要知道具体是哪行代码占用了高CPU,这时候我们用Android Studio的Monitor就可以了,打开Android Studio的Monitor(请保持adb连接你的设备),如下图点击CPU的时钟按钮开始跟踪APP CPU调用:

android cpu耗时 ui android cpu占用高_android cpu耗时 ui


操作你的APP(如果你的代码需要某些操作才能触发),再次点击刚刚的按钮结束,之后会弹出一个CPU分析框,选择你刚刚分析出觉得有问题的线程:

android cpu耗时 ui android cpu占用高_top命令_02


就可以看到各个方法的CPU占用了,这里注意一点,你的代码可能开启了代码混淆,这时候会看不清楚真实的函数名称,可以先出一个不混淆的版本进行调试。

android cpu耗时 ui android cpu占用高_Android_03


我用了这个方法想办法优化或者避免(少)调用某些代码CPU从40%降低到了5%,找到热点代码,开始你的优化吧。