Android Simpleperf

作者: lbtrace | 来源:发表于2017-12-09 21:11 被阅读905次

    本文翻译自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

    相关文章

      网友评论

        本文标题:Android Simpleperf

        本文链接:https://www.haomeiwen.com/subject/ocvpixtx.html