추적은 성능 문제를 처음 살펴볼 때 가장 좋은 정보 출처입니다. 이를 바탕으로 문제가 무엇이고 어디서부터 살펴보아야 하는지에 관한 가설을 세울 수 있습니다.
Android에서는 시스템 추적과 메서드 트레이스, 이렇게 두 가지 수준의 추적이 지원됩니다.
시스템 추적은 특별히 추적하도록 표시된 영역만 추적하므로 오버헤드가 낮고 앱 성능에 큰 영향을 미치지 않습니다. 시스템 추적은 코드의 특정 섹션을 실행하는 데 걸리는 시간을 파악하는 데 좋습니다.
메서드 추적은 앱의 모든 함수 호출을 추적합니다. 비용이 많이 들기 때문에 앱의 성능에 큰 영향을 미치지만 어떤 일이 일어나고 있는지, 어떤 함수가 호출되고 얼마나 자주 호출되는지를 전체적으로 파악할 수 있습니다.
시스템 추적에는 기본적으로 개별 구성 가능한 함수가 포함되지 않습니다. 개별 구성 가능한 함수는 메서드 트레이스에서 사용할 수 있습니다.
Google에서는 현재 시스템 추적 내에서 구성 가능한 함수를 표시할 수 있도록 새로운 시스템 추적 기능을 테스트하고 있습니다. 이 기능은 시스템 추적의 낮은 오버헤드와 메서드 트레이스 수준의 컴포지션 세부 정보라는 두 가지 이점을 제공합니다.
컴포지션 추적 설정
프로젝트에서 재구성 추적을 사용해 보려면 최소한 다음 버전으로 업데이트해야 합니다.
- Android 스튜디오 Flamingo
- Compose UI: 1.3.0
- Compose Compiler: 1.3.0
추적을 실행하는 기기 또는 에뮬레이터도 API 수준 30 및 이후 버전이어야 합니다.
또한 Compose 런타임 추적에 새 종속 항목을 추가해야 합니다.
implementation("androidx.compose.runtime:runtime-tracing:1.0.0-beta01")
이 종속 항목을 사용하면 리컴포지션이 포함된 시스템 트레이스를 가져올 때 구성 가능한 함수를 자동으로 확인할 수 있습니다.
시스템 추적 실행
시스템 추적을 실행하여 새로운 재구성 추적이 어떻게 작동하는지 확인하려면 다음 단계를 따르세요.
프로파일러를 엽니다.
그림 2. Android 스튜디오 - 프로파일링 시작 CPU 타임라인을 클릭합니다.
그림 3. Android 스튜디오 프로파일러 - CPU 타임라인 앱에서 추적하려는 UI로 이동한 다음 System Trace를 선택하고 Record를 선택합니다.
그림 4. 추적 옵션 - System Trace 앱에서 재구성을 유발한 다음 녹화를 중지합니다. 추적이 처리되고 표시되면 재구성 추적에서 컴포저블을 볼 수 있습니다. 키보드와 마우스를 사용하여 추적을 확대/축소하고 패닝할 수 있습니다. 추적을 살펴보는 데 익숙하지 않으면 트레이스 기록 문서를 참고하세요.
그림 5. 시스템 추적 차트에서 컴포저블을 더블클릭하면 소스 코드로 이동합니다.
Flame Chart의 컴포저블도 파일 및 줄 번호와 함께 확인할 수 있습니다.
그림 6. Flame Chart
주의사항
APK 크기 오버헤드
Google에서는 이 기능의 오버헤드를 가급적 최소화하려고 했지만, Compose 컴파일러가 APK에 삽입한 추적 문자열로 인해 Compose 앱의 APK 크기가 늘어납니다. 앱에서 Compose를 많이 사용하지 않거나 전체 Compose 앱에 더 큰 크기를 사용하지 않는 경우 크기 증가가 비교적 적을 수 있습니다. 이러한 추적 문자열은 앞에서 설명한 것처럼 추적 도구에 표시될 수 있도록 추가로 난독화되지 않습니다. Compose 컴파일러는 버전 1.3.0부터 모든 앱에 이를 삽입합니다.
다음 proguard 규칙을 추가하여 프로덕션 빌드에서 추적 문자열을 삭제할 수 있습니다.
-assumenosideeffects public class androidx.compose.runtime.ComposerKt {
boolean isTraceInProgress();
void traceEventStart(int,int,int,java.lang.String);
void traceEventStart(int,java.lang.String);
void traceEventEnd();
}
이러한 함수는 추후 변경될 수 있으며, 모든 변경사항은 Compose 출시 노트에서 확인할 수 있습니다.
APK 크기가 늘어나는 대신 이러한 함수를 사용하면 앱 사용자가 실행하는 APK와 동일한 APK를 프로파일링할 수 있습니다.
정확한 타이밍
다른 성능 테스트와 마찬가지로 정확한 프로파일링을 위해서는 프로파일링 가능한 애플리케이션에 따라 앱을 profileable
및 non-debuggable
로 만들어야 합니다.
터미널에서 트레이스 캡처
터미널에서 컴포지션 트레이스를 캡처할 수 있습니다. 이렇게 하려면 Android 스튜디오에서 일반적으로 자동으로 실행하는 단계를 실행해야 합니다.
종속 항목 추가
먼저 앱에 종속 항목을 추가합니다.
implementation("androidx.tracing:tracing-perfetto:1.0.0")
implementation("androidx.tracing:tracing-perfetto-binary:1.0.0")
레코드 명령어 생성
- Perfetto를 사용하여 레코드 명령어를 생성합니다.
다음 예시에 따라
track_event
데이터 소스 섹션을 수동으로 추가합니다.adb shell perfetto \ -c - --txt \ -o /data/misc/perfetto-traces/trace \ <<EOF buffers: { size_kb: 63488 fill_policy: RING_BUFFER } buffers: { size_kb: 2048 fill_policy: RING_BUFFER } data_sources: { config { name: "track_event" } } duration_ms: 10000 flush_period_ms: 30000 incremental_state_config { clear_period_ms: 5000 } EOF
트레이스 캡처
- 앱을 실행하고 추적하려는 섹션을 준비합니다.
브로드캐스트를 실행하여 앱에서 추적을 사용 설정합니다.
# set app package variable, e.g. com.google.samples.apps.nowinandroid.debug # can be found through `adb shell ps -ef` or `adb shell cmd package list packages` package=<your app process> # issue a broadcast to enable tracing adb shell am broadcast \ -a androidx.tracing.perfetto.action.ENABLE_TRACING \ $package/androidx.tracing.perfetto.TracingReceiver
이전에 만든 녹음 명령어를 시작합니다.
트레이스 열기
기기의 트레이스 (레코드 명령어에 지정된 위치)를
adb pull <location>
합니다.Perfetto에서 엽니다.
Jetpack Macrobenchmark로 트레이스 캡처
트레이스를 결과로 제공하는 Jetpack Macrobenchmark로 성능을 측정할 수 있습니다. Macrobenchmark로 컴포지션 추적을 사용 설정하려면 다음을 실행해야 합니다.
Macrobenchmark 테스트 모듈에 다음 종속 항목을 추가합니다.
implementation("androidx.tracing:tracing-perfetto:1.0.0") implementation("androidx.tracing:tracing-perfetto-binary:1.0.0")
벤치마크를 실행하기 전에
androidx.benchmark.fullTracing.enable=true
계측 인수를 추가합니다. Macrobenchmark 계측 인수에 관한 자세한 내용은 Macrobenchmark 계측 인수를 참고하세요.
의견
이 기능 및 발견한 버그와 요청에 관한 의견을 보내주세요. Issue Tracker를 통해 의견을 보낼 수 있습니다.