# Copyright (C) 2017 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

service traced /system/bin/traced
    class late_start
    disabled
    socket traced_consumer stream 0666 root root
    socket traced_producer stream 0666 root root
    user nobody
    group nobody
    task_profiles ProcessCapacityHigh

service traced_probes /system/bin/traced_probes
    class late_start
    disabled
    user nobody
    # Despite the "log" group below, traced_probes is allowed to read log
    # only on userdebug/eng via selinux (see traced_probes.te).
    group nobody readproc log readtracefs
    task_profiles ProcessCapacityHigh
    # Clean up procfs configuration even if traced_probes crashes
    # unexpectedly.
    onrestart exec_background - nobody shell -- /system/bin/traced_probes --cleanup-after-crash
    file /dev/kmsg w
    capabilities DAC_READ_SEARCH

on property:persist.device_config.global_settings.sys_traced=1
    setprop persist.traced.enable 1

on property:persist.device_config.global_settings.sys_traced=0
    setprop persist.traced.enable 0

on property:debug.atrace.user_initiated=1
    stop traced_probes

on property:persist.traced.enable=1 && property:debug.atrace.user_initiated=""
    start traced_probes

on property:persist.traced.enable=1
    # Trace files need to be:
    # - Written by either uid:shell or uid:statsd.
    # - Read by shell and incidentd.
    mkdir /data/misc/perfetto-traces 0773 root shell

    # Traces in this directory are only accessed by dumpstate (read+unlink) and
    # by the bug reporting UI (ls+getattr).
    mkdir /data/misc/perfetto-traces/bugreport 0773 root shell

    # This directory allows shell to save configs file in a place where the
    # perfetto cmdline client can read then. /data/local/tmp/ isn't safe because
    # too many other domains can write into that. See b/170404111.
    mkdir /data/misc/perfetto-configs 0775 root shell

    start traced
    start traced_probes

on property:persist.traced.enable=0
    stop traced
    stop traced_probes

# Reset the Perfetto guard rail state on boot:
on post-fs-data
    rm /data/misc/perfetto-traces/.guardraildata

#############################################################################
#  mm_events - Arms a perfetto trace config that is triggered
#              on memory pressure (kmem_activity trigger)
#############################################################################

service mm_events /system/bin/mm_events
    class late_start
    disabled
    oneshot
    user nobody
    group nobody

on property:persist.mm_events.enabled=true && property:persist.traced.enable=1
    restart mm_events   # Restart to reset backoff interval

on property:persist.mm_events.enabled=false
    stop mm_events

#############################################################################
#  perfetto_trace_on_boot - Starts a perfetto trace on boot
#############################################################################
#
# There are two separate actions (a trigger action and a start action) to make
# sure that perfetto_trace_on_boot is started only once on boot (otherwise,
# whenever persist.debug.perfetto.boottrace=1 is set, perfetto_trace_on_boot
# would start immediately).
#
# persist.debug.perfetto.boottrace=1 can be manually set after boot (to record
# a trace on the next reboot) and we don't want to immediately start a trace
# when setting the debug property. So we turn "ro.persistent_properties.ready"
# into a trigger, and then check whether we should start tracing when the
# trigger fires.
on perfetto_maybe_trace_on_boot && property:persist.debug.perfetto.boottrace=1 && property:persist.traced.enable=1
    setprop persist.debug.perfetto.boottrace ""
    rm /data/misc/perfetto-traces/boottrace.perfetto-trace
    # Set by traced after listen()ing on the consumer socket. Without this,
    # perfetto could try to connect to traced before traced is ready to listen.
    wait_for_prop sys.trace.traced_started 1
    start perfetto_trace_on_boot

on property:ro.persistent_properties.ready=true
    trigger perfetto_maybe_trace_on_boot

service perfetto_trace_on_boot /system/bin/perfetto -c /data/misc/perfetto-configs/boottrace.pbtxt --txt -o /data/misc/perfetto-traces/boottrace.perfetto-trace
    disabled
    gentle_kill
    oneshot
    user shell
    group nobody

# This is meant to stop the boot tracing.
# To use this, add a trigger with mode STOP_TRACING in the configuration used in perfetto_trace_on_boot.
# Then create a new config which contains `activate_triggers: <trigger name>` where <trigger name> is
# the name specified in configuration used in perfetto_trace_on_boot.
on property:sys.boot_completed=1 && property:init.svc.perfetto_trace_on_boot=running
    exec -- /system/bin/perfetto -c /data/misc/perfetto-configs/stopboottracetrigger.pbtxt --txt

# Forcefully enable select userspace (atrace) tracing categories early into the
# userspace boot. This is primarily for capturing zygote events without waiting
# for perfetto daemons or the /data partition.
on late-init && property:ro.boot.fastboot.boottrace=enabled
    setprop debug.atrace.tags.enableflags 802922

# disable on boot complete when using textual ftrace tracing without perfetto.
on property:sys.boot_completed=1 && property:ro.boot.fastboot.boottrace=enabled && property:init.svc.perfetto_trace_on_boot=
    setprop debug.atrace.tags.enableflags 0
    write /sys/kernel/debug/tracing/tracing_on 0
    write /sys/kernel/tracing/tracing_on 0

# These must be set as soon as possible for processes guarded by
# android.sdk_sysprop_guard to find and cache the memory locations of
# where these sysprops are stored, particularly SurfaceFlinger which starts
# very early.
# TODO(b/281329340): remove this when no longer needed.
on init
    setprop debug.perfetto.sdk_sysprop_guard_generation 0
    setprop debug.hwui.skia_tracing_enabled false
    setprop debug.hwui.skia_use_perfetto_track_events false
    setprop debug.renderengine.skia_tracing_enabled false
    setprop debug.renderengine.skia_use_perfetto_track_events false
