추적은 성능 문제를 처음 살펴볼 때 가장 좋은 정보 출처입니다. 이를 바탕으로 문제가 무엇이고 어디서부터 살펴보아야 하는지에 관한 가설을 세울 수 있습니다.
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를 사용하지 않는 경우 비교적 작음 있습니다. 이러한 추적 문자열은 추가로 난독화가 해제되므로 추적 도구를 사용할 수도 있습니다 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>
는 기기의 트레이스( record 명령어).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에 관한 자세한 내용을 확인하세요. 계측 인수입니다
의견
이 기능 및 발견한 버그와 요청에 관한 의견을 보내주세요. 문제를 통해 의견을 보내실 수 있습니다. 추적기를 사용합니다.