Agregue la interfaz de salida de registro a libc del código fuente del sistema Android10

1. Discusión de la salida de registro en libc

En el código fuente de Android libc, la interfaz de salida de depuración de registros se proporciona de forma predeterminada. El código fuente se encuentra de la siguiente manera:

//头文件定义
bionic/libc/async_safe/include/async_safe/log.h
//实现文件
bionic/libc/async_safe/async_safe_log.cpp

A través del análisis de código async_safe_log.cpp, escribir en el registro es principalmente para usar el socket de dominio UNIX para establecer comunicación con el dominio "/ dev / socket / logdw", y luego escribir los datos del registro. El código lógico central es el siguiente:

//正在写入日志的方法,主要调用open_log_socket建立socket连接,然后写数据进去
int async_safe_write_log(int priority, const char* tag, const char* msg) {
  int main_log_fd = open_log_socket();
  if (main_log_fd == -1) {
    // Try stderr instead.
    return write_stderr(tag, msg);
  }

  iovec vec[6];
  char log_id = (priority == ANDROID_LOG_FATAL) ? LOG_ID_CRASH : LOG_ID_MAIN;
  vec[0].iov_base = &log_id;
  vec[0].iov_len = sizeof(log_id);
  uint16_t tid = gettid();
  vec[1].iov_base = &tid;
  vec[1].iov_len = sizeof(tid);
  timespec ts;
  clock_gettime(CLOCK_REALTIME, &ts);
  log_time realtime_ts;
  realtime_ts.tv_sec = ts.tv_sec;
  realtime_ts.tv_nsec = ts.tv_nsec;
  vec[2].iov_base = &realtime_ts;
  vec[2].iov_len = sizeof(realtime_ts);

  vec[3].iov_base = &priority;
  vec[3].iov_len = 1;
  vec[4].iov_base = const_cast<char*>(tag);
  vec[4].iov_len = strlen(tag) + 1;
  vec[5].iov_base = const_cast<char*>(msg);
  vec[5].iov_len = strlen(msg) + 1;

  int result = TEMP_FAILURE_RETRY(writev(main_log_fd, vec, sizeof(vec) / sizeof(vec[0])));
  __close(main_log_fd);
  return result;
}

//建立到/dev/socket/logdw的通信
static int open_log_socket() {
  // ToDo: Ideally we want this to fail if the gid of the current
  // process is AID_LOGD, but will have to wait until we have
  // registered this in private/android_filesystem_config.h. We have
  // found that all logd crashes thus far have had no problem stuffing
  // the UNIX domain socket and moving on so not critical *today*.

  int log_fd = TEMP_FAILURE_RETRY(socket(PF_UNIX, SOCK_DGRAM | SOCK_CLOEXEC | SOCK_NONBLOCK, 0));
  if (log_fd == -1) {
    return -1;
  }

  union {
    struct sockaddr addr;
    struct sockaddr_un addrUn;
  } u;
  memset(&u, 0, sizeof(u));
  u.addrUn.sun_family = AF_UNIX;
  strlcpy(u.addrUn.sun_path, "/dev/socket/logdw", sizeof(u.addrUn.sun_path));

  if (TEMP_FAILURE_RETRY(connect(log_fd, &u.addr, sizeof(u.addrUn))) != 0) {
    __close(log_fd);
    return -1;
  }

  return log_fd;
}

Dado que el método anterior no es muy bueno, lo siguiente definirá varias definiciones de macros de impresión de registros de uso común a través de "#define".

2. Definición de interfaz de salida de registro conveniente

Consulte las definiciones de macros de LOGD / LOGI / LOGE en el desarrollo habitual de ndk y defina la siguiente interfaz de registro que es conveniente para llamar en libc en el archivo bionic / libc / async_safe / include / async_safe / log.h. Como sigue:

imagen

 

Tres, llame a la función abierta en libc

 

imagen

 

 

Cuarto, los resultados de la prueba

Después de compilar y flashear, el efecto de salida del registro del terminal no es malo:

imagen

 

Artículo anteriorDiversión con el desarrollo y la personalización del código fuente de Android 10 (19) Agregue llamadas arbitrarias de la interfaz de registro a la biblioteca principal de Java libcore

Divertido directorio de artículos de desarrollo de código fuente de Android10:

Divertido desarrollo y personalización de código fuente de Android10 (1) descarga y compilación de código fuente

Divertido desarrollo y personalización del código fuente de Android10 (2) operación de flasheo

Divertido desarrollo y personalización del código fuente de Android10 (2) demostración de flasheo rápido del funcionamiento del flash

Divertido desarrollo y personalización del código fuente de Android10 (2) Demo de recuperación de flasheo de la operación de flasheo

Diviértete con el desarrollo y la personalización del código fuente de Android10 (3) compila el paquete flash del teléfono móvil en el código fuente

Desarrollo y personalización de código fuente de Android10 divertido (4) Construcción del entorno de desarrollo de código fuente

Divertido desarrollo y personalización de código fuente de Android10 (5) Comandos comunes en la compilación y desarrollo de código fuente

Diversión con el desarrollo y personalización del código fuente de Android10 (6) modifique el código fuente del kernel para evitar la detección de anti-depuración

Diversión con el desarrollo y personalización del código fuente de Android10 (7) modifique ptrace para evitar la depuración

Divertido desarrollo y personalización del código fuente de Android10 (ocho) Apk integrado en el sistema

Divertido desarrollo y personalización del código fuente de Android10 (9) Frida-gadget incorporado para que los archivos y los archivos ejecutables del servidor frida se guarden en el sistema

Diversión con el desarrollo y la personalización del código fuente de Android10 (10) Agregue el comando para obtener la actividad superior que se está ejecutando actualmente

Diversión con el desarrollo y la personalización del código fuente de Android10 (11) capítulo del kernel del desarrollo y compilación del módulo del kernel de Android

Divertido desarrollo y personalización del código fuente de Android10 (12) Artículo del kernel logcat output kernel log  Divertido desarrollo y personalización del código fuente de Android10 (13) Modificar el código fuente de Android Desactivar selinux

Diversión con el desarrollo y la personalización del código fuente de Android10 (14) Modifique el código fuente de Android y el teléfono nunca dormirá

Diversión con el desarrollo y personalización del código fuente de Android10 (15) para lograr la configuración predeterminada, como omitir el asistente de arranque, enchufar el cable de alimentación y no dormir

Diversión con el desarrollo y personalización del código fuente de Android10 (16) El sistema de compilación del modo de usuario en LineageOS

Divertido desarrollo y personalización del código fuente de Android10 (17) Desarrollo y aplicación incorporada con permisos del sistema (sistema)

Diversión con el desarrollo y la personalización del código fuente de Android 10 (18) Compile las herramientas adb y fastboot de la plataforma Windows

Diversión con el desarrollo y la personalización del código fuente de Android 10 (19) Agregue llamadas arbitrarias de la interfaz de registro a la biblioteca principal de Java libcore

 

imagen

Bienvenidos a todos a seguir la cuenta pública de WeChat

Supongo que te gusta

Origin blog.csdn.net/u011426115/article/details/113065146
Recomendado
Clasificación