android-ndk-profiler需要使用gcc进行编译,从NDK r13b 起NDK使用的默认编译器从gcc换成了clang,官方提供了Simpleperf工具进行性能分析,具体情况可以参考https://developer.android.google.cn/ndk/guides/simpleperf 。
下载
android-ndk-profiler的项目地址:https://github.com/richq/android-ndk-profiler
使用
编译方面的改动
修改Android.mk以导入android-ndk-profiler模块
# compile with profiling
LOCAL_CFLAGS := -pg
LOCAL_STATIC_LIBRARIES := android-ndk-profiler
# 在 Android.mk 最后
$(call import-add-path,$your_path) #导入android-ndk-profiler的路径
$(call import-module,android-ndk-profiler)
代码方面的改动
在开始和结束的方法里分别调用monstartup 和 moncleanup。
//在代码开始前
monstartup("your_lib.so");
//在代码结束后
moncleanup();
代码分析生成的gmon.out文件保存在/sdcard/gmon.out。在AndroidManifest.xml文件添加写入权限,以便应用能写入到sd卡。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
得到结果
编译程序运行,使用adb把gmon.out文件拉到电脑上。
adb pull /sdcard/gmon.out .
运行gprof工具,将带有调试信息的库(通常在 $PROJECT/obj/local/armeabi-v7a/libXXXX.so)作为参数传给gprof工具就能得到结果了。
$ANDROID_NDK/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/arm-linux-androideabi-gprof your_lib.so
网友评论