How to analysis Android Performance

Android Performance Topic

Posted by Vivi CAO on June 23, 2016

本文系本作者原创,如有任何知识产权、版权问题或理论错误,还请指正。 转载请注明原作者及出处,谢谢配合。

如何分析Android performance问题?


检查CPU问题 — “手机是否发热”

  • 看是否因为高温而降频 CPU信息:

    一般情况“2-7” 6核, CPU0, CPU1一般不开, CPU2-CPU3(大核),CPU4,CPU5,CPU6,CPU7。

    查看CPU频率的方法如下: cat /sys/devices/system/cpu/cpux/cpufreq/scaling_cur_freq

注意:任何性能问题都要跟正常情况下对比


Check TOP information

  • 看TOP信息,查看当前后台是否是干净的。{idle/操作用户行为}是否是异常

    “system 1%(1), IOW 8%(2)” (System包含user)

    • (1) 如果该值高就看底下的进程,CPU占比。如果发现哪个进程占比比较高,再看这个进程的哪个线程占比高
    $ adb shell top -d 1 -m 10 -t

      * "-d 1": 每一秒刷一次
      * "-m 10": 输出前10个
      * "-t": 输出线程
  • 如果这中间想看某个进程的call stack,使用下面命令输出对应进程的call stack信息,然后查看traces.txt文件搜索”Tid=[线程号]”,查看该线程的具体调用
    $ adb shell touch /data/anr/traces.txt
    $ adb shell kill -3 [PID](进程号)
  • (2) 【难点】如果出现IOW高需要采用排除法,把有疑点的进程关掉后重新查看IOW的占比是否降低。如果排除这种可能后只能说明是系统问题。


Systrace

使用Systrace命令抓取现场状态,然后跟正常状态下的Systrace进行对比分析:

  • 如果是应用启动慢,查看每个启动阶段使用情况,找出最费时间的地方
    • 起始点: Systrace中的关键字 "delieverInputEvent", keyword: input, Event, touch
    • 终止点: Systrace中的关键字 "winAnimationDone"
    • 关键点: 应用进程的 "activityResume"
  • 如果是滑动问题,先找到对应时间区域:
    • 起始点: "delieverInputEvent"
    • 结束点: 事件结束点

    • 查看这段时间内VSync的间隔是否均匀。如果有宽的,是否超过16.7ms
    • 查看“SurfaceFlinger”,如果均匀说明可能系统本身没有问题,也许是应用自身draw的时候太费时,然后对比参考机进行验证。如果发现是参考机无此问题,对手机进行升频操作,看是否是CPU的瓶颈。
    • 如果“SurfaceFlinger”时就出现问题,跟芯片厂商沟通。


logcat

抓取现场的log,结合Systrace查看这段时间是否有异常出现。有没有可疑的现象或者进程,具体问题具体分析。


bugreport

通过android提供的“battery-historian” 工具分析现场找出可疑点。该工具可以将bugreport的数据导入到浏览器中生成可视化界面(如下),也可以提供用户行为。

Timeline:

System stats: