제품 소식

더 넓은 메모리 한도를 위해 앱 준비하기

읽는 데 2분 소요
블레어 하몬의 프로필 보기
Blair Harmon Android 플랫폼 제품 관리 이사

훌륭한 사용자 환경은 Android의 핵심 사명이며, 이 약속을 지키려면 기기를 빠르고 반응성이 높으며 안정적으로 유지해야 합니다. 따라서 메모리 최적화가 그 어느 때보다 중요합니다.  생태계 전반에서 메모리 가격 인상에 따라 물리적 메모리 용량을 유지하거나 심지어 줄이는 새로운 기기가 등장하고 있지만 사용자는 동일한 원활하고 고성능 앱 환경을 기대합니다.

Android 17에서는 앱별 메모리 제한을 도입하여 메모리를 과도하게 사용하고 시스템 전체의 속도 저하를 유발하는 애플리케이션으로부터 전반적인 사용자 환경을 보호합니다. Pixel 기기부터 시작됩니다. 내년에 4GB~16GB 이상의 기기 RAM 구성 포트폴리오에서 Android 앱별 메모리 제한을 활용하는 제조업체가 늘어날 것입니다. 앱이 이러한 한도를 초과하면 속도가 느려지고 종료될 수 있습니다. OS 제한을 방지하고 원활한 사용자 환경을 유지하려면 앱의 메모리 사용 공간을 최적화해야 합니다.  

이 게시물에서는 이러한 제한사항의 작동 방식, 새로운 Android vitals 측정항목을 사용하여 메모리 사용량을 측정하는 방법, 앱 또는 게임을 최적화하기 위한 실행 가능한 단계를 살펴봅니다.

메모리 한도 이해하기 

앱이 메모리 예산을 초과하면 Android는 기기 응답성을 보호하기 위해 점진적인 조치를 취합니다.

  1. zRAM 스왑: 앱이 할당된 한도에 도달하면 시스템에서 앱 페이지를 zRAM (압축된 RAM)으로 강제 이동합니다.  zRAM은 즉각적인 제거를 방지하지만 페이지를 압축하고 압축 해제하면 CPU 오버헤드가 추가되어 눈에 띄는 UI 버벅거림과 환경 속도 저하가 발생할 수 있습니다.
  2. 프로세스 종료: 앱이 zRAM 임계값을 초과하여 메모리 사용량을 계속 늘리면 시스템에 의해 종료됩니다.  앱 세션이 필드에서 이러한 제약 조건의 영향을 받았는지 확인하려면 ApplicationExitInfo 내에서 getDescription()를 호출하면 됩니다.  시스템에서 제한을 적용한 경우 종료 이유는 REASON_OTHER로 보고되고 설명 문자열에는 'MemoryLimiter:AnonSwap'이 포함됩니다.  TRIGGER_TYPE_ANOMALY를 사용하여 트리거 기반 프로파일링을 활용하여 메모리 한도에 도달할 때 힙 덤프를 자동으로 캡처할 수도 있습니다.  

앱별 메모리 한도 및 시스템 적용에 대해 자세히 알아보려면 Android 17 앱 메모리 한도 문서를 참고하세요. 다양한 기기 구성에서 애플리케이션을 테스트하려면 메모리 제한기 adb 명령어를 사용하세요. 

메모리 문제 모니터링 및 진단

측정할 수 없는 것은 최적화할 수 없습니다. Android 생태계 전반에서 메모리 누수, 과도한 힙 할당, 메모리 부족 (OOM) 비정상 종료를 식별하려면 다음과 같은 보완적인 모니터링 도구를 활용해야 합니다.

  • Android vitals를 통한 거시적 수준의 상태: 추가 오버헤드 없이 광범위한 인구 수준의 가시성을 확보하려면 Google Play Console의 Android vitals에서 메모리 사용량 (익명 RSS + 스왑) 및 비트맵 메모리 사용량과 같은 필수 측정항목을 제공합니다. 이를 통해 다양한 프로세스 상태 (포그라운드, 백그라운드, 사용자 인식 서비스, 캐시)와 RAM 클래스 범위에 걸친 메모리 분포를 명확하게 파악하여 메모리 이상치를 발견할 수 있습니다.
  • Firebase Crashlytics를 사용한 메모리 제한기 종료 및 OOM 추적: 주요 측정항목에 영향을 미치기 전에 심각한 메모리 저하에 관한 정보를 계속 받으려면 Crashlytics 버전 20.1.0에서 메모리 부족 예외 및 메모리 제한기 종료를 포착, 우선순위 지정, 수정하는 데 도움이 되는 추가 디버그 데이터를 도입합니다. 이러한 이벤트를 맞춤 로그 및 키-값 메타데이터와 함께 추적하면 메모리 오류가 발생할 때 프로세스 상태를 즉시 파악할 수 있습니다.
  • ProfilingManager를 사용한 현장 트레이스: 성능 관측 가능성 프레임워크를 유지할 수 있는 팀의 경우 Android 15 (API 수준 35)에 도입된 ProfilingManager API를 사용하면 앱이 프로덕션 기기에서 직접 Java 힙 덤프 및 힙 프로필과 같은 세부 메모리 디버그 아티팩트를 프로그래매틱 방식으로 요청하고 수집할 수 있습니다. TRIGGER_TYPE_OOM, TRIGGER_TYPE_ANOMALY과 같은 특정 시스템 신호를 기반으로 힙 덤프 캡처를 트리거할 수도 있습니다. 

다른 메모리 모니터링 기법에 관해 자세히 알아보려면 문서를 참고하세요.

요약 및 다음 단계

Android에서 모든 RAM 클래스에 걸쳐 앱별 메모리 제한을 확대함에 따라 지금이 메모리 사용량을 감사할 때입니다.

  1. 메모리 최적화 우선순위 지정: 권장사항을 사용하여 앱 메모리 제한의 영향을 받지 않도록 합니다. 
  2. 메모리 사용량 모니터링앱의 메모리 동작을 모니터링하여 비정상적인 동작을 감지하고 해결합니다.  
  3. 게임 최적화: 게임에 관한 최신 안내와 복잡한 멀티미디어 앱을 따라 프로세스 상태 전반에서 메모리 절약을 극대화합니다.

유용한 리소스 및 참고 자료

작성자:
계속 읽기