Android Profiler는 Android Studio에 내장된 도구 모음으로, 앱 성능을 실시간으로 모니터링합니다. 타사 라이브러리 없이 CPU 부하, 메모리 사용량, 네트워크 트래픽 및 에너지 소비를 추적할 수 있습니다. Android Developers에 따르면, 프로파일러는 IDE에 직접 통합되어 있으며 연결된 기기의 모든 프로세스에 대해 밀리초 단위의 정확도로 메트릭을 제공합니다.
주요 포인트
Android Profiler는 기존 Android Monitor와 DDMS를 대체한 Android Studio의 구성 요소입니다. 앱의 모든 측면을 프로파일링하기 위한 통합 인터페이스를 제공합니다: CPU Profiler(프로세서 분석), Memory Profiler(메모리 작업), Network Profiler(네트워크 요청), Energy Profiler(에너지 소비). Android Studio를 통해 앱을 실행하면 데이터가 자동으로 수집됩니다.
프로파일러는 에뮬레이터와 USB로 연결된 물리적 기기 모두에서 작동합니다. Google I/O 2023에 따르면, Android Profiler는 Android 프로젝트의 70% 이상에서 사용되며 성능 진단의 표준 도구로 간주됩니다. 타사 솔루션에 비해 주요 장점은 제로 통합입니다: build.gradle에 종속성을 추가하거나 앱 코드를 수정할 필요가 없습니다.
Android Profiler의 아키텍처는 Perfetto에 기반합니다 — 커널과 앱 수준에서 데이터를 수집하는 Android 시스템 트레이서입니다. Perfetto는 최소 오버헤드(CPU 1% 미만)를 보장하고 최대 30분까지 장기 기록을 지원합니다. 이를 통해 빠른 작업뿐만 아니라 긴 시나리오도 프로파일링할 수 있습니다 — 화면 전환, 백그라운드 동기화, 1시간 사용 동안의 메모리 소비.
프로파일러는 네 가지 데이터 유형을 수집합니다: CPU — 각 코어 및 스레드의 부하, Memory — Java Heap, Native Heap, Stack, Graphics, Network — 모든 수신 및 발신 요청, Energy — 에너지 소비 카테고리(Idle, Light, Medium, Heavy). 데이터는 타임라인에 동기화되어 CPU 변화가 Memory와 에너지 소비에 어떤 영향을 미치는지 동시에 확인할 수 있습니다.
CPU Profiler는 타임라인에 실시간으로 프로세서 부하를 표시하며, 앱의 스레드별로 나뉩니다. 각 스레드는 색상이 있는 선 또는 영역으로 표시됩니다 — 영역이 넓을수록 스레드가 더 많은 프로세서 시간을 차지합니다. 빨간색 영역은 앱 작업, 파란색은 시스템 호출, 회색은 대기를 의미합니다.
상세 분석을 위해 CPU Profiler는 세 가지 기록 모드를 지원합니다: Trace Java Methods(모든 Java 메소드 추적), Trace C/C++ Functions(NDK 네이티브 함수 추적), Sample Java Methods(샘플링, 권장 모드). 샘플링은 가장 낮은 오버헤드를 제공하며 일상적인 프로파일링에 적합하고, 전체 추적은 복잡한 문제 찾기에 사용됩니다.
// 예: CPU Profiler 분석이 이 메소드를 병목으로 표시합니다
class DataProcessor {
suspend fun processLargeDataset(items: List<Item>): List<Result> {
// CPU Profiler가 inBackgroundThread에서 높은 CPU 부하를 표시합니다
return withContext(Dispatchers.Default) {
items.map { it.computeHeavyTransformation() }
}
}
}
// 프로파일링 후 권장사항:
// computeHeavyTransformation이 80% 시간을 차지합니다 — 결과를 캐시합니다
class DataProcessorOptimized {
private val cache = LruCache<String, Result>(100)
suspend fun processLargeDataset(items: List<Item>): List<Result> {
return withContext(Dispatchers.Default) {
items.mapNotNull { cache.get(it.id) ?: it.computeHeavyTransformation().also { cache.put(it.id, it) } }
}
}
}
기록 후 CPU Profiler는 Top-Down Tree를 표시합니다 — 각 메소드의 실행 시간이 포함된 호출 트리입니다. Self Time/Total 열에 주목하세요: 메소드의 Self Time이 16ms를 초과하고 UI 스레드에서 호출되면 확실한 프레임 드롭입니다. 해결책은 Dispatchers.IO 또는 Default를 통해 무거운 계산을 백그라운드 스레드로 이동하는 것입니다.
Sample Java Methods — 3-5% 오버헤드의 일상 프로파일링에 권장되는 모드. Trace Java Methods — 각 호출의 완전 추적, 최대 15% 오버헤드, 짧은 기록(5-10초)에 사용. Trace C/C++ Functions — Linux Perf를 통한 NDK 코드 추적, 게임 및 C++ 라이브러리 분석에 필수. 문제 유형에 따라 모드를 전환하세요.
Memory Profiler는 앱의 모든 메모리 카테고리를 추적합니다: Java Heap(JVM 객체), Native Heap(JNI를 통한 C/C++ 할당), Stack(스레드 스택), Graphics(텍스처, GPU 버퍼). 주요 시각화는 메모리 소비의 시간 그래프로, 각 카테고리가 고유의 색상으로 표시됩니다. 그래프가 가비지 컬렉션 후에 더 이상 줄어들지 않으면 누수를 의심하세요.
누수를 찾으려면 Capture Heap Dump 기능을 사용하세요. 덤프 순간, Android Profiler는 앱을 ~100ms 동안 중지하고 HPROF 파일을 생성합니다 — Java Heap의 모든 활성 객체에 대한 완전한 스냅샷입니다. 덤프를 연 후 Retained Size(객체 제거 시 해제될 메모리 양)로 객체를 정렬하고 파괴되었어야 할 Activity, Fragment 또는 Bitmap 인스턴스를 찾을 수 있습니다.
Google I/O 2022에 따르면, Memory Profiler와 LeakCanary의 조합은 Android에서 메모리 누수 감지 시나리오의 95%를 커버합니다. LeakCanary는 자동으로 작동하며 백그라운드에서 누수를 감지합니다. Memory Profiler는 수동 분석에 필요합니다: 누수뿐만 아니라 할당의 전체 그림을 확인할 수 있습니다.
| 메모리 카테고리 | 설명 | 일반적인 크기 |
|---|---|---|
| Java Heap | JVM 힙: Kotlin/Java 객체 | 5-200 MB |
| Native Heap | JNI, NDK를 통한 할당 | 1-100 MB |
| Graphics | 텍스처, GPU 버퍼 | 10-200 MB |
| Stack | 모든 스레드의 스택 | 1-10 MB |
덤프를 캡처한 후 Retained Size로 객체를 정렬하세요 — 이것이 객체 제거 시 해제되는 메모리 양입니다. 메모리에 있으면 안 되는 큰 Retained Size를 가진 Activity, Fragment 및 Bitmap 인스턴스를 찾으세요. Reference Tree 탭으로 이동하여 객체를 유지하는 참조 체인을 확인하세요 — 대부분 싱글톤의 정적 필드 또는 정리되지 않은 콜백입니다. 중요한 메트릭은 Allocation rate(초당 할당 수)입니다. Allocation rate가 10,000 객체/초를 초과하면 앱이 임시 객체 생성 및 제거에 너무 많은 시간을 소비하여 GC에 부하가 걸리고 마이크로 프리즈가 발생합니다. 이 경우 View Inspector 도구를 사용하여 루프에서 자주 객체가 생성되는 위치를 찾으세요.
Network Profiler는 타임라인에 앱의 모든 네트워크 요청을 실시간으로 표시합니다. 각 요청은 가로 막대로 표시됩니다 — 길이는 실행 시간에 해당하고, 색상은 요청 유형(GET, POST, PUT, DELETE)에 해당합니다. 스케일을 스크롤하면 요청이 시간적으로 어떻게 분포되어 있는지, 중복되는지 확인할 수 있습니다.
모든 인기 라이브러리가 지원됩니다: OkHttp, Retrofit, Volley, Ktor. Ktor와 OkHttp의 경우 프로파일러는 인터셉터와 컨버터를 포함한 완전한 호출 스택을 표시합니다. 각 요청에 대해 Request Headers 및 Response Headers, 응답 본문(최대 1MB), 상태 코드 및 지속 시간을 확인할 수 있습니다.
Network Profiler가 식별하는 일반적인 문제: 캐시 부재(열 때마다 동일한 URL 요청), 중복 요청(두 컴포넌트가 동시에 동일한 데이터 로드), 과도한 응답 크기(서버가 50KB 필요할 때 5MB 전송). Network Profiler는 타임라인을 한눈에 보는 것만으로도 이러한 문제를 식별할 수 있습니다.
느린 네트워크를 시뮬레이션하려면 Android Studio에서 Network Conditioning을 사용하세요 — 대역폭을 3G/2G로 제한하고 지연을 추가할 수 있습니다. 이는 특히 인터넷이 불안정한 지역에서 작동하는 앱의 나쁜 네트워크 조건에서의 동작 테스트에 매우 중요합니다.
Energy Profiler는 Perfetto 데이터를 기반으로 배터리에 대한 앱의 영향을 평가합니다. 이 도구는 밀리암페어 단위의 실제 소비를 측정하지 않고 각 작업을 다섯 가지 에너지 소비 카테고리로 분류합니다: Idle, Light, Medium, High 및 Overloaded. Energy Profiler의 타임라인은 색상으로 강조됩니다: 녹색(가벼운 부하), 노란색(중간), 빨간색(높은 부하).
빨간 영역의 주요 원인: WakeLock(앱이 프로세서를 활성 상태로 유지), Location GPS(높은 정확도로 지속적인 위치 요청), Keep-Alive 연결(서버와의 빈번한 데이터 교환), 대규모 데이터 전송(파일 전송, 스트리밍). Energy Profiler는 어떤 작업이 언제 에너지 소비 피크를 유발했는지 정확히 보여줍니다.
Android Developers에 따르면, 일반적인 앱은 High 카테고리에서 5% 이하의 시간을 보내야 합니다. Energy Profiler가 프로파일링 시간의 10% 이상을 빨간 영역으로 표시하면 앱은 Battery Drain 기준의 검토를 통과하지 못합니다. 권장사항: 백그라운드 작업에 WorkManager 사용, Location 요청을 최소 필요 정확도로 제한, 네트워크 요청을 배치로 집계.
Android Profiler 실행은 한 번의 클릭으로 이루어집니다: Android Studio에서 View → Tool Windows → Profiler를 열거나 오른쪽 패널의 Profiler 아이콘을 더블 클릭하세요. 연결된 기기에서 앱을 실행하면 Android Studio가 자동으로 프로세스에 연결되어 데이터 수집을 시작합니다. 타임라인에 CPU, Memory, Network 및 Energy 그래프가 즉시 나타납니다.
상세 분석을 위해 원하는 탭(CPU, Memory, Network 또는 Energy)을 선택하고 기록을 시작하세요. CPU의 경우 Sample Java Methods 모드를 기록 시간 30초로 권장합니다 — 일반적인 시나리오에 충분합니다. Memory의 경우 시나리오 실행 후 힙 덤프(Capture Heap Dump)를 실행하세요. Network의 경우 기록이 자동으로 시작되며 시나리오 완료 후 Stop 버튼을 누르면 됩니다.
기록 중지 후 데이터를 내보내세요: File → Save As로 전체 세션을 .perf 파일에 저장합니다. 이는 최적화 전후 메트릭 비교에 편리합니다. 첫 번째 안정 버전에서 기준 세션을 만들고 각 새 세션과 비교하세요 — 이것이 성능 변화를 객관적으로 평가하는 유일한 방법입니다.
Android Profiler는 Android Studio CLI와 Firebase Test Lab을 통해 명령줄에서 실행할 수 있습니다. Firebase Test Lab은 UI 테스트의 일부로 성능 프로파일링을 지원합니다: 테스트 결과와 함께 CPU, Memory 및 Network 메트릭을 얻을 수 있습니다. 메트릭이 기준에서 10% 하락할 경우 CI 파이프라인이 개발자 확인까지 차단되도록 파이프라인을 설정하세요.
자주 묻는 질문
영향은 최소입니다. Android Profiler는 데이터 수집에 Perfetto를 사용하며, CPU 오버헤드가 1% 미만입니다. Sample Java Methods 모드에서 오버헤드는 약 3-5%로 시나리오 프로파일링에 문제되지 않습니다. 메소드의 완전 추적은 오버헤드가 최대 15%까지 될 수 있으므로 짧은 기록에만 사용됩니다.
네, 시스템 트레이스는 Perfetto CLI를 통해 기기에서 직접 기록할 수 있습니다: adb shell perfetto --out /data/local/tmp/trace.perf. 그런 다음 Perfetto UI(ui.perfetto.dev) 인터페이스에서 파일을 열거나 Android Studio에 임포트하여 앱의 전체 마크업과 함께 확인할 수 있습니다.
Android Profiler는 프록시 설정이 필요 없는 시스템 도구입니다. IDE에서 성능 컨텍스트에 요청을 직접 표시합니다. Charles Proxy는 외부 프록시 서버로 더 상세한 분석(트래픽 감시, 요청 수정, 재전송)을 제공합니다. 성능 프로파일링에는 Android Profiler를, API 계약 분석에는 Charles를 사용하세요.
시나리오 실행 전에 힙 덤프를 실행하세요(예: Activity 열기 전). 시나리오를 실행하세요 — Activity를 열고 닫으세요. 두 번째 덤프를 실행하세요. 활성 Activity 인스턴스 수를 비교하세요: 두 번째 덤프에서 더 많다면 누수입니다. Retained Size로 정렬하고, 추가 Activity를 찾아 Reference Tree를 통해 원인을 확인하세요.
Energy Profiler는 기기 수준의 Power Profiles 지원과 Android 8.0+이 필요합니다. 에뮬레이터와 일부 펌웨어(특히 중국 제)에서는 데이터가 없을 수 있습니다. 해결책은 순수 Android 펌웨어가 장착된 Pixel 또는 Samsung 기준 기기에서 에너지 소비를 프로파일링하는 것입니다.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.