Usando Strace

Strace le permite ver las llamadas al sistema que hace un proceso y lo que devuelven esas llamadas al sistema.

Traza del edificio

Para compilar strace, ejecute lo siguiente:

mmma -j6 external/strace

Adjuntar a un proceso en ejecución

El caso de uso más simple y común para strace es adjuntarlo a un proceso en ejecución, lo que puede hacer con:

adb shell strace -f -p PID

El indicador -f le dice a strace que se adjunte a todos los subprocesos en el proceso, además de cualquier subproceso nuevo generado más adelante.

Un proceso típico realiza muchas llamadas al sistema, por lo que querrá revisar la página de manual de strace para aprender a recopilar solo los datos que realmente le interesan.

Usar en una aplicación

Para usar strace en una aplicación:

  1. Configure el dispositivo para que pueda ejecutar strace. Debe ser root, deshabilitar SELinux y reiniciar el tiempo de ejecución para eliminar el filtro seccomp que, de lo contrario, evitará que strace se ejecute:
    adb root
    adb shell setenforce 0
    adb shell stop
    adb shell start
    
  2. Configure un directorio de escritura mundial para los registros de strace, porque strace se ejecutará bajo el uid de la aplicación:
    adb shell mkdir -m 777 /data/local/tmp/strace
    
  3. Elija el proceso a rastrear y ejecútelo:
    adb shell setprop wrap.com.android.calendar '"logwrapper strace -f -o /data/local/tmp/strace/strace.com.android.calendar.txt"'
    
  4. Inicie el proceso normalmente.

Uso en el cigoto

Para usar strace en el cigoto, corrija la línea de cigoto init.rc relevante (requiere adb shell setenforce 0 ):

cd system/core/
patch -p1 <<EOF
--- a/rootdir/init.zygote32.rc
+++ b/rootdir/init.zygote32.rc
@@ -1,4 +1,4 @@
-service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
+service zygote /system/bin/strace -o /data/local/tmp/zygote.strace /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
     class main
     socket zygote stream 660 root system
     onrestart write /sys/android_power/request_state wake
EOF

Obtener registros de seguimiento durante el arranque de Android

Para obtener registros de seguimiento durante el arranque de Android, realice los siguientes cambios:

  • Dado que el nombre del proceso cambia de zygote a strace , es posible que el servicio dado no se inicie debido a que falta el strace file_context La solución es agregar una nueva línea para strace en system/sepolicy/private/file_contexts y copiar el contexto del archivo original. Ejemplo:
    /dev/socket/zygote      u:object_r:zygote_socket:s0
    + /system/bin/strace u:object_r:zygote_socket:s0
    
  • Agregue el parámetro kernel o bootconfig, luego inicie el dispositivo en el modo permisivo de SELinux. Puede hacerlo agregando androidboot.selinux=permissive a BOARD_KERNEL_CMDLINE o a BOARD_BOOTCONFIG en Android 12 con kernel versión 5.10 o superior. (Esta variable pasa a ser de solo lectura en build/core/Makefile pero siempre está disponible en /device/*/BoardConfig ).

    Ejemplo para el dispositivo Pixel (pez vela) en /device/google/marlin/sailfish/BoardConfig.mk :
    - BOARD_KERNEL_CMDLINE := ....  androidboot.hardware=sailfish ...
    +BOARD_KERNEL_CMDLINE := ....  androidboot.hardware=sailfish ...  androidboot.selinux=permissive
    
    Después de realizar el cambio, cree y actualice la imagen de inicio y el dispositivo se iniciará en modo permisivo.