일반적인 성능 문제 해결

원활하고 안정적이며 배터리 효율적인 앱 환경을 제공하려면 안정성, UI 렌더링, 메모리 소비, 백그라운드 작업, 시작 지연 시간, 빌드 최적화 전반에서 일반적인 성능 병목 현상을 파악하고 해결해야 합니다.

이 섹션의 가이드에서는 각 문제 유형의 기본 Android 플랫폼 동작을 설명하고 Android 스튜디오 프로파일러, Perfetto, Logcat, ApplicationExitInfo와 같은 도구를 사용하여 문제를 진단, 프로파일링, 해결하는 방법을 안내합니다.

안정성

  • ANR: 차단된 UI 스레드, 기본 스레드 I/O, 잠금 경합 또는 느린 브로드캐스트 리시버로 인해 발생하는 애플리케이션 응답 없음 (ANR) 오류를 진단하고 수정합니다.
  • 비정상 종료: 스택 트레이스를 읽고, Logcat 출력을 검사하고, 처리되지 않은 예외와 네이티브 신호를 방지합니다.

렌더링 및 시작

  • 느린 렌더링: 비용이 많이 드는 레이아웃, 바인드 패스 또는 기본 스레드 정지로 인해 삭제되거나 정지된 UI 프레임 (>16ms>700ms)을 식별하고 수정합니다.
  • 느린 세션 (게임만 해당): SurfaceFlinger로 프레임 속도를 측정하고 Android 프레임 페이싱 (Swappy), Vulkan, Android 동적 성능 프레임워크 (ADPF)를 사용하여 게임 프레임 속도를 최적화합니다.
  • 앱 시작 시간: 콜드, 웜, 핫 실행 내부를 이해하고, 처음 표시하는 데 걸린 시간 (TTID)과 완전히 표시하는 데 걸린 시간 (TTFD)을 측정하고, 시작 작업을 최적화합니다.

메모리 관리

  • 로우 메모리 킬러 (LMK): Android 로우 메모리 킬러 데몬 (lmkd)이 oom_adj_score를 통해 프로세스에 우선순위를 부여하고 Android 스튜디오, Unity, Unreal Engine에서 메모리 사용량을 프로파일링하는 방법을 알아봅니다.
  • 메모리 사용량 (익명 RSS + 스왑): 포그라운드, 서비스, 백그라운드 상태에서 앱의 익명 상주 집합 크기 (RSS) 및 스왑 메모리 공간을 측정하고 줄입니다.
  • 비트맵 메모리 사용량: 크기가 너무 크거나 누수된 비트맵 할당을 진단하고 UI 구성요소가 백그라운드로 이동할 때 그래픽 버퍼를 해제합니다.

배터리 및 백그라운드 작업

  • 과도한 wake lock: 부분적인 wake lock을 장기간 유지하지 말고 백그라운드 작업을 WorkManager 또는 JobScheduler로 이전하세요.
  • 부분적인 장기간 wake lock: 획득한 모든 부분적인 장기간 wake lock이 모든 실행 및 오류 경로에서 적절하게 해제되는지 확인합니다.
  • 과도한 절전 모드 해제: 정확한 알람 절전 모드 해제를 줄이고 예약된 백그라운드 작업을 일괄 처리하거나 지연합니다.
  • 불필요한 백그라운드 Wi-Fi 검색: 백그라운드 Wi-Fi 검색 빈도를 최소화하고 수동 또는 일괄 위치 및 연결 API를 사용합니다.
  • 불필요한 백그라운드 네트워크 사용: WorkManager 제약 조건을 사용하여 백그라운드 모바일 네트워크 전송을 일괄 처리하고 지연시킵니다.
  • 과도한 배터리 사용: CPU, 센서, 무선 활동을 프로파일링하여 모바일 및 Wear OS 기기에서 높은 배터리 소모를 진단합니다.

권한 및 빌드 최적화

  • 권한 거부: 상황에 맞게 런타임 권한을 요청하고 사용자에게 권한 근거를 명확하게 설명합니다.
  • DEX 코드 최적화: R8 축소, 난독화, 최적화 규칙을 구성하여 DEX 크기를 줄이고 런타임 성능을 개선합니다.