네이티브 추적

이 가이드는 네이티브 추적 API (trace.h)를 사용하여 시스템 버퍼에 대한 추적 이벤트를 작성하는 방법을 설명합니다. 그런 다음 Systrace 도구를 사용하여 이 추적 출력을 분석하면 됩니다. 네이티브 추적 API는 Android API 레벨 23 이상에서 지원됩니다.

개요

네이티브 코드로 맞춤 추적을 생성하는 방법은 자바 프로그래밍 언어 기법과 유사합니다. 이 내용에 대해서는 에 설명되어 있습니다. 애플리케이션 코드 추적. 보통은 try/catch 블록에 네이티브 추적을 넣지 않아도 됩니다. 다만 추적된 섹션에서 네이티브 예외가 발생하거나 해당 섹션이 조기 반환을 사용하는 경우는 예외입니다.

ATrace_beginSection() 호출에 대해 상응하는 ATrace_endSection() 호출이 있는지도 확인해야 합니다. 이것이 없으면 손상된 추적 파일이 생길 수 있기 때문입니다.

추적을 사용 설정하지 않았을 때 복잡한 문자열이나 인수가 빌드되지 않도록 하려면 ATrace_isEnabled()를 호출하여 보호 수단을 추가하면 됩니다. .

함수 추적

네이티브 추적 API 사용 사례로는 코드의 특정 블록에 의해 소요되는 시간을 관찰하는 것이 대표적입니다. 일반적으로 이러한 추적은 파이프라인 처리 단계에 속합니다(예를 들어 이미지를 디코딩할 때나 프레임을 그릴 때 또는 네트워크 요청을 대기 중일 때 등).

코드 블록이 소요한 시간을 추적하려면 다음과 같은 단계를 따릅니다.

  1. trace.h 헤더 파일을 포함합니다.
    #include <android/trace.h>
    
  2. 변수를 의 섹션 이름으로 지정합니다. ATrace_beginSection(). 추적하고자 하는 코드 블록의 끝에 에 대하여 상응하는 호출을 수행합니다. ATrace_endSection(). 이것은 추적된 섹션이 네이티브 예외를 발생시키거나 조기 반환을 사용하는 경우 특히 중요합니다.
    void myExpensiveFunction() {
      ATrace_beginSection("myExpensiveFunction");
      ... // trace-worthy work here
      ATrace_endSection();
    }
    
  3. (옵션) 코드 블록을 추적하기 위해 편리한 객체/매크로 구조를 생성합니다. 다음 예시는 일명 ATRACE_CALL()이라고 하는 그러한 객체/매크로를 구현하는 방법을 나타낸 것입니다.
    #define ATRACE_NAME(name) ScopedTrace ___tracer(name)
    
    // ATRACE_CALL is an ATRACE_NAME that uses the current function name.
    #define ATRACE_CALL() ATRACE_NAME(__FUNCTION__)
    
    class ScopedTrace {
      public:
        inline ScopedTrace(const char *name) {
          ATrace_beginSection(name);
        }
    
        inline ~ScopedTrace() {
          ATrace_endSection();
        }
    };
    
    ATRACE_CALL() 객체/매크로를 사용하면 이전 단계의 코드를 다음과 같이 간소화할 수 있습니다. 이런 식으로 객체/매크로를 사용하면 추적된 섹션이 예외를 발생시키거나 조기 반환을 사용하더라도 try/catch 블록을 추가해야 하나 걱정할 필요가 없습니다.
    void myExpensiveFunction() {
      ATRACE_CALL();
      ... // trace-worthy work here
    }