1. JankStatsSample을 열고 앱을 실행합니다.
2. Android Studio 하단의 Profiler 탭을 엽니다.
3. Profiler의 왼쪽 창에 있는 + 아이콘을 클릭하여 새 프로파일링 세션을 시작한 다음, 프로파일러를 실행할 대상이 되는 기기 이름과 앱 프로세스를 선택합니다.
참고: 디버그 가능한 앱을 프로파일링할 수도 있지만, 그러면 부작용으로 상당한 성능 비용이 더해지므로 프로파일링 가능한 앱을 프로파일링하는 것이 좋습니다. 자세한 내용은 프로파일링 가능한 앱에 대한 개발자 문서를 참조하세요.
4. CPU 행을 클릭합니다.
5. System Trace Recording을 선택하고 Record를 클릭합니다.
6. 앱과 상호 작용하여 데이터를 수집한 다음 Stop 버튼을 클릭합니다.
그러면 Android Studio에서 버벅거리는 프레임이 보이는 Display 섹션을 표시합니다.
또는 All Frames 체크박스를 선택하면 추적 기록에 버벅거리지 않는 프레임도 표시할지 여부를 지정할 수 있습니다.
각 프레임으로 마우스를 가져가거나 프레임을 클릭하면 자세한 프레임 정보를 볼 수 있습니다. All Frames 체크박스를 선택하면 세 가지 유형의 프레임이 보입니다.
Lifecycle 체크박스를 선택하면 네 개의 추가 트랙을 표시/숨기기로 전환할 수 있습니다.
네 개의 추가 트랙은 다음과 같습니다.
- Application
- Wait for GPU
- Composition
- Frames on display
위 트랙은 Android Studio Bumblebee부터 제공되었습니다. 개발자 문서에서 각 트랙에 대한 자세한 설명을 볼 수 있습니다.
버벅거리는 프레임 검사
이제 앱에서 버벅거리는 프레임이 발생하는 원인을 진단하는 방법을 살펴보겠습니다.
Janky frames 트랙에서 버벅거리는 프레임을 선택하면, 해당 수명 주기 데이터가 Display 섹션에 강조 표시되고 해당 스레드 데이터가 Threads 섹션에 강조 표시됩니다.
파선 Deadline은 기한을 나타냅니다. 프레임의 지속 시간이 기한을 초과하면 프레임이 버벅거리는 것으로 간주됩니다.
Android Studio의 오른쪽 창에서도 자세한 분석 결과를 볼 수 있습니다.
2. 앱의 메인 스레드에서 해당 추적 부분을 보면 `View#draw`에서 많은 시간이 소요되는 것을 알 수 있습니다.
또한 상세 분석 창에서 메인 스레드 상태를 보면 많은 스레드 상태가 절전 모드임을 알 수 있습니다.
3. View#draw가 호출되는 코드를 살펴보겠습니다.
View#onDraw가 JankyView 클래스에서 재정의된 것을 알 수 있습니다.
onDraw에서 호출되는 simulateJank 메서드는 다음과 같이 정의됩니다.
그러면 Thread.sleep이 simulateJank 메서드 내부에서 호출되는 것을 찾을 수 있습니다. JankStatsSample 앱이 의도적으로 버벅거림을 시뮬레이션하도록 만들어졌으므로 그 점이 명백할 수도 있지만, 중요한 것은 개요부터 더 자세한 분석까지 살펴봄으로써 실제 버벅거림이 발생한 코드를 찾아낼 수 있다는 점입니다.
참고: 이 예제에서는 Thread.sleep 호출에 문제가 있는 것이 분명하지만, 실제로 앱 코드를 최적화할 때는 더 어려운 결정을 내려야 합니다. Microbenchmark 라이브러리를 살펴보면 개발자가 변경하는 내용이 원하는 효과를 거둘지 쉽게 판단할 수 있습니다.
참고: 시스템 추적은 플랫폼 코드와 앱에 포함된 라이브러리로 캡처한 다양한 섹션을 보여줍니다. 시스템 추적 정보가 충분하지 않을 경우, 맞춤 추적을 추가하는 한 방법으로서 trace(“MySection”) { /* this will be in the trace */ }를 AndroidX Tracing 라이브러리에서 사용할 수 있습니다.
예를 들어, 이 예제의 trace(“Jank Simulation”) { … }은 해당 스레드의 추적 섹션에 표시됩니다.
추적 읽기 및 맞춤 추적 추가에 대한 자세한 내용은 시스템 추적 개요를 참조하시기 바랍니다.
4. onDraw에서 simulateJank 메서드를 호출하지 않도록 코드를 변경한 다음, 버벅거리는 프레임이 여전히 관찰되는지 확인해 보겠습니다.
이번에는 시스템 추적 기록을 다시 실행할 때 앱과 상호 작용한 후 버벅거리는 프레임이 보이지 않을 것입니다!
저장된 추적 로드
그 외에도 아래 단계를 따라 추적을 저장했다가 나중에 로드할 수도 있습니다. 저장 후 로드 기능을 이용하면 서로 다른 버전의 추적을 비교하고 다른 사람들과 공유할 수 있습니다.
참고: 또한 Macrobenchmark 라이브러리를 사용하여 시스템 추적 결과를 얻을 수도 있습니다.
라이브 상호 작용에서 추적을 기록하는 것과 똑같이 1단계부터 6단계까지 진행합니다.
저장 아이콘을 클릭하여 기록을 내보냅니다.
3. 그 이후 + -> Load from file…로 이동하여 저장된 시스템 추적 기록을 로드하고 이전 단계에서 내보낸 저장된 파일을 선택합니다.
4. 분석할 프로세스를 선택합니다. 프로세스 목록 드롭다운이 표시된 후 프로세스 이름 일부를 입력하면 해당 프로세스를 빠르게 찾을 수 있습니다.
그런 다음 저장된 추적을 로드하면, 라이브 상호 작용에서의 기록과 똑같이 버벅거리는 프레임을 볼 수 있습니다.
요약
이렇게만 하면 됩니다! Android Studio Chipmunk부터는 앱의 버벅거림을 찾는 데 도움이 되는 더욱 정밀한 프로파일링 데이터를 볼 수 있습니다.
CPU 프로파일러의 사용에 대해 자세히 알아보려면 문서를 참조하시고 Android Studio에서 `Help -> Submit Feedback`으로 이동하여 도구 개선에 도움을 주시기 바랍니다.
또한 버벅거리는 프레임 방지를 포함해 광범위한 성능 주제에 대해서는 Google I/O의 'What's new in app performance'(앱 성능의 새로운 내용) 세션에서도 확인하실 수 있습니다.
사용자 기기에서 실행 중인 프로덕션 앱에서 발생하는 버벅거림을 감지하고 보고할 수 있는 새 라이브러리를 확인하려면 JankStats에 대한 문서를 살펴보세요!