ART 구성

이 페이지에서는 Android 런타임(ART) 및 그 컴파일 옵션을 구성하는 방법을 설명합니다. 여기서 다루는 주제에는 시스템 이미지의 사전 컴파일 구성, dex2oat 컴파일 옵션, 시스템 파티션 공간과 데이터 파티션 공간, 성능 사이에서 균형을 유지하는 방법이 포함됩니다.

ART를 사용하려면 ART 및 DalvikDalvik 실행 파일 형식을 참고하세요. 앱이 제대로 작동하는지 확인하려면 Android 런타임(ART)에서 앱 동작 확인을 참고하세요.

ART 작동 방식

ART는 AOT(ahead-of-time) 컴파일을 사용하며 Android 7부터는 AOT 컴파일, JIT(just-in-time) 컴파일, 해석을 조합하여 사용하고 AOT 컴파일은 프로필 기반일 수 있습니다. 이러한 모든 실행 모드의 조합은 구성 가능하며 이 섹션에서 설명합니다. 예를 들어 Pixel 기기는 다음 흐름에서 작동하도록 구성됩니다.

  1. 애플리케이션은 처음에 클라우드 프로필이 포함된 Play 스토어에서 배포한 dex 메타데이터(.dm) 파일로 설치됩니다. ART는 클라우드 프로필에 나열된 메서드를 AOT 컴파일합니다. 또는 애플리케이션이 dex 메타데이터 파일 없이 설치된 경우 AOT 컴파일이 실행되지 않습니다.
  2. 애플리케이션이 처음 몇 번 실행될 때 AOT 컴파일되지 않은 메서드가 해석됩니다. 해석된 메서드 중 자주 실행되는 메서드는 JIT 컴파일됩니다. ART는 실행에 기반해 로컬 프로필을 생성하고 클라우드 프로필(있는 경우)과 결합합니다.
  3. 기기가 유휴 상태이고 충전 중이면 컴파일 데몬이 실행되어 처음 몇 번의 실행에서 생성된 결합된 프로필을 바탕으로 애플리케이션을 다시 컴파일합니다.
  4. 애플리케이션의 후속 실행에서 ART는 컴파일 데몬에서 생성된 아티팩트를 사용하며 여기에는 AOT 컴파일되지 않은 메서드가 여전히 해석되거나 JIT 컴파일되는 동안 생성된 아티팩트에 비해 더 많은 AOT 컴파일 코드가 포함되어 있습니다. ART는 실행에 기반하여 프로필 설치를 업데이트하고 프로필은 컴파일 데몬의 후속 실행에서 선택됩니다.

ART는 컴파일러(dex2oat 도구)와 부팅하는 동안 로드되는 런타임(libart.so)으로 구성됩니다. dex2oat 도구는 APK 파일을 사용하고 런타임 시 로드되는 컴파일 아티팩트 파일을 하나 이상 생성합니다. 파일 수와 확장자, 이름은 출시에 따라 다를 수 있지만 Android 8 출시에서는 다음과 같은 파일이 생성됩니다.

  • .vdex: 확인 속도를 높이기 위한 추가 메타데이터가 포함되어 있으며 APK의 압축되지 않은 DEX 코드가 포함될 때도 있습니다.
  • .odex: APK의 메서드에 사용되는 AOT 컴파일된 코드가 들어 있습니다.
  • .art (optional): APK에 나열된 일부 문자열과 클래스의 ART 내부 표현이 포함되어 있습니다. 이러한 항목은 앱 시작 속도를 높이는 데 사용됩니다.

컴파일 옵션

ART 컴파일 옵션에는 두 가지 카테고리가 있습니다.

  1. 시스템 ROM 구성: 시스템 이미지를 빌드할 때 AOT 컴파일되는 코드를 나타냅니다.
  2. 런타임 구성: ART가 기기에서 앱을 컴파일하고 실행하는 방법을 나타냅니다.

컴파일러 필터

