一、理论
1.背景
2.sepolicy修改
Android版本 Api Level SDK
Android 14 (Developer Preview)
Android 13.0(T) 33
Android 12.0(S) 31,32
Android 11.0(R) 30
Android 10.0(Q) 29
Android 9.0(Pie) 28
Android 8.1(Oreo) 27
Android 8.0(Oreo) 26
Android 7.1(Nougat) 25
Android 7.0(Nougat) 24
Android 6.0(Marshmallow) 23
Android 5.1(Lollipop) 22
Android 5.0(Lollipop) 21
Android 4.4W(KitKat Wear) 20
Android 4.4(KitKat) 19
Android 4.3(Jelly Bean) 18
Android 4.2(Jelly Bean) 17
Android 4.1(Jelly Bean) 16
Android 4.0.3(IceCreamSandwich) 15
Android 4.0(IceCreamSandwich) 14
Android 3.2(Honeycomb) 13
Android 3.1(Honeycomb) 12
Android 3.0(Honeycomb) 11
Android 2.3.3(Gingerbread) 10
Android 2.3(Gingerbread) 9
Android 2.2(Froyo) 8
Android 2.1(Eclair) 7
Android 2.0.1(Eclair) 6
Android 2.0(Eclair) 5
Android 1.6(Dout) 4
Android 1.5(Cupcake) 3
Android 1.1(Base) 2
Android 1.0(Base) 1
3. 抓取trace
3.1 QCOM平台
3.1.1 抓取atrace日志
adb push atrace.rc /system/etc/init/atrace.rc
$ adb shell
# setprop persist.traced.enable 0
# setprop persist.debug.atrace.boottrace 1
$ adb shell atrace --async_stop -z -c -o /data/local/tmp/atrace.out
$ python systrace.py --from-file=atrace.out
3.1.2 抓取zygote启动阶段的trace数据
$ adb shell
# setprop persist.debug.atrace.boottrace 0
修改设备上的init.rc文件
首先将设备中的init.rc文件pull出来
$ adb pull /system/etc/init/hw/init.rc
修改init.rc文件
$ adb push init.rc /system/etc/init/hw/
3.2 MTK平台
3.2.1 抓取atrace日志
$ adb shell
# setprop persist.traced.enable 0
# setprop persist.vendor.boot_trace 1
$ adb shell "cat /sys/kernel/tracing/trace" > SYS_FRACE
二、执行操作
如需在启动过程中启用 systrace,请执行以下操作:
在 frameworks/native/cmds/atrace/atrace.rc 中,修改如下:
write /sys/kernel/debug/tracing/tracing_on 0write /sys/kernel/tracing/tracing_on 0
更改为:
write /sys/kernel/debug/tracing/tracing_on 1write /sys/kernel/tracing/tracing_on 1
这将启用跟踪功能(默认处于停用状态)。
在 device.mk 文件中,添加以下:
PRODUCT_PROPERTY_OVERRIDES += debug.atrace.tags.enableflags=802922
PRODUCT_PROPERTY_OVERRIDES += persist.traced.enable=0
在设备专属 init.rc 文件中,添加以下行:
on property:sys.boot_completed=1 // This stops tracing on boot complete
write /d/tracing/tracing_on 0
write /d/tracing/events/ext4/enable 0
write /d/tracing/events/f2fs/enable 0
write /d/tracing/events/block/enable 0
在设备启动后,提取跟踪记录:
adb root && adb shell atrace --async_stop -z -c -o /data/local/tmp/boot_trace
adb pull /data/local/tmp/boot_trace
三、项目中实际应用(MTK QCOM通用)
1.system/core/rootdir/init.rc 添加如下:开机完成关闭trace
on property:sys.boot_completed=1write /d/tracing/tracing_on 0write /d/tracing/events/ext4/enable 0write /d/tracing/events/f2fs/enable 0write /d/tracing/events/block/enable 0
2.frameworks/native/cmds/atrace/atrace.rc
原本start boottrace 触发条件是on late-init persist.debug.atrace.boottrace=1
下面的修改是直接将on late-init 改成了on early-init 并将persist.debug.atrace.boottrace 条件去掉直接触发start boottrace 可以不用使用我下面的修改,可以按照你们需要调整start boottrace 例如可以在init.rc 不同的trigger阶段去启动boottrace service.
3.device/qcom/xxx/xxxx.mk 或者build/target/product/base_system.mk 添加属性配置
4.BoardConfig.mk BOARD_KERNEL_CMDLINE 追加下面字段
BOARD_KERNEL_CMDLINE += trace_buf_size=64M trace_event=cpu_frequency,sched_cpu_util,sched_boost_cpu,cpufreq_interactive,cpu_idle,cpu_frequency,cpu_frequency_limits,sched_wakeup,sched_switch,sched_blocked_reason,sched_cpu_hotplug
高通项目一般在device/qcom/xxxx/BoardConfig.mk
MTK项目一般在device/mediatek/xxxx/BoardConfig.mk