부팅 이미지 프로필

Android 11 이상에서는 시스템 서버 및 부팅 클래스 경로와 같은 다양한 시스템 수준 구성요소의 코드 정보를 캡슐화하는 부팅 이미지 프로필 생성을 지원합니다. Android 런타임(ART)은 이 정보를 사용하여 시스템 전체 최적화를 실행하며 이 중 일부는 Android 성능에 중요하고 네이티브가 아닌 모든 코드(시스템 또는 앱 수준)를 실행하는 데 영향을 미칩니다. 경우에 따라 부팅 이미지 프로필은 두 자릿수 비율로 실행 성능 및 메모리 소비에 영향을 미칠 수 있습니다.

부팅 프로필 정보 가져오기

부팅 이미지 프로필은 중요한 사용자 여정(CUJ) 중에 실행되는 앱의 프로필에서 파생됩니다. 특정 기기 구성에서는 ART가 앱에서 사용하는 부팅 클래스 경로 메서드와 클래스를 JIT 프로필의 일부로 캡처하고 앱 프로필(예: /data/misc/profiles/cur/0/com.android.chrome/primary.prof)에 이 정보를 기록하는데, 여기서 부팅 클래스 경로 Dalvik EXecutable(DEX) 파일로 색인이 생성됩니다(ART 프로필 형식 참고).

CUJ 중에 기록된 앱 프로필을 검토하여 부팅 클래스 경로의 어떤 부분이 가장 많이 사용되고 최적화에 가장 중요한지 확인합니다(예는 ART 프로필 형식 참고). 메서드나 클래스를 모두 포함하면 성능에 부정적인 영향을 미치므로 가장 흔히 사용되는 코드 경로에 집중합니다. 예를 들어 부팅 클래스 경로의 어떤 메서드가 하나의 앱에서 사용된다면, 이 메서드는 부팅 프로필에 포함되면 안 됩니다. 각 기기는 CUJ 선택과 테스트에서 생성된 데이터양에 기반하여 메서드/클래스 선택을 구성해야 합니다.

기기의 모든 개별 앱 프로필에서 부팅 클래스 경로 정보를 집계하려면 adb shell cmd package snapshot-profile android 명령어를 실행합니다. 수동으로 개별 프로필을 집계하지 않고도(원하면 집계할 수도 있음) 집계된 정보를 처리 및 메서드/클래스 선택의 기초로 사용할 수 있습니다.

부팅 이미지 프로필

그림 1. 부팅 이미지 프로필을 가져오는 프로세스

부팅 이미지 프로필 데이터

부팅 이미지 프로필에는 다음 파일과 데이터가 포함됩니다.

  • 부팅 클래스 경로(frameworks/base/config/boot-image-profile.txt) 프로필. 부팅 클래스 경로에서 어떤 메서드가 최적화될지, 부팅 .art 이미지에 어떤 클래스가 포함될지, 상응하는 DEX 파일이 어떻게 배치될지 결정합니다.

  • 미리 로드된 클래스 목록. Zygote에 미리 로드된 클래스를 결정합니다.

  • 시스템 서버 구성요소 프로필(frameworks/base/services/art-profile). 시스템 서버에서 어떤 메서드가 최적화 및 컴파일될지, 부팅 .art 이미지에 어떤 클래스가 포함될지, 상응하는 DEX 파일이 어떻게 배치될지 결정합니다.

ART 프로필 형식

ART 프로필은 최적화할 가치가 있는 메서드와 시작 시 사용되는 클래스에 관한 정보를 비롯하여 로드된 각 DEX 파일의 정보를 캡처합니다. 부팅 이미지 프로파일링이 사용 설정되면 ART에서는 프로필에 부팅 클래스 경로와 시스템 서버 JAR 파일도 포함하고 각 DEX 파일에 파일을 사용하는 패키지 이름으로 주석을 답니다.

예를 들어 다음 명령어로 원시 부팅 이미지 프로필을 덤프합니다.

adb shell profman --dump-only --profile-file=/data/misc/profman/android.prof

이렇게 하면 다음과 같은 출력이 생성됩니다.

=== Dex files  ===
=== profile ===
ProfileInfo [012]

core-oj.jar:com.google.android.ext.services [index=0] [checksum=e4e3979a]
        hot methods: 520[], 611[] …
        startup methods: …
        classes: …
...
core-oj.jar:com.android.systemui [index=94] [checksum=e4e3979a]
        hot methods: 520[], 521[]…
        startup methods: …
        classes: …

위의 예에서

  • core-oj.jarcom.google.android.ext.servicescom.android.systemui에서 사용됩니다. 각 항목에는 core-oj.jar에서 사용되는 패키지 두 개가 나열됩니다.

  • 두 프로세스는 모두 DEX 색인 520이 있는 메서드를 사용하지만 systemui 프로세스만 DEX 색인 521이 있는 메서드를 사용합니다. 같은 근거가 다른 프로필 섹션(예: 시작 클래스)에도 적용됩니다.

