면접 질문실전 질문꼬리 질문

ActivityManager와 시스템 서비스 상호작용

skydovesJaewoong Eum (skydoves)||8분 소요

ActivityManager와 시스템 서비스 상호작용

ActivityManager는 안드로이드의 시스템 서비스(system service)로, 기기에서 실행 중인 액티비티, 태스크, 프로세스 및 메모리 상태에 대한 정보를 제공합니다. 시스템 수준의 리소스 사용량을 조회하고 애플리케이션 프로세스를 프로그래밍 방식으로 관리하기 위한 핵심 API 역할을 합니다. ActivityManager의 동작 원리를 이해하면 안드로이드가 여러 애플리케이션에 걸쳐 리소스를 어떻게 관리하는지, 그리고 LeakCanary와 같은 도구가 메모리 진단을 위해 시스템 서비스를 어떻게 활용하는지 파악할 수 있습니다. 이번 면접 질문을 통하여 아래 내용들을 학습하실 수 있습니다.

  • 시스템 서비스 API를 통해 ActivityManager를 가져와 활용하는 방법
  • MemoryInfo를 통해 확인할 수 있는 메모리 정보와 실무 활용법
  • 최신 안드로이드에서 제한되거나 지원 종료(deprecated)된 ActivityManager 메서드
  • 메모리 누수(memory leak) 탐지 도구에서 ActivityManager를 활용하는 방식
  • ActivityManager, 프로세스 관리, 저메모리(low memory) 상태 사이의 관계

ActivityManager 획득 및 메모리 조회

ActivityManagerContext.getSystemService()를 통해 획득하며, 안드로이드 프레임워크가 관리하는 시스템 수준 서비스에 대한 참조를 반환받습니다. 가장 흔하게 사용되는 기능은 MemoryInfo 구조체를 통한 기기 메모리 상태 조회입니다.

val activityManager = context.getSystemService(
    Context.ACTIVITY_SERVICE
) as ActivityManager

val memoryInfo = ActivityManager.MemoryInfo()
activityManager.getMemoryInfo(memoryInfo)

val availableMB = memoryInfo.availMem / (1024 * 1024)
val totalMB = memoryInfo.totalMem / (1024 * 1024)
val isLow = memoryInfo.lowMemory
val thresholdMB = memoryInfo.threshold / (1024 * 1024)

MemoryInfo 객체에는 네 가지 핵심 필드가 포함되어 있습니다. availMem은 사용 가능한 시스템 메모리를 바이트 단위로 보고하며, totalMem은 전체 물리 메모리를 나타냅니다. lowMemory는 사용 가능한 메모리가 threshold 값 아래로 떨어지면 true가 되는 불리언 플래그입니다. 여기서 threshold란 시스템이 백그라운드 프로세스를 적극적으로 종료하기 시작하는 기준값을 의미합니다. 애플리케이션은 이 정보를 활용하여 기기에 메모리 부담이 가해질 때 캐시 전략을 조정하거나 중요하지 않은 리소스를 해제할 수 있습니다. 실무에서는 이미지 캐시 크기를 동적으로 줄이거나 프리페칭(prefetching)을 비활성화하는 데 자주 활용됩니다.

프로세스 정보와 저사양 기기 감지

ActivityManager는 실행 중인 프로세스를 조회하고 기기 메모리 특성을 파악하는 메서드도 제공합니다. getRunningAppProcesses() 메서드는 호출자에게 보이는 모든 프로세스를 RunningAppProcessInfo 객체 리스트로 반환합니다.

val processes = activityManager.runningAppProcesses
processes?.forEach { process ->
    Log.d("Process", "${process.processName}: " +
        "importance=${process.importance}")
}

// 저사양(Low RAM) 기기 여부 확인
val isLowRam = activityManager.isLowRamDevice
// 앱당 힙 메모리 제한 (단위: MB)
val memoryClass = activityManager.memoryClass
// largeHeap 설정 시 힙 메모리 제한 (단위: MB)
val largeMemoryClass = activityManager.largeMemoryClass

importance 필드는 시스템이 해당 프로세스에 부여한 우선순위를 나타냅니다. IMPORTANCE_FOREGROUND는 사용자에게 현재 보이는 프로세스를 의미하고, 숫자가 높을수록 우선순위가 낮아져 IMPORTANCE_CACHED에 이르면 언제든 종료될 수 있는 프로세스가 됩니다. isLowRamDevice() 메서드는 메모리가 제한된 기기(보통 1GB 이하)에서 true를 반환하므로, 메모리 집약적인 기능을 비활성화하는 판단 기준으로 사용할 수 있습니다. memoryClass 프로퍼티는 앱당 힙 제한을 MB 단위로 보고하며, largeMemoryClass는 매니페스트에 android:largeHeap="true"를 설정했을 때의 제한값을 보고합니다.

이 면접 질문은 구독자 전용입니다

Dove Letter를 구독하시면 안드로이드, 코틀린 개발 관련 독점 면접 질문의 전체 내용을 볼 수 있습니다.

구독하기