很多时候,写代码是一件很爽的事情,但最后需要对APP进行瘦身、性能分析却是一件很棘手的事情。当需要对APP的性能进行分析时,Simpleperf是一个简单快捷的选择。

正文开始前,先奉上官方的资料:

什么是Simpleperf

Simpleperf是NDK软件包中提供的一种多功能命令行工具,方便为Android应用流程执行CPU分析。该工具可帮助找到使用Java、C/C++和Kotlin编写的应用的热点(所谓热点,也就是占用应用大部分执行时间的部分原生代码)。

也就是说,Simpleperf是NDK自带的工具,官方认证的CPU分析工具。

Simpleperf是Android平台的一个本地层性能分析工具。它的命令行界面支持与linux-tools perf大致相同的选项,但是它还支持许多Android特有的改进。

Simpleperf的获取路径:Google Git Simpleperf

在页面内,可以直接压缩包下载,既可以选择NDK相对应的版本(R13~N21),也可以选择master。建议直接选择NDK对应的版本即可。当然,也可以git直接拉取仓库。

git clone https://android.googlesource.com/platform/prebuilts/simpleperf

查看下载的simpleperf目录,可以看出:它的工具集包涵client端和host端;client端运行在Android系统上,负责收集性能数据;host端则运行在开发机上,负责对数据进行分析和可视化(这些可执行文件在下载后的bin文件夹的android和win/linux下)。

除了bin文件夹之外,最上层还有很多.py的脚本文件和.config的配置文件。这些脚本和配置文件主要是官方写的一些傻瓜式的使用脚本,只需要对配置文件进行配置,就可以在直接在开发机上直接运行脚本,一键生成最终的结果。

主要的脚本是:app_profiler.pyreport.py两个。

脚本的主要内容,就是读取配置文件,然后执行adb shell ...的命令,其实本质上和命令行的输入没什么区别。但是,如果直接运行,不仅仅需要查看配置文件各个配置项的含义,还可能会出现许多意想不到的BUG,不太建议直接使用脚本,不得精髓啊。

Simpleperf的工作原理

现代的CPU具有一个硬件组件,称为性能监控单元(PMU)。PMU具有一些硬件计数器,计数一些诸如经历了多少次CPU周期,执行了多少条指令,或发生了多少次缓存未命中等的事件。Linux内核将这些硬件计数器包装到硬件perf事件(hardware perf events)中。此外,Linux内核还提供了独立于硬件的软件事件和跟踪点事件。Linux内核通过perf_event_open系统调用将这些都暴露给了用户空间。

Simpleperf具有三个主要的功能:stat、record和report

Stat命令给出了在一个时间段内被分析的进程中发生了多少事件的摘要。以下是它的工作原理:

  • 给定用户选项,simpleperf通过对linux内核进行系统调用来启用分析;
  • Linux 内核在调度到被分析进程时启用计数器;
  • 分析之后,simpleperf从内核读取计数器,并报告计数器摘要。

Record命令在一段时间内记录剖析进程的样本。它的工作原理如下:

  • 给定用户选项,simpleperf通过对linux内核进行系统调用来启用分析;
  • Simpleperf在simpleperf和linux内核之间创建映射缓冲区;
  • Linux内核在调度到被分析进程时启用计数器;
  • 每次给定数量的事件发生时,linux内核将样本转储到映射缓冲区;
  • Simpleperf从映射缓冲区读取样本并生成perf.data

Report命令读取perf.data文件及所有被剖析进程用到的共享库,并输出一份报告,展示时间消耗在了哪里

Simpleperf的使用

尽管不推荐使用一键脚本,但得益于Simpleperf的命令不多,使用起来也很简单快捷。

文件准备

将simpleperf可执行文件传输到Android设备上:

adb push 文件源地址 文件目的地址

可执行文件都存储在bin/android/目录下,可自行获取。

性能分析

在性能分析前,首先启动需要分析的APP,获取APP的进程号:

adb shell am start -n 包名/启动程序
adb shell pidof 包名

接下来,就可以使用命令三连击了:

adb shell
cd simpleperf所在目录
./simpleperf stat [options] [command [command-args]]
./simpleperf record [options] [command [command-args]]
./simpleperf report [options]