이 두 카테고리를 구성하는 한 가지 핵심 ART 옵션은 컴파일러 필터입니다. 컴파일러 필터는 dex2oat 도구에 전달되는 옵션으로, ART가 DEX 코드를 컴파일하는 방법을 제어합니다. Android 8부터 다음의 네 가지 필터가 공식 지원됩니다.

  • verify: DEX 코드 확인만 실행합니다(AOT 컴파일은 아님).
  • quicken: (Android 11까지) DEX 코드 확인을 실행하고 인터프리터 성능 향상을 위해 일부 DEX 명령을 최적화합니다.
  • speed: DEX 코드 확인을 실행하고 모든 메서드를 AOT 컴파일합니다.
  • speed-profile: DEX 코드 확인을 실행하고 프로필 파일에 나열된 메서드를 AOT 컴파일합니다.

시스템 ROM 구성

사전 설치된 라이브러리와 앱은 시스템 이미지가 빌드될 때 AOT 컴파일됩니다. 이러한 프로세스를 dexpreopt라고 합니다. 이러한 컴파일된 파일은 모든 종속 항목, 특히 부팅 클래스 경로가 변경되지 않는 한 사용할 수 있습니다.

참고: 기기에서 시스템 모듈 업데이트를 사용하면 부팅 클래스 경로가 다음 업데이트에서 변경될 가능성이 매우 높으며 이는 모든 dexpreopt 파일을 오래되고 사용할 수 없도록 합니다.

dexpreopt 구성에는 다양한 ART 빌드 옵션을 사용할 수 있습니다. 이러한 옵션을 구성하는 방법은 시스템 이미지에 사용 가능한 저장공간과 사전 설치된 애플리케이션 수에 따라 다릅니다. 시스템 ROM으로 컴파일되는 JAR/APK는 다음과 같은 네 가지 카테고리로 나눌 수 있습니다.

  • 부트 클래스 경로 코드: 기본적으로 speed-profile 컴파일러 필터로 컴파일됩니다.
  • 시스템 서버 코드(이 문서의 후반부에 나오는 PRODUCT_SYSTEM_SERVER_JARS, PRODUCT_APEX_SYSTEM_SERVER_JARS, PRODUCT_STANDALONE_SYSTEM_SERVER_JARS, PRODUCT_APEX_STANDALONE_SYSTEM_SERVER_JARS 참고):
    • (Android 14 이상) 기본적으로 speed-profile 컴파일러 필터로 컴파일되거나 프로필이 제공되지 않으면 speed 컴파일러 필터로 컴파일됩니다.
    • (Android 13 이하) 기본적으로 speed 컴파일러 필터로 컴파일됩니다.
    PRODUCT_SYSTEM_SERVER_COMPILER_FILTER를 통해 구성할 수 있습니다(이 문서의 후반부 참고).
  • 제품별 핵심 앱(이 문서의 후반부에 나오는 PRODUCT_DEXPREOPT_SPEED_APPS 참고): 기본적으로 speed 컴파일러 필터로 컴파일됩니다.
  • 기타 모든 앱: 기본적으로 speed-profile 컴파일러 필터로 컴파일되거나 프로필이 제공되지 않으면 verify 컴파일러 필터로 컴파일됩니다.

    PRODUCT_DEX_PREOPT_DEFAULT_COMPILER_FILTER를 통해 구성할 수 있습니다(이 문서의 후반부 참고).

