지속적 통합에서 벤치마크 실행

Gradle 없이 CI에서 테스트를 실행하거나 다른 빌드 시스템을 사용하는 경우 로컬에서 테스트를 실행하는 것이 일반적입니다. 이 주제에서는 Gradle없이 런타임 시 벤치마크 라이브러리를 구성하는 방법을 설명합니다.

CI에서 벤치마크가 유용한 이유와 벤치마킹 데이터를 사용하여 회귀를 감지하는 방법에 관한 자세한 내용은 Android 개발자 블로그에서 CI의 벤치마크로 회귀 방지를 참고하세요.

결과

벤치마크는 테스트 실행의 결과 및 메타데이터가 포함된 JSON 파일을 출력합니다. 이 JSON 파일은 기기의 외부 저장소에 작성됩니다. 실행할 때마다 기기에서 파일을 가져와야 합니다.

출력은 기본적으로 사용 중지되어 있지만 am instrument 명령어에 전달된 다음과 같은 계측 인수로 사용 설정할 수 있습니다.

-e androidx.benchmark.output.enable true

기본적으로 보고서는 기기 내 테스트된 앱의 외부 저장소 다운로드 디렉터리에 저장되며 다음 쿼리로 찾을 수 있습니다.

adb shell content query --uri content://media/external/file --projection _data --where "\"_data LIKE '%Android'\""

다음 계측 인수를 사용하여 벤치마크 쓰기 경로를 구성할 수 있습니다.

-e additionalTestOutputDir "device_path_you_can_write_to"

저장소 및 Android 10

Android Gradle과 마찬가지로 테스트를 제거하기 전에 기기에서 출력 데이터를 가져오는 것이 어려우면 다음 계측 인수를 전달할 수 있습니다. Android 10 이상을 실행하는 기기에서 이 인수를 사용하면 제거 후에도 파일이 유지될 수 있습니다.

-e no-isolated-storage 1

API 29 이상도 타겟팅하는 경우 벤치마크 매니페스트에서 기존 저장소 옵션도 명시적으로 허용해야 합니다.

<application android:requestLegacyExternalStorage="true" ... >

자세한 내용은 범위 지정 저장소를 일시적으로 선택 해제를 참고하세요.

시계 잠금

벤치마크 Gradle 플러그인은 ./gradlew lockClocks 명령어를 제공하여 루팅된 기기의 CPU 시계를 잠급니다. 이 명령어는 'userdebug' 빌드와 같은 루팅된 기기에 액세스할 때 안정성을 확보하는 데 유용합니다. 라이브러리 소스에서 사용 가능한 lockClocks.sh 셸 스크립트로 이 명령어를 복제할 수 있습니다.

스크립트를 Linux 또는 Mac 호스트에서 직접 실행하거나 몇 가지 adb 명령어를 사용하여 기기로 푸시할 수 있습니다.

adb push path/lockClocks.sh /data/local/tmp/lockClocks.sh
adb shell /data/local/tmp/lockClocks.sh
adb shell rm /data/local/tmp/lockClocks.sh

호스트에서 직접 셸 스크립트를 실행하면 이러한 명령어가 연결된 기기에 전달됩니다.

계측 인수

다음 계측 인수로 라이브러리의 동작을 구성할 수 있습니다.

androidx.benchmark.startupMode.enable(실험용)

  • 루프 동작을 다시 구성하여 시작 시 벤치마킹 코드 지원
  • 준비 루프 사용 중지
  • 10개의 측정 캡처
  • 루프 평균화를 사용 중지하여 마이크로벤치마크의 오버헤드 최소화
  • 기본값은 false

androidx.benchmark.output.enable

  • 결과 JSON 파일을 외부 저장소에 작성할 수 있음
  • 기본값은 true

androidx.benchmark.suppressErrors

  • 경고로 전환될 쉼표로 구분된 오류 목록(예: DEBUGGABLE,LOW-BATTERY)
  • 기본값은 빈 목록

androidx.benchmark.profiling.mode

  • None, MethodTracing 또는 StackSampling 중 하나(대소문자를 구분하지 않음)
  • 기본값은 None
  • 자세한 내용은 프로파일링 참고

androidx.benchmark.profiling.sampleFrequency

  • StackSampling 프로파일링 모드일 때 초당 캡처하는 스택 샘플 수
  • 기본값은 초당 샘플 1000
  • 자세한 내용은 프로파일링 참고

androidx.benchmark.profiling.sampleDurationSeconds

  • StackSampling 프로파일링 모드일 때 실행될 벤치마크 기간
  • 기본값은 5
  • 자세한 내용은 프로파일링 참고

additionalTestOutputDir

  • JSON 벤치마크 보고서 및 프로파일링 결과가 기기에 저장되는 위치를 구성함
  • 기본값은 테스트 APK의 외부 다운로드 디렉터리