stat命令获取一段时间内已分析进程中发生的事件数摘要。 最常使用的选项为:

./simpleperf stat -p 进程号 --duration 检测进程的持续时间(秒)

record命令记录一段时间内已分析进程的样本,这是simpleperf的主命令。最常使用的选项为:

./simpleperf record -p 进程号 -o 输出文件(默认perf.data) --duration 监测进程的持续时间(秒)

需要注意的是,如果出现Access to kernel symbol addresses is restricted的警告,需要使用一下命令来取消:

echo 0>/proc/sys/kernel/kptr_restrict

report命令读取perf.data文件(由simpleperf record创建),并显示报告,表明花费时间的地方。最常使用的选项为:

./simpleperf report --dsos 选定动态共享对象(so库)  -f 记录文件(默认perf.data) --sort 用于排序和打印报告的键 -n

注意点:如果使用report命令进行查找的时候,发现so现实的Symbol都是地址,而不是函数内容。这多数是因为在安卓编译的时候,设备上使用的so库已经被strip过,也就是说,已经抛离了.symbol段的内容。

那么,我们需要将带有Symbol信息的so下载到设备上。同时需要将so放置到perf.data中记录的相同的路径(否则,simpleperf无法找到它)。

如果找不到路径,可以在perf.data文件中直接搜索需要选定的so库的名称,即可查看到路径。

示例流程

  1. 启动应用并进行分析

    adb shell simpleperf app_profiler -p com.example.myapp --duration 30 -o /sdcard/perf.data

    adb shell simpleperf record -p 21226 -g --duration 10 -o perf.data

  2. 提取分析数据

    adb pull /sdcard/perf.data .

  3. 生成报告

    simpleperf report -i perf.data

  4. 生成图形化报告(可选):

    simpleperf report-html -i perf.data -o perf_report.html

通过以上步骤和命令,你可以使用 Simpleperf 有效地分析 Android 应用的 CPU 性能,并找到潜在的性能瓶颈。

python ./simpleperf/report_sample.py > out.perf
./FlameGraph/stackcollapse-perf.pl out.perf > out.folded
./FlameGraph/flamegraph.pl out.folded > out.svg
  1. 生成火焰图

    谷歌官网下载Android NDK: https://developer.android.google.cn/ndk/downloads/

    进入到android-ndk-r25b-linux/android-ndk-r25b/simpleperf

    将上述生产的perf.data文件拉取出来放到这个同级目录下

    adb pull /sdcard/perf.data

    直接运行

    python report_html.py -i ./perf.data -o ./perf.html

    python ./simpleperf/report_sample.py > out.perf

    ./FlameGraph/stackcollapse-perf.pl out.perf > out.folded

    ./FlameGraph/flamegraph.pl out.folded > out.svg

【Simpleperf】Android的CPU分析,性能优化利器的更多相关文章

  1. Android比较实用的性能优化

    Android设备作为一种移动设备,无论是内存还是CPU的性能都受到了很大的限制,这导致Android程序的性能问题异常突出,随着产品的不断更新迭代,对于性能优化提出了更高的要求.本篇文章从稳定性.流 ...

  2. 在 Android开发中,性能优化策略十分重要

    在 Android开发中,性能优化策略十分重要本文主要讲解性能优化中的布局优化,希望你们会喜欢.目录 示意图 1. 影响的性能 布局性能的好坏 主要影响 :Android应用中的页面显示速度 2. 如 ...

  3. Android开发系列之性能优化

    一直想整理一篇关于Android性能优化的博客,正好今天借鉴一些书籍资料,总结一下自己对于这块的一些认识.相信大家都听说过16ms的原则,即每两个画面之间的绘制时间间隔不能超过16ms,否则人眼能够感 ...

  4. 【转】PHP中被忽略的性能优化利器:生成器.md

      PHP  如果是做Python或者其他语言的小伙伴,对于生成器应该不陌生.但很多PHP开发者或许都不知道生成器这个功能,可能是因为生成器是PHP 5.5.0才引入的功能,也可以是生成器作用不是很明 ...

  5. 【mysql】MySQL知识整理-死锁分析-性能优化等

    [[TOC]] 常用操作指令 show databases:显示所有的数据库: use dbName: 使用指定数据库 show tables: 显示所有的数据表: desc tableName: 查 ...

  6. 开源|性能优化利器:数据库审核平台Themis的选型与实践

    作者:韩锋 出处:DBAplus社群分享:来源:宜信技术学院 Themis开源地址:https://github.com/CreditEaseDBA 一.面临的挑战 1.运维规模及种类 我相信,这也是 ...

  7. js 性能优化利器:prepack

    1. js 性能优化 js 本身是没有像 python 一样的预编译功能,更没有像 java 一样的编译功能,所以,这里所说的 js 代码预编译 只是通过工具实现的类似功能而已. 这就要提到 prep ...

  8. Android学习笔记之性能优化SparseArray

    PS:终于考完试了.来一发.微机原理充满了危机.不过好在数据库89分,还是非常欣慰的. 学习内容: 1.Android中SparseArray的使用..   昨天研究完横向二级菜单,发现其中使用了Sp ...

  9. PHP系列 | [转] PHP中被忽略的性能优化利器:生成器

    官方:https://www.php.net/manual/zh/language.generators.overview.php 原文:https://segmentfault.com/a/1190 ...

  10. PHP中被忽略的性能优化利器:生成器

    如果是做Python或者其他语言的小伙伴,对于生成器应该不陌生.但很多PHP开发者或许都不知道生成器这个功能,可能是因为生成器是PHP 5.5.0才引入的功能,也可以是生成器作用不是很明显.但是,生成 ...

