Android Simpleperf

本文翻译自https://developer.android.com/ndk/guides/simpleperf.html

Simpleperf是一个强大的命令行工具,它包含在NDK中,可以帮助我们分析应用的CPU性能。Simpleperf可以帮助我们找到应用的热点,而热点往往与性能问题相关,这样我们就可以分析修复热点源。

各个平台的NDK工具均支持Simpleperf,NDK的版本应不低于r13b,我们可以在ndk-location/simpleperf/目录下找到它或者从AOSP的prebuilt中下载。

环境要求

为了使用Simpleperf, 需要以下环境:

  • 待分析的App应运行在Android 5.0或者更高版本的设备上
  • 使能手机的USB debugging连接到宿主机器
  • 为了能够运行Python scripts,宿主机器应安装:
    • Python 2.7或者更高版本
    • 最新版本的Android SDK以及NDK

使用方法

最新的使用方法请参考Simpleperf README

快速入门

该部分讲述使用Simpleperf分析Android App的基本步骤。

  1. 准备需要分析的App

待分析的App必须是debuggable,在App manifest application标签中确保android:debuggable为true.
取决于要分析App的Java层还是Native层,可能需要下面额外的步骤:

  1. 配置app profiling脚本

Simpleperf提供了一个Python脚本(app_profiler.py)可以让我们方便的运行分析工具,另外,我们可以通过修改ndk-location/simpleperf/目录下的app_profiler.config文件中的属性来配置脚本。

下面的表格列出了关键属性。

属性名 描述 例子
app_package_name 待分析的App的package name app_package_name="com.example.simpleperf.simpleperfexamplewithnative"
apk_file_path 待分析的App的APK路径 apk_file_path = "../SimpleperfExampleWithNative/app/build/outputs/apk/app-profiling.apk"
android_studio_project_dir Android Strudio工程路径 android_studio_project_dir = "../SimpleperfExampleWithNative/"
launch_activity 待分析的App的Main Activity launch_activity = ".GameMainActivity"
recompile_app 将字节码编译成带有调试信息的机器码,如果只分析java代码设置为True,否则False recompile_app = False
record_options 分析选项,以参数的形式传递给Simple record命令 record_options = "-g --duration 10"

如果想要记录方法调用图信息,请参考注意事项

  1. 运行app profiler脚本

在你的开发机器上从命令行中运行app_profiler.py脚本(在ndk-location/simpleperf/目录下)就开始分析任务了。

$ python app_profiler.py

该脚本执行以下操作:

  • 基于Android设备的体系架构,拷贝相应的Simpleper可执行文件到设备中
  • 在Android设备上运行simpleper record命令,如果执行成功将生成perf.data文件(存放收集的信息)
  • 将perf.data文件从Android设备拷贝到开发机器上,默认存放在ndk-location/simpleperf/目录下
  1. 生成分析报告

我们可以通过文本模式或者图形用户界面查看分析报告。

  • 文本模式:使用你的宿主开发机器上的simple可执行文件运行simpleperf reprot命令,如果你的开发机器是linux(64位),则使用ndk-location/simpleperf/bin/linux/x86_64/simpleperf
  • 图形用户界面:运行ndk-location/simpleperf/目录下的reprot.py脚本
  • 火焰图:参考ndk-location/simpleperf/doc/README.md(最新NDK)

Simpleperf小技巧

如果你刚开始使用Simpleperf,下面列出了一些对查找特定内容比较有用的命令,更多命令请参考Simpleperf Command Reference

  • 查找最耗时的共享库

使用该命令可以查看最耗时的共享库文件

$ simpleperf report --sort dso
  • 查找最耗时的函数

当你找到了最耗时的共享库,再使用该命令可以找到共享库中最耗时的函数

$ simpleperf report --dsos library.so --sort symbol
  • 查看线程耗时百分比
$ simpleperf report --sort tid,comm
  • 查找线程执行最耗时的目标模块(共享库)

在找到了最耗时的线程之后,使用该命令可以查找线程中最耗时的共享库

$ simpleperf report --tids threadID --sort dso
  • 查看函数调用关系
simpleperf report -g 或者 reprot.py -g

注意事项

Simpleperf支持两种方式记录方法调用信息,一种基于DWARF(record --call-graph dwarf or record -g),另一种基于帧指针(record --call-graph fp).

通常使用--call-graph fp--call-graph dwarf速度更快,如果你的Android设备是AArch-64架构(arm64-v6a)应该使用--call-graph fp,在ARM架构(armeabi或者armeabi-v7a)的设备上不能用--call-graph fp,这是因为ARM架构的设备上通常没有帧指针寄存器。

在ARM架构的设备上应该使用--call-graph dwarf,在这种方式下,Simpleperf使用libunwind解析栈信息。为了使用--call-graph dwarf,我们必须提供带有调试信息的native库,基于此建议在APK中构建带有调试信息的native库。

分析使用Unity的App

略过

写在最后

Simplerperf工具随着NDK版本的更新不断更新,本文提到的使用方法在最新的NDK中有的已经改变(原理应该没变,使用更加方便),请参考ndk-location/simpleperf/doc/README.md

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容