Makefile 옵션

  • WITH_DEXPREOPT
  • 시스템 이미지에 설치된 DEX 코드에서 dex2oat를 호출할지 여부입니다. 기본적으로 사용 설정되어 있습니다.

  • DONT_DEXPREOPT_PREBUILTS(Android 5 이상)
  • DONT_DEXPREOPT_PREBUILTS를 사용 설정하면 사전 빌드가 dexpreopt되지 않습니다. Android.mkinclude $(BUILD_PREBUILT)가 지정된 앱이 이에 해당합니다. Google Play를 통해 업데이트될 가능성이 있는 사전 빌드된 앱의 dexpreopt를 건너뛰면 시스템 이미지의 공간이 절약되지만 첫 부팅 시간이 늘어납니다. 이 옵션은 Android.bp에 정의된 사전 빌드된 앱에는 영향을 미치지 않습니다.

  • PRODUCT_DEX_PREOPT_DEFAULT_COMPILER_FILTER(Android 9 이상)
  • PRODUCT_DEX_PREOPT_DEFAULT_COMPILER_FILTER는 dexpreopt된 애플리케이션의 기본 컴파일러 필터를 지정합니다. 이러한 앱은 Android.bp에 정의되어 있거나 Android.mkinclude $(BUILD_PREBUILT)가 지정되어 있습니다. 지정되지 않은 경우 기본값은 speed-profile이거나 기본값이 지정되지 않고 프로필이 제공되지 않으면 verify입니다.

  • WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY(Android 8 MR1부터)
  • WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY를 사용 설정하면 부트 클래스 경로와 시스템 서버 jar만 dexpreopt됩니다.

  • LOCAL_DEX_PREOPT
  • 모듈 정의에서 LOCAL_DEX_PREOPT 옵션을 지정하여 dexpreopt를 앱별로 사용 설정하거나 중지할 수도 있습니다. 이는 Google Play 업데이트를 즉시 받을 수 있는 앱의 dexpreopt를 사용 중지할 때 유용합니다. Google Play 업데이트에 따라 시스템 이미지의 dexpreopt된 코드가 더 이상 사용되지 않기 때문입니다. 또한 이 기능은 사용자가 데이터 파티션에 최신 버전의 앱을 이미 설치했을 수 있기 때문에 주요 버전 업그레이드 OTA의 공간을 절약하는 데에도 도움이 됩니다.

    LOCAL_DEX_PREOPT는 dexpreopt를 사용 설정 또는 중지하도록 true 또는 false 값을 각각 지원합니다. 또한 dexpreopt를 통해 APK 또는 JAR 파일에서 classes.dex 파일이 삭제되어서는 안 되는 경우 nostripping을 지정할 수 있습니다. 일반적으로 이 파일은 dexpreopt 후에 더 이상 필요하지 않기 때문에 삭제되지만, 이 마지막 옵션은 서드 파티 APK 서명을 유효한 상태로 유지하는 데 필요합니다.

  • PRODUCT_DEX_PREOPT_BOOT_FLAGS
  • 부팅 이미지가 컴파일되는 방식을 제어하는 옵션을 dex2oat에 전달합니다. 맞춤설정된 이미지 클래스 목록과 컴파일된 클래스 목록, 컴파일러 필터를 지정하는 데에도 사용할 수 있습니다.

  • PRODUCT_DEX_PREOPT_DEFAULT_FLAGS
  • 부팅 이미지 외의 모든 항목을 컴파일하는 방법을 제어하는 옵션을 dex2oat에 전달합니다.

  • PRODUCT_DEX_PREOPT_MODULE_CONFIGS
  • 특정 모듈 및 제품 구성을 위한 dex2oat 옵션을 전달하는 기능을 제공합니다. 이 옵션은 $(call add-product-dex-preopt-module-config,<modules>,<option>)에 의해 제품의 device.mk 파일에 설정됩니다. 여기서 <modules>는 각각 JAR 파일과 APK 파일의 LOCAL_MODULE 이름 및 LOCAL_PACKAGE 이름 목록입니다.

  • PRODUCT_DEXPREOPT_SPEED_APPS(Android 8부터)
  • 제품의 핵심으로 확인된 앱 목록으로, speed 컴파일러 필터로 컴파일하는 것이 적합합니다. 예를 들어 SystemUI와 같은 영구 앱은 다음번 재부팅 시에만 프로필 기반 컴파일을 사용할 수 있으므로, 제품에서 이러한 앱은 항상 AOT로 컴파일하는 것이 좋습니다.

  • PRODUCT_SYSTEM_SERVER_APPS(Android 8부터)
  • 시스템 서버에 의해 로드되는 앱 목록. 이러한 앱은 기본적으로 speed 컴파일러 필터로 컴파일됩니다.

  • PRODUCT_ART_TARGET_INCLUDE_DEBUG_BUILD(Android 8부터)
  • 기기에 ART의 디버그 버전을 포함할지 여부. 기본적으로 이 디버그 버전은 userdebug 빌드와 eng 빌드에 사용됩니다. 이 동작은 옵션을 true 또는 false로 명시적으로 설정하여 재정의할 수 있습니다.

    기본적으로 기기는 디버그 이외의 버전(libart.so)을 사용합니다. 전환하려면 시스템 속성 persist.sys.dalvik.vm.lib.2libartd.so로 설정합니다.

  • WITH_DEXPREOPT_PIC(Android 7까지)
  • Android 5.1.0~Android 6.0.1에서는 PIC(위치 비종속 코드)를 사용하도록 WITH_DEXPREOPT_PIC를 지정할 수 있습니다. 이렇게 지정하면 이미지에서 컴파일된 코드를 /system에서 /data/dalvik-cache로 재배치할 필요가 없으므로 데이터 파티션 공간을 절약할 수 있습니다. 그러나 위치 종속 코드를 활용하는 최적화가 사용되지 않기 때문에 런타임에 약간의 영향이 있습니다. 일반적으로 /data의 공간을 절약하고자 하는 기기는 PIC 컴파일을 사용 설정해야 합니다.

    Android 7.0에서는 PIC 컴파일이 기본적으로 사용 설정되었습니다.

  • WITH_DEXPREOPT_BOOT_IMG_ONLY(Android 7 MR1까지)
  • 이 옵션은 시스템 서버 JAR도 사전 선택하는 WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY로 대체되었습니다.

  • PRODUCT_SYSTEM_SERVER_COMPILER_FILTER
  • 이 옵션은 시스템 서버의 컴파일러 필터를 지정합니다.

    • (Android 14 이상) 지정하지 않으면 speed-profile 컴파일러 필터가 사용되거나 프로필이 제공되지 않으면 speed 컴파일러 필터가 사용됩니다.
    • (Android 13 이하) 지정하지 않으면 speed 컴파일러 필터가 사용됩니다.
    • speed로 설정하면 speed 컴파일러 필터가 사용됩니다.
    • speed-profile로 설정하면 speed-profile 컴파일러 필터가 사용되거나 프로필이 제공되지 않으면 verify 컴파일러 필터가 사용됩니다.
    • verify로 설정하면 verify 컴파일러 필터가 사용됩니다.

  • PRODUCT_SYSTEM_SERVER_JARS, PRODUCT_APEX_SYSTEM_SERVER_JARS, PRODUCT_STANDALONE_SYSTEM_SERVER_JARS, PRODUCT_APEX_STANDALONE_SYSTEM_SERVER_JARS
  • 다음은 시스템 서버에 의해 로드되는 JAR 목록입니다. JAR은 PRODUCT_SYSTEM_SERVER_COMPILER_FILTER로 지정된 컴파일러 필터로 컴파일됩니다.

    • (필수) PRODUCT_SYSTEM_SERVER_JARS: 플랫폼의 시스템 서버 클래스 경로 JAR 목록입니다(SYSTEMSERVERCLASSPATH의 일부). 이 목록에 시스템 서버 클래스 경로 JAR를 추가해야 합니다. 시스템 서버 클래스 경로 JAR를 목록에 추가하지 않으면 이러한 JAR가 로드되지 않습니다.
    • (필수) PRODUCT_APEX_SYSTEM_SERVER_JARS: APEX를 통해 전달된 시스템 서버 클래스 경로 JAR의 목록입니다(SYSTEMSERVERCLASSPATH의 일부). 형식은 <apex name>:<jar name>입니다. 이 목록에 APEX 시스템 서버 클래스 경로 JAR를 추가해야 합니다. 이 목록에 APEX 시스템 서버 클래스 경로 JAR를 추가하지 않으면 이러한 JAR가 로드되지 않습니다.
    • (선택사항. Android 13 이하) PRODUCT_STANDALONE_SYSTEM_SERVER_JARS: 시스템 서버가 별도의 클래스 로더를 사용하여(SystemServiceManager.startServiceFromJar를 통해) 동적으로 로드하는 JAR 목록입니다. 이 목록에 독립형 시스템 서버 JAR를 추가하는 것이 필수사항은 아니지만 적극 권장됩니다. 추가하면 JAR가 컴파일되므로 런타임 성능이 향상되기 때문입니다.
    • (필수. Android 13부터) PRODUCT_APEX_STANDALONE_SYSTEM_SERVER_JARS: APEX를 통해 전달된 JAR 목록으로, 시스템 서버가 별도의 클래스 로더를 사용하여 동적으로 로드합니다(즉, SystemServiceManager.startServiceFromJar를 통해 또는 <apex-system-service>로 선언). 형식은 <apex name>:<jar name>입니다. 이 목록에 독립형 APEX 시스템 서버 JAR를 추가해야 합니다. 이 목록에 독립형 APEX 시스템 서버 JAR를 추가하지 않으면 부팅 실패가 발생합니다.

    부트 클래스 경로 구성

    미리 로드된 클래스 목록은 시작 시 Zygote가 초기화하는 클래스 목록입니다. 이 목록을 통해 각 앱이 클래스 초기화 프로그램을 별도로 실행하지 않아도 되므로, 앱을 더 빠르게 시작하고 메모리에서 페이지를 공유할 수 있습니다. 미리 로드된 클래스 목록 파일은 기본적으로 frameworks/base/config/preloaded-classes에 있으며 일반적인 스마트폰 사용에 맞게 조정된 목록을 포함하고 있습니다. 웨어러블 기기와 같은 다른 기기에서는 이 목록이 다를 수 있으므로 기기에 맞게 조정해야 합니다. 이 목록을 조정할 때는 주의가 필요합니다. 클래스를 너무 많이 추가하면 사용되지 않는 클래스가 로드될 때 메모리가 낭비됩니다. 또한, 클래스를 너무 적게 추가해도 각 앱이 자체 사본을 보유해야 하므로 마찬가지로 메모리가 낭비됩니다.

    사용 예(제품의 device.mk에서):

    PRODUCT_COPY_FILES += <filename>:system/etc/preloaded-classes
    

    참고: build/target/product/base.mk에서 기본값을 가져오는 제품 구성 makefile을 상속받기 전에 이 줄을 배치해야 합니다.

    런타임 구성

    JIT 옵션

    다음 옵션은 ART JIT 컴파일러를 사용할 수 있는 Android 출시에만 해당합니다.

    • dalvik.vm.usejit: JIT의 사용 설정 여부입니다.
    • dalvik.vm.jitinitialsize(기본값 64K): 코드 캐시의 초기 용량입니다. 코드 캐시는 규칙적으로 GC되고 필요한 경우 증가됩니다.
    • dalvik.vm.jitmaxsize(기본값 64M): 코드 캐시의 최대 용량입니다.
    • dalvik.vm.jitthreshold(기본값 10000): 메서드가 JIT 컴파일되기 위해 메서드의 'hotness' 카운터가 통과해야 하는 기준점입니다. 'hotness' 카운터는 런타임 내부의 측정항목입니다. 여기에는 호출 수, 이전 브랜치 및 기타 요소가 포함됩니다.
    • dalvik.vm.usejitprofiles(Android 13까지): JIT 프로필의 사용 설정 여부입니다. dalvik.vm.usejit가 false인 경우에도 사용할 수 있습니다. false인 경우 컴파일러 필터 speed-profile은 메서드를 AOT 컴파일하지 않으며 verify와 같습니다. Android 14부터 JIT 프로필이 항상 사용 설정되며 사용 중지할 수 없습니다.
    • dalvik.vm.jitprithreadweight(기본값 dalvik.vm.jitthreshold/20): 애플리케이션 UI 스레드와 관련된 JIT '샘플'의 가중치입니다(jitthreshold 참고). 앱과 상호작용할 때 사용자 환경에 직접적으로 영향을 주는 메서드를 빠르게 컴파일할 때 사용합니다.
    • dalvik.vm.jittransitionweight(기본값 dalvik.vm.jitthreshold/10): 컴파일 코드와 인터프리터 간에 전환하는 메서드 호출의 가중치입니다. 이 옵션은 전환(비용이 많이 소요됨)을 최소화하도록 관련 메서드를 컴파일하는 데 도움이 됩니다.

    Dex2oat 옵션

    이러한 옵션은 기기 내 컴파일(일명 dexopt)에 영향을 미치며 일부 옵션은 dexpreopt에도 영향을 미칩니다. 하지만 위 시스템 ROM 구성 섹션에서 설명한 옵션은 dexpreopt에만 영향을 미칩니다.

    리소스 사용량을 제어하는 옵션은 다음과 같습니다.

    • dalvik.vm.image-dex2oat-threads/dalvik.vm.image-dex2oat-cpu-set(Android 11까지): 부팅 이미지에 사용할 스레드 수와 CPU 코어(아래 참고) 세트입니다.
    • dalvik.vm.boot-dex2oat-threads/dalvik.vm.boot-dex2oat-cpu-set:
      • (Android 11까지) 부팅 이미지를 제외한 모든 항목의 부팅 시간에 사용할 스레드 수와 CPU 코어 세트(아래 참고)입니다.
      • (Android 12부터) 부팅 이미지를 포함한 모든 항목의 부팅 시간에 사용할 스레드 수와 CPU 코어 세트(아래 참고)입니다.
        • 특히 Android 14부터 이는 ART 서비스의 우선순위 클래스 PRIORITY_BOOT에 상응합니다.
    • dalvik.vm.restore-dex2oat-threads/dalvik.vm.restore-dex2oat-cpu-set:
      • (Android 11부터, Android 13까지) 클라우드 백업에서 복원하는 데 사용할 스레드 수와 CPU 코어 세트(아래 참고)입니다.
      • (Android 14부터) 클라우드 백업에서의 복원을 비롯하여 일반적으로 지연 시간에 더 민감한 모든 항목에 사용할 스레드 수와 CPU 코어 세트(아래 참고)입니다.
        • 특히 이는 ART 서비스의 우선순위 클래스 PRIORITY_INTERACTIVE_FAST에 상응합니다.
    • dalvik.vm.background-dex2oat-threads/ dalvik.vm.background-dex2oat-cpu-set (Android 14부터): 백그라운드에서 사용할 스레드 수와 CPU 코어 세트(아래 참고)입니다.
      • 특히 이는 ART 서비스의 우선순위 클래스 PRIORITY_BACKGROUND에 상응합니다.
    • dalvik.vm.dex2oat-threads/dalvik.vm.dex2oat-cpu-set: 다른 모든 항목에 사용할 스레드 수와 CPU 코어 세트입니다.

    CPU 코어 세트는 쉼표로 구분된 CPU ID 목록으로 지정되어야 합니다. 예를 들어 CPU 코어 0-3의 dex2oat에서 실행하려면 다음과 같이 설정하세요.

    dalvik.vm.dex2oat-cpu-set=0,1,2,3
    

    CPU 선호도 속성을 설정할 때에는 불필요한 메모리 및 I/O 경합을 방지하기 위해 선택된 CPU 수와 같도록 dex2oat 스레드 수에 상응하는 속성을 일치시키는 것이 좋습니다.

    dalvik.vm.dex2oat-cpu-set=0,1,2,3
    dalvik.vm.dex2oat-threads=4
    

    위의 시스템 속성 외에도 작업 프로필을 사용하여 dex2oat의 리소스 사용량을 제어할 수 있습니다(Cgroup 추상화 계층 참고).

    지원되는 작업 프로필은 다음과 같습니다.

    • Dex2OatBackground(Android 14부터)(기본적으로 Dex2OatBootComplete를 상속받음): 백그라운드에서 사용할 리소스를 제어합니다.
      • 특히 이는 ART 서비스의 우선순위 클래스 PRIORITY_BACKGROUND에 상응합니다.
    • Dex2OatBootComplete:
      • (Android 13까지) 부팅 후 모든 항목에 사용할 리소스를 제어합니다.
      • (Android 14부터) 부팅 후 그리고 백그라운드에 있지 않은 모든 항목에 사용할 리소스를 제어합니다.
        • 특히 이는 ART 서비스의 우선순위 클래스 PRIORITY_INTERACTIVE_FASTPRIORITY_INTERACTIVE에 상응합니다.

    시스템 속성과 작업 프로필을 모두 지정하면 둘 다 적용됩니다.

    힙 크기를 제어하는 옵션은 다음과 같습니다.

    • dalvik.vm.image-dex2oat-Xms: 부팅 이미지의 초기 힙 크기입니다.
    • dalvik.vm.image-dex2oat-Xmx: 부팅 이미지의 최대 힙 크기입니다.
    • dalvik.vm.dex2oat-Xms: 그 외 모든 항목의 초기 힙 크기입니다.
    • dalvik.vm.dex2oat-Xmx: 그 외 모든 항목의 최대 힙 크기입니다.

    dex2oat의 초기 힙 크기와 최대 힙 크기를 제어하는 옵션은 컴파일 가능한 애플리케이션을 제한할 수 있으므로 줄여서는 안 됩니다.

    컴파일러 필터를 제어하는 옵션은 다음과 같습니다.

    • dalvik.vm.image-dex2oat-filter(Android 11까지): 부팅 이미지의 컴파일러 필터입니다. Android 12부터 부팅 이미지의 컴파일러 필터는 항상 speed-profile이며 변경될 수 없습니다.
    • dalvik.vm.systemservercompilerfilter(Android 13부터): 시스템 서버의 컴파일러 필터입니다. PRODUCT_SYSTEM_SERVER_COMPILER_FILTER를 참고하세요.
    • dalvik.vm.systemuicompilerfilter(Android 13부터): 시스템 UI 패키지의 컴파일러 필터입니다.
    • dalvik.vm.dex2oat-filter(Android 6까지): 그 외 모든 항목의 컴파일러 필터입니다.
    • pm.dexopt.<reason>(Android 7부터): 그 외 모든 항목의 컴파일러 필터입니다. Android 14 이상의 경우 ART 서비스 구성을 참고하고 Android 13 이하의 경우 패키지 관리자 구성을 참고하세요.

    부팅 이미지를 제외한 모든 항목의 컴파일을 제어하는 다른 옵션은 다음과 같습니다.

    • dalvik.vm.dex2oat-very-large(Android 7.1부터): AOT 컴파일을 사용 중지하기 위한 총 dex 파일 크기 최솟값(바이트 단위)입니다.
    • dalvik.vm.dex2oat-swap(Android 7.1부터)(기본값: true): dex2oat용 스왑 파일을 사용할 수 있습니다. 이를 통해 메모리 부족 비정상 종료를 방지할 수 있습니다. 이 옵션을 사용 설정해도 dex2oat는 dex 파일 수가 많을 때 등 특정 조건에서만 스왑 파일을 사용하며 이 조건은 변경될 수 있습니다.
    • dalvik.vm.ps-min-first-save-ms(Android 12부터): 애플리케이션이 처음 실행될 때 런타임이 애플리케이션의 프로필을 생성하기 전에 기다리는 최소 시간입니다.
    • dalvik.vm.ps-min-save-period-ms(Android 12부터): 애플리케이션 프로필을 업데이트하기 전에 기다리는 최소 시간입니다.
    • dalvik.vm.dex2oat64.enabled(Android 11부터)(기본값: false): 64비트 버전의 dex2oat를 사용할지 여부입니다.
    • dalvik.vm.bgdexopt.new-classes-percent(Android 12부터)(기본값: 20): 재컴파일을 트리거하기 위한 프로필의 새 클래스 최소 비율(0~100)입니다. 일반적으로 백그라운드 dexopt 동안 프로필 기반 컴파일(speed-profile)에만 적용됩니다. 비율 기준점 외에도 최소 50개라는 새 클래스 기준점이 있으며 이는 구성할 수 없습니다.
    • dalvik.vm.bgdexopt.new-methods-percent(Android 12부터)(기본값: 20): 재컴파일을 트리거하기 위한 프로필의 새 메서드 최소 비율(0~100)입니다. 일반적으로 백그라운드 dexopt 동안 프로필 기반 컴파일(speed-profile)에만 적용됩니다. 비율 기준점 외에도 최소 100개라는 새 메서드 기준점이 있으며 이는 구성할 수 없습니다.
    • dalvik.vm.dex2oat-max-image-block-size(Android 10부터)(기본값: 524288): 압축된 이미지의 최대 솔리드 블록 크기입니다. 어떤 블록도 최대 크기보다 크지 않도록 큰 이미지는 일련의 솔리드 블록으로 분할됩니다.
    • dalvik.vm.dex2oat-resolve-startup-strings(Android 10부터)(기본값: true): true이면 dex2oat가 프로필에서 '시작'으로 표시된 메서드에서 참조되는 모든 const-strings를 확인합니다.
    • debug.generate-debug-info(기본값: false): 스택 해제 정보, ELF 기호, dwarf 섹션 등 네이티브 디버깅을 위해 디버그 정보를 생성할지 여부입니다.
    • dalvik.vm.dex2oat-minidebuginfo(Android 9부터)(기본값: true): backtrace를 출력하는 데 필요한 최소한의 LZMA-압축 디버그 정보를 생성할지 여부입니다.

    ART 서비스 옵션

    Android 14부터 앱의 기기 내 AOT 컴파일(일명 dexopt)이 ART 서비스에서 처리됩니다. ART 서비스 구성에 관한 자세한 내용은 ART 서비스 구성을 참고하세요.

    패키지 관리자 옵션

    Android 14 전에는 앱의 기기 내 AOT 컴파일(일명 dexopt)이 패키지 관리자에서 처리되었습니다. dexopt 관련 패키지 관리자 구성에 관한 자세한 내용은 패키지 관리자 구성을 참고하세요.

    A/B별 구성

    ROM 구성

    Android 7.0부터 기기는 두 개의 시스템 파티션을 사용하여 A/B 시스템 업데이트를 사용 설정할 수 있습니다. 시스템 파티션 크기를 절약하려면 사전 선택된 파일을 사용되지 않은 두 번째 시스템 파티션에 설치하면 됩니다. 그러면 그러한 파일은 처음 부팅 시 데이터 파티션에 복사됩니다.

    사용 예(device-common.mk에서):

    PRODUCT_PACKAGES += \
         cppreopts.sh
    PRODUCT_PROPERTY_OVERRIDES += \
         ro.cp_system_other_odex=1
    

    기기의 BoardConfig.mk에서:

    BOARD_USES_SYSTEM_OTHER_ODEX := true
    

    부트 클래스 경로 코드, 시스템 서버 코드, 제품별 핵심 앱은 항상 시스템 파티션에 컴파일됩니다. 기본적으로 다른 모든 앱은 사용되지 않은 두 번째 시스템 파티션에 컴파일됩니다. 이는 SYSTEM_OTHER_ODEX_FILTER를 사용하여 제어할 수 있으며 이 필터의 기본값은 다음과 같습니다.

    SYSTEM_OTHER_ODEX_FILTER ?= app/% priv-app/%
    

    백그라운드 OTA dexopt

    A/B 지원 기기에서 애플리케이션은 새 시스템 이미지로 재부팅하기 전에 백그라운드에서 컴파일할 수 있습니다. 시스템 이미지에 컴파일 스크립트와 바이너리를 선택적으로 포함하려면 백그라운드에서 앱 컴파일을 참고하세요. 이 컴파일에 사용되는 컴파일 필터는 다음을 통해 제어됩니다.

    pm.dexopt.ab-ota=speed-profile
    

    프로필 기반 컴파일을 활용하고 저장용량을 절약하려면 speed-profile을 사용하는 것이 좋습니다.

    JDWP 옵션

    userdebug 빌드의 Java 디버그 유선 프로토콜(JDWP) 스레드 생성은 persist.debug.dalvik.vm.jdwp.enabled 시스템 속성을 통해 제어됩니다. 기본적으로 이 속성은 설정되어 있지 않으며 JDWP 스레드는 디버그 가능 앱에서만 생성됩니다. 디버그 가능 앱과 디버그 불가능 앱에서 모두 JDWP 스레드를 사용 설정하려면 persist.debug.dalvik.vm.jdwp.enabled1로 설정하세요. 속성 변경사항이 적용되려면 기기를 재부팅해야 합니다.

    userdebug 빌드에서 디버그 불가능 앱을 디버그하려면 다음 명령어를 실행하여 JDWP를 사용 설정하세요.

      adb shell setprop persist.debug.dalvik.vm.jdwp.enabled 1
      adb reboot
      
    Android 13 이하를 실행하는 기기의 경우 런타임에 userdebug 빌드에서 디버그 가능 앱과 디버그 불가능 앱의 JDWP 스레드가 생성됩니다. 즉, userdebug 빌드에서 디버거를 연결하거나 앱을 프로파일링할 수 있습니다.