앱을 계측하여 추적 로그 생성

Debug 클래스를 사용하여 앱을 계측하면 앱 실행의 메서드 추적을 생성할 수 있습니다. 이런 식으로 앱을 계측하면 기기가 추적 정보 기록을 시작하고 중지하는 시점을 더욱 정확히 제어할 수 있습니다. 또한, 기기는 개발자가 지정하는 이름으로 추적 로그를 저장하므로 이후에 각각의 로그를 쉽게 식별할 수 있습니다. 그러면 Android Studio 또는 Traceview를 사용하여 각 추적 로그를 볼 수 있습니다.

앱의 코드를 계측할 필요 없이 앱을 추적하는 또 다른 방법은 Android Studio의 CPU Profiler를 사용하여 메서드 추적을 시작하고 중지하는 것입니다. 자세한 내용은 CPU Profiler를 이용한 CPU activity 및 메서드 추적 검사를 읽어보세요.

추적 로그 생성을 시작하기 전에 앱이 기기에 추적 로그를 저장할 수 있도록 외부 저장소(WRITE_EXTERNAL_STORAGE)에 대한 쓰기 권한을 가지고 있는지 확인하세요.

앱 계측

추적 로그를 생성하려면 시스템에서 추적 데이터 로깅을 시작하도록 하려는 startMethodTracing()을 호출하세요.

호출할 때 .trace 파일의 이름을 지정할 수 있고 대상 기기에 영구 앱 데이터용으로 생성된 패키지별 디렉토리에 파일이 저장됩니다. 이 디렉토리는 getExternalFilesDir()에 의해 반환되는 것과 같은 디렉토리이며 대부분의 기기에서 ~/sdcard/ 디렉토리에 있습니다. 이 파일에는 바이너리 메서드 추적 데이터와 스레드 및 메서드 이름을 가진 매핑 테이블이 들어 있습니다. 추적을 중지하려면 stopMethodTracing()을 호출하세요.

다음 샘플은 이름이 sample.trace인 추적 로그의 기록을 시작하고 중지합니다.

// Starts recording a trace log with the name you provide. For example, the
// following code tells the system to start recording a .trace file to the
// device with the name "sample.trace".
Debug.startMethodTracing("sample");
...
// The system begins buffering the generated trace data, until your
// application calls stopMethodTracing(), at which time it writes
// the buffered data to the output file.
Debug.stopMethodTracing();

앱이 추적 로그의 이름을 변경하지 않고 startMethodTracing()을 다시 호출하는 경우에는 기기에 저장된 기존 로그를 덮어쓴다는 점에 유의하세요. 각 추적 로그의 이름을 동적으로 변경하는 방법을 알아보려면 여러 로그 저장에 대한 섹션을 참조하세요.

시스템의 최대 버퍼 크기에 도달한 후에 stopMethodTracing()을 호출하면 추적이 중지되고 콘솔로 알림이 전송됩니다. 추적을 시작하고 중지하는 메서드는 전체 앱 프로세스에 걸쳐 유효합니다. 즉, activity의 onCreate(Bundle) 메서드에서 startMethodTracing()을 호출하고 그 activity의 onDestroy() 메서드에서 stopMethodTracing()을 호출할 수 있습니다.

프로파일링이 활성화되어 있으면 앱의 실행 속도가 더 느려진다는 점에 유의하세요. 즉, 프로파일링 데이터를 사용하여 절대 타이밍을 결정하면 안 됩니다(예: '메서드 foo() 실행에 2.5초가 걸림'). 추적 로그에서 타이밍 정보는 이전의 추적 로그와 비교할 때만 유용하므로, 최근의 변경 사항으로 인해 앱이 더 빨라지거나 느려지는 것인지 알 수 있습니다.

Android 5.0(API 레벨 21) 이상을 실행 중인 기기에 배포할 때 샘플 기반 프로파일링을 사용하여 런타임 성능의 영향을 덜 받고서 프로파일링할 수 있습니다. 샘플 프로파일링을 활성화하려면 (startMethodTracing()을 호출하는 대신) 지정된 샘플링 간격으로 startMethodTracingSampling()을 호출하세요. 그러면 앱이 stopMethodTracing()을 호출할 때까지 샘플이 주기적으로 수집됩니다.

여러 로그 저장

추적 로그에 대해 새 이름을 지정하지 않고 메서드 추적을 여러 차례 시작하고 중지하면 기기에서 이전의 추적 로그를 새 추적 로그로 덮어쓰게 됩니다. 즉, 최근 추적 로그만 유지됩니다. 기기에 여러 추적 로그를 저장하려면 앱이 startMethodTracing()을 호출할 때마다 추적 로그 이름을 동적으로 바꾸세요. 아래 샘플에서는 각 추적 로그의 이름을 지정할 때 현재 날짜와 시간을 포함하도록 SimpleDateFormat 클래스를 사용합니다.

// Uses the SimpleDateFormat class to create a String with
// the current date and time.
SimpleDateFormat date =
        new SimpleDateFormat("dd_MM_yyyy_hh_mm_ss");
String logDate = date.format(new Date());
// Applies the date and time to the name of the trace log.
Debug.startMethodTracing(
        "sample-" + logDate);

기기의 추적 로그에 액세스

시스템에서 기기에 추적 로그를 생성한 후 다음 방법 중 하나로 파일에 액세스할 수 있습니다.

  • Device File Explorer 사용. Device File Explorer를 열려면 View > Tool Windows > Device File Explorer를 클릭하거나 도구 창 표시줄에 있는 Device File Explorer 버튼을 클릭하세요. 그림 1과 같이 앱의 패키지별 디렉토리를 탐색하여 .trace 파일을 찾을 수 있습니다.

    그림 1. Device File Explorer를 사용하여 추적 로그 찾기.

    • 그림 2와 같이 IDE의 편집기 창 내에서 추적 로그를 빠르게 보려면 파일을 두 번 클릭하세요. 파일을 마우스 오른쪽 버튼으로 클릭하여 로컬 디스크에 저장한 다음 Traceview를 사용하여 부모 메서드와 자식 메서드, 메서드 호출당 평균 실행 시간, CPU와 실시간 등의 더욱 세부적인 정보를 살펴볼 수도 있습니다. 로그 파일이 보이지 않으면 로그 파일이 있을 것으로 예상되는 디렉토리를 마우스 오른쪽 버튼으로 클릭하고 Synchronize를 선택해보세요.

      그림 2. Android Studio에서 .trace 파일 보기.

  • adb pull 명령어를 사용하여 로컬 컴퓨터에 파일을 복사합니다. 아래 명령어를 실행하면 sample.trace라는 이름의 추적 로그 파일이 기기에서 로컬 컴퓨터의 ~/Documents/trace-logs/ 디렉토리로 복사됩니다. 그러면 Traceview를 사용하여 .trace 파일을 볼 수 있습니다.

    adb pull path-on-device/sample.trace ~/Documents/trace-logs/