안드로이드에서 성능 문제를 분석할 때 다양한 도구들이 사용됩니다. 특히 렉이나 응답 지연과 같은 문제는 TraceView, SysTrace, Perfetto 및 Android Studio의 Android Profiler와 같은 도구들을 통해 해결할 수 있습니다.
- 성능 분석 도구 소개
- TraceView: 함수 단위의 성능 프로파일러로, 각 메서드 호출 시간을 측정했으나 성능 영향이 크다는 이유로 더 이상 권장되지 않습니다.
- SysTrace: 시스템 전반의 동작 정보를 수집하며 CPU 스케줄링, 바인더 통신 등을 모니터링합니다.
- Perfetto: 안드로이드 공식 성능 분석 플랫폼으로, SysTrace를 대체하기 위해 설계되었습니다. 더 나은 데이터 수집 능력과 SQL 쿼리 지원을 제공합니다.
- Android Profiler: Android Studio 내에 통합된 도구로, 다양한 성능 지표를 시각적으로 표현합니다.
일반적인 개발 환경에서는 간단한 성능 문제를 해결하려면 Android Profiler가 적합하고, 복잡한 문제나 시스템 레벨 이슈에는 Perfetto가 유용합니다.
- Perfetto 트레이스 수집 방법
Perfetto의 기본적인 트레이스 수집은 명령줄을 통해 이루어집니다.
adb shell perfetto -o /data/misc/perfetto-traces/trace_file.perfetto-trace -t <duration> <data_sources>
예시: 20초 동안의 트레이스를 수집하여 저장하는 명령어입니다.
adb shell perfetto -o /data/misc/perfetto-traces/trace_file.perfetto-trace -t 20s sched freq idle am wm gfx view binder_driver hal dalvik camera input res memory
adb pull /data/misc/perfetto-traces/trace_file.perfetto-trace
모든 데이터를 수집하려면 -a 옵션을 사용하면 됩니다.
adb shell perfetto -o /data/misc/perfetto-traces/trace.perfetto-trace -t 10s -a "com.example.app"
보다 세부적인 제어를 원한다면 .pbtx 형식의 설정 파일을 사용할 수 있습니다.
# 설정 파일 예시 (trace_config.pbtx)
duration_ms = 30000
buffers = {
size_kb = 65536,
fill_policy = "DISCARD"
}
data_sources = [
{
name = "linux.ftrace",
ftrace_events = ["sched/sched_switch", "power/suspend_resume"],
atrace_categories = ["gfx", "view"],
atrace_apps = ["com.example.app"]
},
{
name = "linux.process_stats",
process_stats_config = {
scan_all_processes_on_start = True
}
}
]
설정 파일을 적용하려면 다음과 같이 실행합니다.
adb push trace_config.pbtx /data/misc/perfetto-configs/trace_config.pbtx
adb shell perfetto -c /data/misc/perfetto-configs/trace_config.pbtx -o /data/misc/perfetto-traces/trace.pftrace
편리함을 위해 Perfetto 팀에서 제공하는 스크립트도 있습니다.
curl -O https://raw.githubusercontent.com/google/perfetto/master/tools/record_android_trace
chmod u+x record_android_trace
./record_android_trace -o trace_file.perfetto-trace -t 10s -b 32mb sched gfx wm
- Perfetto를 활용한 트레이스 분석
Perfetto는 FrameTimeline이라는 기능을 제공하여 특정 애플리케이션의 프레임 상태를 한눈에 파악할 수 있게 합니다. 주요 색상 코드는 다음과 같습니다:
| 색상 | 상태 | 설명 |
|---|---|---|
| 초록색 | 정상 프레임 | 문제 없는 상태 |
| 연두색 | 고지연 상태 | 입력 지연이 발생 |
| 빨간색 | 카드 프레임 | 현재 앱에서 발생한 지연 |
| 노란색 | 외부 지연 | SurfaceFlinger 등의 외부 요소에서 발생한 지연 |
| 파란색 | 프레임 드랍 | 더 새로운 프레임으로 교체되어 표시되지 않은 프레임 |
또한, 메인 스레드와 렌더링 스레드의 작업 흐름도 확인할 수 있습니다.