Android 6.0下ATrace_isEnabled始终返回false,如何用systrace捕获函数时序?
解决Android 6.0上systrace无法捕获net_test()时序信息的问题
我来帮你一步步排查和解决这个问题——ATrace_isEnabled()返回false、systrace看不到你的net_test标记,本质是当前没有激活对应的trace监听,或者你的应用/进程没被纳入systrace的追踪范围。
第一步:启用所有ATrace标签(让ATrace_isEnabled()返回true)
Android 6.0中,ATrace的标签默认不是全部开启的,你需要通过adb命令全局启用所有trace标签:
adb shell setprop debug.atrace.tags.enableflags 0xffffffff
这个命令会把所有ATrace的可用标签都打开,之后再运行你的应用,ATrace_isEnabled()应该就会返回true了。
第二步:修改systrace命令,指定追踪你的应用
默认的systrace命令只会捕获系统进程和部分默认的trace类别,不会主动监听你的应用的自定义ATrace section。你需要在命令中添加-a <你的应用包名>参数,明确告诉systrace要追踪你的应用进程:
python systrace.py -t 4 -o mynewtrace.html -a com.your.app.package perf sched gfx
记得把com.your.app.package替换成你实际的应用包名。
第三步:确保Native层正确链接ATrace依赖
因为你是在Native代码中调用ATrace_XXX() API,必须确保你的Native库链接了libandroid.so,否则这些API无法正常工作:
- 如果用CMakeLists.txt:
target_link_libraries(你的Native库名称 android) - 如果用Android.mk:
LOCAL_LDLIBS += -landroid
第四步:确认应用可调试(针对Release版本)
如果你的应用是Release版本,需要确保Manifest中开启了调试属性:
<application android:debuggable="true" ...> <!-- 其他配置 --> </application>
Debug版本默认已经开启,这一步可以跳过。
最后验证流程
- 先执行
adb shell setprop debug.atrace.tags.enableflags 0xffffffff - 启动你的应用,确保net_test函数会被触发(可以手动操作触发,或者让应用自动调用)
- 立刻运行修改后的systrace命令
- 等待systrace捕获完成后,打开生成的mynewtrace.html,在搜索框输入
net_test,应该就能看到对应的时序块了。
另外注意:Android 6.0的systrace脚本需要用Python 2.7运行,如果你用Python 3可能会出现兼容性问题,建议切换到Python 2.7执行命令。
内容的提问来源于stack exchange,提问作者maofu
相关产品推荐
相关产品推荐