随机推荐

  1. Linux下查看压缩文件内容的 10 种方法【转】

    转载地址:https://zhuanlan.zhihu.com/p/91593509 1.使用 Vim 编辑器 Vim 不仅仅是编辑器,它还包含其他许多强大的功能.下面的命令将直接显示压缩归档文件的内 ...

  2. [香橙派开发系列]使用wiringPi控制26个引脚

    目录 前言 一.香橙派使用的包 二.使用wiringPi包的命令 1.下载wiringOP 2.gpio readall信息分析 3.设置gpio的模式 4.设置gpio输出的电平 三.wiringP ...

  3. 树莓派3b+使用官方屏幕后倒置问题——屏幕倒置

    树莓派3b+的屏幕本身就是倒置的,因此为了使树莓派在官方屏幕下能显示正常的屏幕画面因此需要通过设置把树莓派的官方屏幕的输出倒置一下,这样树莓派的官方屏幕的输出就是正常的了. 解决方法:(源自:http ...

  4. 记一次失败记录: MindSpore1.3.0 GPU 源码安装 —— Ubuntu18.04系统 (最终安装结果为失败)

    官网地址: https://www.mindspore.cn/install 系统:Ubuntu18.04 硬件: i7-9700k CPU 2060super nvidia显卡 由于考虑到minds ...

  5. JAVA 两个类同时实现同一个接口的方法

    在Java中,两个类同时实现同一个接口是非常常见的.接口定义了一组方法,实现接口的类必须提供这些方法的具体实现.以下将展示如何实现这一要求,并提供具体的代码示例. 示例接口 首先,定义一个简单的接口, ...

  6. int128输入输出流

    using i128 = __int128; istream &operator>>(istream &is, i128 &x) { string s; is &g ...

  7. JavaScript设计模式样例十 —— 组合模式

    组合模式(Composite Pattern) 定义:又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.目的:将对象组合成树形结构以表示"部分-整体"的层次结构.场景:您 ...

  8. JAVA IO流-小白版

    I/O流原理 I/O 是 Input / Output 的缩写,I / O 流技术是非常实用的技术,用于处理数据传输.如读/写文件,网络通讯等: Java中对于数据的输入/输出操作以"流(s ...

  9. Ubuntu 设置远程桌面(VNC)

    连接 Xfce 4 远程桌面 下载 Xfce 4 桌面环境: sudo apt install -y xfce4 xfce4-goodies 这里会提示你设置显示管理器,我们设置 gdm3 就好. 安 ...

  10. 记录荒废了三年的四年.net开发的第三次面试,苏州斯莱克

    现在就业的确崩了 这次面试的时间是8月28号.距离上一次面试已经过去了一个月了,距离开始找工作已经过去了2个月.没多少找工作经验的我也体会到了什么叫就业崩了. 看了一线码农的采访计划后,我也把苏州列为 ...