Android10 시스템 소스 코드의 libc에 로그 출력 인터페이스 추가

1. libc의 로그 출력에 대한 논의

Android 소스 코드 libc에서 로그 디버깅 출력 인터페이스가 기본적으로 제공됩니다. 소스 코드는 다음과 같습니다.

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

async_safe_log.cpp 코드 분석을 통해 로그에 쓰는 것은 주로 UNIX 도메인 소켓을 사용하여 도메인 "/ dev / socket / logdw"와 통신을 설정하고 로그 데이터를 쓰는 것입니다. 핵심 로직 코드는 다음과 같습니다.

//正在写入日志的方法,主要调用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;
}

위의 방법은 그리 멋지지 않기 때문에 다음은 "#define"을 통해 일반적으로 사용되는 여러 로그 인쇄 매크로 정의를 정의합니다.

2. 편리한 로그 출력 인터페이스 정의

일반적인 ndk 개발에서 LOGD / LOGI / LOGE의 매크로 정의를 참조하고 bionic / libc / async_safe / include / async_safe / log.h 파일에서 libc 에서 호출하기 편리한 다음 로그 인터페이스를 정의하십시오. 다음과 같이 :

영상

 

셋째, libc의 open 함수 호출

 

영상

 

 

넷째, 테스트 결과

컴파일 및 플래시 후 터미널 로그 출력 효과는 나쁘지 않습니다.

영상

 

Previous articleAndroid 10 소스 코드 개발 및 사용자 지정으로 재미있게 (19) Java 코어 라이브러리 libcore에 로그 인터페이스 임의 호출 추가

재미있는 Android10 소스 코드 개발 기사 디렉토리 :

재미있는 Android10 소스 코드 개발 및 사용자 정의 (1) 소스 코드 다운로드 및 컴파일

재미있는 Android10 소스 코드 개발 및 사용자 정의 (2) 플래시 작업

재미있는 Android10 소스 코드 개발 및 사용자 정의 (2) 플래시 작업의 빠른 부팅 플래시 데모

재미있는 Android10 소스 코드 개발 및 사용자 정의 (2) 플래시 작업의 복구 플래시 데모

Android10 소스 코드 개발 및 커스터마이징 (3) 소스 코드에서 휴대폰 플래시 패키지를 컴파일하여 즐기십시오.

재미있는 Android10 소스 코드 개발 및 사용자 정의 (4) 소스 코드 개발 환경 구축

재미있는 Android10 소스 코드 개발 및 사용자 지정 (5) 소스 코드 컴파일 및 개발의 일반적인 명령

Android10 소스 코드 개발 및 사용자 정의 (6) 안티 디버깅 감지를 우회하도록 커널 소스 코드 수정

Android10 소스 코드 개발 및 사용자 정의 (7) 안티 디버깅을 우회하도록 ptrace 수정

재미있는 Android10 소스 코드 개발 및 사용자 정의 (8 개) 시스템에 내장 된 Apk

재미있는 Android10 소스 코드 개발 및 사용자 지정 (9) 내장 된 frida-gadget so 파일 및 frida-server 실행 파일을 시스템에

Android10 소스 코드 개발 및 사용자 지정에 대한 재미 (10) 명령을 추가하여 현재 실행중인 최상위 활동을 가져옵니다.

Android10 소스 코드 개발 및 사용자 정의 (11) Android 커널 모듈 개발 및 컴파일의 커널 장으로 재미

재미있는 Android10 소스 코드 개발 및 사용자 지정 (12) 커널 기사 logcat 출력 커널 로그  재미있는 Android10 소스 코드 개발 및 사용자 지정 (13) Android 소스 코드 수정 selinux 끄기

Android10 소스 코드 개발 및 사용자 지정으로 재미 있음 (14) Android 소스 코드를 수정하면 전화기가 잠들지 않습니다.

Android10 소스 코드 개발 및 사용자 지정 (15)을 사용하여 부팅 마법사 건너 뛰기, 전원 코드 연결 및 잠자기 등의 기본 구성을 달성합니다.

Android10 소스 코드 개발 및 커스터마이징을 통한 재미 (16) LineageOS에서 사용자 모드를 컴파일하는 시스템

재미있는 Android10 소스 코드 개발 및 사용자 지정 (17) 시스템 권한이있는 앱 개발 및 내장 (시스템)

Android 10 소스 코드 개발 및 사용자 지정에 대한 재미 (18) Windows 플랫폼 adb 및 fastboot 도구 컴파일

Android 10 소스 코드 개발 및 사용자 지정을 통한 재미 (19) Java 코어 라이브러리 libcore에 로그 인터페이스 임의 호출 추가

 

영상

WeChat 공개 계정을 팔로우하는 모든 사람을 환영합니다

추천

출처blog.csdn.net/u011426115/article/details/113065146