编译strace
加入编译选项到device.mk:
PRODUCT_PACKAGES += strace
触发编译:
mmma -j6 external/strace
跟踪进程
adb shell strace -f -p PID
-p代表跟踪进程号为PID的进程,-f代表跟踪该进程以及之后fork生成的所有进程。
如果想要把strace的log输出到指定的文件可以使用:
adb shell strace -f -p PID -o file
-o file选项将会把strace log输出到file中,而不是stderr中。
追踪Android应用的方法
首先需要放开selinux权限,当selinux权限不满足要求时无法进行strace:
adb shell setenforce 0
Android apps其实都是由zygote进程fork来的,所以我们如果要strace一个app,可以通过-f -p指定到zygote对应的进程,就可以跟踪到对应的所有子进程。
example:
sdm660:/ # ps -A | grep zygote
root 959 1 4247260 74288 poll_schedule_timeout 0 S zygote64
root 960 1 1577152 65916 poll_schedule_timeout 0 S zygote
webview_zygote 1817 1 1338924 32124 poll_schedule_timeout 0 S webview_zygote32
sdm660:/ # strace -f -p 959 -tt -T -s 500 -o /sdcard/strace.txt
strace: Process 959 attached with 5 threads
重新封装service
如果想要从service启动时就开始进行strace,可以通过在init.rc中重新定义service来做。
比如:
-service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
+service zygote /system/xbin/strace -o /data/local/tmp/zygote.strace /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
类似上面的方式,zygote的进程名已经修改为了strace,那么还要保证strace具有相应的selinux的权限,在这里不再进一步展开说明。
或者我们把selinux设置为permissive,在cmdline中添加参数androidboot.selinux=permissive。配置方法如下:
BoardConfig.mk:
BOARD_KERNEL_CMDLINE:=(省略......)androidboot.selinux=permissive