데이터를 처리하는 동안 사용량을 바탕으로 메서드/클래스를 필터링하여 시스템 수준 프로세스(예: 시스템 서버 또는 systemui)나 흔히 사용되지 않을 수 있지만 여전히 중요한 메서드(예: 카메라 앱에서 사용되는 메서드)에 우선순위를 부여합니다.

프로필 형식은 내부적으로 각 메서드에 덤프 전용 형식에 표시되는 것보다 많은 여러 플래그(시작, 시작 후, 인기도, abi)로 주석을 답니다. 신호를 모두 사용하려면 사용 가능한 스크립트를 수정하세요.

권장사항

최상의 결과를 얻으려면 다음 가이드라인을 따르세요.

  • 부팅 이미지 프로필을 생성하는 구성을 여러 테스트 기기에 배포하고 최종 부팅 이미지 프로필을 생성하기 전에 결과를 집계합니다. profman 도구는 여러 부팅 이미지 프로필 집계 및 선택을 지원하지만 동일한 부팅 이미지 버전(동일한 부팅 클래스 경로)에서만 작동합니다.

  • 시스템 프로세스에서 사용하는 메서드/클래스에 선택 우선순위를 부여합니다. 이러한 메서드/클래스는 다른 앱에서 자주 사용되지 않지만 여전히 최적화에 중요한 코드를 사용할 수 있습니다.

  • 단일 기기 실행의 데이터 모양은 실제 CUJ를 실행하는 테스트 기기와 비교할 때 매우 다릅니다. 테스트 기기가 많지 않은 경우 부팅 이미지 프로필 최적화가 프로덕션에서 제대로 작동할 것이라고 확신할 수 있도록 동일한 기기를 사용하여 여러 CUJ를 실행하세요. 이 시나리오는 아래에 설명되어 있습니다.

기기 구성

시스템 속성을 통해 부팅 프로필 구성을 사용 설정하려면 다음 메서드 중 하나를 사용하세요.

  • 옵션 1: 속성을 수동으로 설정합니다(재부팅까지).

    adb root
    adb shell stop
    adb shell setprop dalvik.vm.profilebootclasspath true
    adb shell setprop dalvik.vm.profilesystemserver true
    adb shell start
    
  • 옵션 2: local.prop을 사용합니다(파일이 삭제될 때까지 영구 적용). 방법은 다음과 같습니다.

    1. 다음 콘텐츠가 포함된 local.prop 파일을 만듭니다.

      dalvik.vm.profilebootclasspath=true
      dalvik.vm.profilesystemserver=true
      
    2. 다음 명령어를 실행합니다.

      adb push local.prop /data/
      adb shell chmod 0750 /data/local.prop
      adb reboot
      
  • 옵션 3: 기기 구성을 사용하여 다음 서버 측 속성을 설정합니다.

    persist.device_config.runtime_native_boot.profilesystemserver
    persist.device_config.runtime_native_boot.profilebootclasspath`
    

부팅 이미지 프로필 생성

다음 안내에 따라 단일 기기에서 테스트를 사용하여 기본 부팅 이미지 프로필을 생성하세요.

  1. 기기를 설정합니다.

    1. 기기 구성에 설명된 대로 기기를 구성합니다.

    2. (선택사항) 새 프로필 형식이 다른 프로필을 삭제하고 대체하는 데는 시간이 걸립니다. 프로필 수집 속도를 높이려면 기기의 모든 프로필을 재설정하세요.

      adb shell stop
      adb shell find "/data/misc/profiles -name *.prof -exec truncate -s 0 {} \;"
      adb shell start
      
    3. 기기에서 CUJ를 실행합니다.

  2. 다음 명령어를 사용하여 프로필을 캡처합니다.

    adb shell cmd package snapshot-profile android
    
  3. 다음 명령어를 사용하여 프로필을 추출합니다.

    adb pull /data/misc/profman/android.prof
    
  4. 다음 명령어를 사용하여 부팅 클래스 경로 JAR 파일로 이동합니다.

    m dist
    ls $ANDROID_PRODUCT_OUT/boot.zip
    
  5. 다음 profman 명령어를 사용하여 부팅 이미지 프로필을 생성합니다.

    profman --generate-boot-image-profile --profile-file=android.prof --out-profile-path=... --out-preloaded-classes-path=...
    
  6. 데이터를 사용하여 사용 가능한 선택 기준점 플래그를 사용하는 profman 명령어를 조정합니다.

    • --method-threshold
    • --class-threshold
    • --clean-class-threshold
    • --preloaded-class-threshold
    • --upgrade-startup-to-hot
    • --special-package

    전체 목록을 보려면 profman 도움말 페이지나 소스 코드를 참고하세요.