Android 런타임 및 Dalvik

Android 런타임(ART)은 Android의 앱 및 일부 시스템 서비스에서 사용하는 관리형 런타임입니다. ART와 그 전의 Dalvik은 원래 Android 프로젝트용으로 특별히 제작된 것입니다. ART는 런타임으로서 Dalvik Executable(DEX) 형식 및 DEX 바이트 코드 사양을 실행합니다.

ART와 Dalvik은 DEX 바이트 코드를 실행하는 호환 가능한 런타임이므로, Dalvik용으로 개발된 앱은 ART로 실행 시에도 작동해야 합니다. 그러나 Dalvik에서 작동하는 기술 중 일부는 ART에서 작동하지 않습니다. 가장 중요한 문제에 관한 자세한 내용은 Android 런타임(ART)에서 앱 동작 확인을 참고하세요.

ART 기능

다음은 ART에서 구현된 몇 가지 주요 기능입니다.

AOT(Ahead-of-time) 컴파일

ART는 앱 성능을 개선할 수 있는 AOT 컴파일을 도입했습니다. ART는 설치 시간 확인도 Dalvik보다 엄격합니다.

설치 시 ART는 기기의 dex2oat 도구를 사용하여 앱을 컴파일합니다. 이 유틸리티는 DEX 파일을 입력으로 받아서 대상 기기에서 실행할 수 있는 컴파일된 앱을 생성합니다. 유틸리티는 모든 유효한 DEX 파일을 어려움 없이 컴파일할 수 있어야 합니다. 그러나 일부 후처리 도구는 Dalvik에서 허용되지만 ART에서는 컴파일할 수 없는 무효한 파일을 생성합니다. 자세한 내용은 가비지 컬렉션 문제 해결을 참고하세요.

가비지 컬렉션 개선

가비지 컬렉션(GC)은 리소스 집약적이므로 앱 성능을 저하시켜 화면 끊김, UI 응답성 부족 등의 문제를 유발할 수 있습니다. ART에서는 다음과 같은 여러 가지 방법으로 가비지 컬렉션을 개선합니다.

  • 단일 GC 일시중지가 있는 동시 실행 설계
  • 백그라운드 메모리 사용량 및 조각화를 줄이기 위한 동시 복사
  • 힙 크기와 무관한 GC 일시중지 길이
  • 최근 할당된 단기 객체를 정리하는 특별한 경우 총 GC 시간이 짧아지는 컬렉터
  • 동시 가비지 컬렉션이 더욱 적절한 때에 실행되기 때문에 일반적인 사용 사례에서 GC_FOR_ALLOC 이벤트가 거의 발생하지 않도록 하는 개선된 가비지 컬렉션 에르고노믹스

개발 및 디버깅 개선

ART에서는 앱 개발 및 디버깅을 개선하기 위해 다양한 기능을 제공합니다.

샘플링 프로파일러 지원

지금까지 개발자는 앱 실행 트레이싱을 위한 Traceview 도구를 프로파일러로 사용했습니다. Traceview는 유용한 정보를 제공하지만 Dalvik상의 결과가 메서드 호출당 오버헤드에 의해 왜곡되며 Traceview를 사용하면 런타임 성능에 큰 영향을 미칩니다.

ART에는 이러한 제한사항이 없는 전용 샘플링 프로파일러에 관한 지원이 추가되었습니다. 이렇게 하면 속도를 크게 떨어뜨리지 않으면서 앱 실행을 더욱 정확하게 확인할 수 있습니다. 샘플링 지원은 KitKat 버전의 Dalvik용 Traceview에 추가되었습니다.

디버깅 기능 추가 지원

ART는 특히 모니터 및 가비지 컬렉션 관련 기능에서 새로운 디버깅 옵션을 다수 지원합니다. 예를 들어 개발자는 다음을 할 수 있습니다.

  • 스택 트레이스에 어떤 잠금이 있는지 확인한 다음 잠금이 있는 스레드로 이동합니다.
  • 특정 클래스에 라이브 인스턴스가 얼마나 있는지 묻고 인스턴스 확인을 요청한 뒤 객체를 유지하는 참조를 확인합니다.
  • 특정 인스턴스와 관련하여 중단점 등의 이벤트를 필터링합니다.
  • 'method-exit' 이벤트를 사용하여 종료 시 메서드가 반환한 값을 확인합니다.
  • 특정 필드가 액세스 또는 수정될 때 프로그램 실행을 정지하도록 필드 watchpoint를 설정합니다.

예외 및 비정상 종료 보고서의 진단 세부정보 개선

ART는 런타임 예외가 발생할 때 최대한 많은 컨텍스트와 세부정보를 제공합니다. ART는 java.lang.ClassCastException, java.lang.ClassNotFoundException, java.lang.NullPointerException과 관련하여 확장된 예외 세부정보를 제공합니다. Dalvik의 이후 버전에서는 java.lang.ArrayIndexOutOfBoundsExceptionjava.lang.ArrayStoreException과 관련하여 확장된 예외 세부정보가 제공되었으며 현재는 배열의 크기와 범위를 벗어난 오프셋이 포함됩니다. ART도 이와 같은 정보를 제공합니다.

예를 들어 java.lang.NullPointerException은 이제 앱에서 작성하려고 했던 필드 또는 앱에서 호출하려고 했던 메서드 등 앱이 null 포인터로 실행하려고 했던 작업에 관한 정보를 표시합니다. 다음은 몇 가지 일반적인 예입니다.

java.lang.NullPointerException: Attempt to write to field 'int
android.accessibilityservice.AccessibilityServiceInfo.flags' on a null object
reference
java.lang.NullPointerException: Attempt to invoke virtual method
'java.lang.String java.lang.Object.toString()' on a null object reference

또한 ART는 앱 네이티브 비정상 종료 보고서에 Java 및 네이티브 스택 정보를 모두 포함시키기 때문에 더 풍부한 컨텍스트 정보를 제공합니다.

문제 신고

앱 JNI 문제 이외의 원인으로 문제가 발생한 경우 Android 오픈소스 프로젝트 Issue Tracker를 통해 신고해 주세요. 가능한 경우 adb bugreport와 Google Play 스토어의 앱으로 연결되는 링크를 포함해 주세요. 또는 가능한 경우 문제를 재현하는 APK를 첨부해 주세요.