Android Baseline Profiles 정리3 - Configure Baseline Profile generation

wonsohana·2024년 10월 1일

Configure Baseline Profile generation

Baseline Profile Gradle 플러그인은 Baseline Profile 을 더 쉽게 생성하고 관리할 수 있도록 도와준다. 이 플러그인은 다음 작업을 수행하는 데에 유용하다.

  • 앱을 위한 새로운 Baseline Profile 생성 (구글링크)
  • 라이브러리를 위한 새로운 Baseline Profile 생성 (구글링크)

→ 위 두개는 여기서 정리한 적이 있다.

  • Baseline Profile 생성을 위한 사용자 정의

이 챕터에서는 Baseline Profile Gradle 플러그인을 사용하여 Baseline Profile 생성을 사용자 정의하는 방법에 대해 설명한다.

Use a Gradle Managed Devices to generate Baseline Profiles

Gradle Managed Device (GMD) 를 사용하여 Baseline Profile 을 생성하려면, Baseline Profile 을 생성하는 모듈 (대개 :baselineprofile 테스트 모듈)의 build.gradle.kts 파일에 GMD 를 추가해야 한다.

android {
   testOptions.managedDevices.devices {
       create<com.android.build.api.dsl.ManagedVirtualDevice>("pixel6Api31") {
           device = "Pixel 6"
           apiLevel = 31
           systemImageSource = "aosp"
       }
   }
}
// 위 코드를 통해 Pixel 6 기기와 API 레벨 31 을 사용하는 가상 디바이스를 생성할 수 있다.

다음으로 :baselineprofile 테스트 모듈의 build.gradle.kts 파일에 Baseline Profile 플러그인 configuration 을 추가하여 GMD 를 사용할 수 있도록 설정해야 한다.

baselineProfile {
    managedDevices += "pixel6Api31"
}
// 이전에 생성한 pixel6Api31 GMD 를 Baseline Profile 생성을 위해 사용할 수 있다

마지막으로 GMD 를 사용할 때는 실제 연결된 물리적 디바이스를 사용하지 않도록 useConnectedDevicesfalse 로 설정해야 한다.

baselineProfile {
    ...
    useConnectedDevices = false
}

Generate Baseline Profiles for different variants

각 build variants 또는 flavor 에 대한 Baseline Profile 을 개별적으로 생성하거나, 모든 variants 에 대한 단일 파일을 생성할 수 있다. 이 동작은 merge 설정을 통해 제어할 수 있다. 아래 예시는 app 또는 라이브러리 모듈의 build.gradle.kts 에서 설정하는 방법을 보여준다.

baselineProfile {
    mergeIntoMain = true
}

mergeIntoMaintrue 로 설정하면 모든 variants 에 대해 생성된 프로파일을 하나의 파일로 병합한다. 이 경우, 개별 variants 마다 Baseline Profile 을 생성할 수 없고 단일 Gradle 작업인 gernertateBaselineProfile 이 존재한다. 생성된 profile 은 src/main/gerneated/baselineProfiles 에 출력된다.

반대로, mergeIntoMainfalse 로 설정하면 각 vartiants 에 대해 개별적인 Baseline Profile 을 생성할 수 있다. 이 경우 variatns 별로 여러 Gradle 작업이 생성된다.

예를 들어 두 가지 flavor (feed 와 paid) 와 하나의 variants 유형 (release) 가 있을 때, 다음과 같은 작업이 존재한다.

* `generateFreeReleaseBaselineProfile`
* `generatePaidReleaseBaselineProfile`
* `generateReleaseBaselineProfile`

이 설정을 통해 필요해 따라 variants 별 Baseline Profile 을 생성하거나, 모든 variants 에 대해 단일 파일을 사용할 수 있다.

build variants 별로 Baseline Profile 병합 동작을 지정하려면, 각 variants 에 대해 mergeIntoMain flag 를 설정해야 한다.

baselineProfile {
    variants {
        freeRelease {
            mergeIntoMain = true
        }
    }
}

위 예에서 mergeIntoMain = true 로 설정되어 있으므로, 이 variants 에서 생성된 파일은 src/main/generated/baselineProfiles 폴더에 병합된다.

반대로 mergeIntoMain = false로 설정한다면, 생성된 프로파일은 src/paidRelease/generated/baselineProfiles 폴더에 개별적으로 저장된다.

기본적으로 mergeIntoMain 의 값은 app 은 false , 라이브러리는 true 로 되어있다.

Automatically generate Baseline Profiles when assembling a new release

매번 release build 를 할 때 마다 Baseline Profile 이 자동으로 생성되도록 설정할 수 있다. 이렇게 하면 gernrateBaselineProfile 작업을 수동으로 진행할 필요없이 최신 profile 이 항상 release build 에 포함된다.

automaticGenerationDuringBuild 플래그를 사용하여 릴리스 빌드 시 자동으로 Baseline Profile이 생성되도록 할 수 있다.

baselineProfile {
    automaticGenerationDuringBuild = true
}

이 코드를 설정하면, 새로운 Baseline Profile이 자동으로 생성된다.

예를 들어, ./gradlew :app:assembleRelease 명령을 실행하면 :app:generateReleaseBaselineProfile 작업도 함께 실행되어 Baseline Profile 테스트가 시작되고 해당 빌드에서 프로파일이 자동으로 생성된다.

다만 Baseline Profile 자동 생성을 활성화하면 성능 최적화를 위한 최신 프로파일이 항상 빌드에 포함되지만, 빌드와 테스트 작업이 추가로 실행되므로 빌드 시간이 증가할 수 있으므로 유의해야 한다.

참고: 언제든지 다음 명령을 사용하여 Baseline Profile을 명시적으로 생성하고 릴리스 빌드를 실행할 수 있다.

./gradlew :app:generateReleaseBaseline :app:assembleRelease

이 명령을 실행하면 Baseline Profile이 먼저 생성되고, 이후 생성된 프로파일이 릴리스 버전에 패키징된다. 즉, 이 과정은 먼저 프로파일을 생성한 후, 해당 프로파일이 릴리스 빌드에 포함되도록 보장한다.

build variants 별로 Baseline Profile 의 자동 생성을 설정할 수 있다. 아래 예시는 특정 variants 에 대해 자동 생성을 설정하는 방법이다.

baselineProfile {
    variants {
        freeRelease {
            automaticGenerationDuringBuild = true
        }
    }
}

assembleFreeRelease 작업이 실행될 때, generateFreeReleaseBaselineProfile 작업도 자동으로 실행된다. 이 방식은 사용자가 배포용 release build 를 생성할 때 마다 Baseline Profile 이 자동으로 생성되도록 설정할 수 있으며, 내부 테스트 용도의 빌드에서는 profile 을 생성하지 않도록 분리하는데 유용하다.

예를 들어, 배포를 위한 release build 에서는 항상 Baseline Profile 을 생성하고, 내부 테스트를 위한 빌드에서 프로파일 생성을 생략하는 등의 구성을 할 수 있다.

Store Baseline Profiles into sources

Baseline Profiles 는 App 또는 라이브러리 모듈의 build.gradle.kts 에서 saveInSrc 플래그를 통해 소스 디렉토리에 저장할 수 있다.

  • true : Baseline Profile 이 src/<variant>/generated/baselineProfiles 에 저장된다. 이를 통해 최신 생성된 profile 을 소스와 함께 커밋할 수 있다.
  • false : Baseline Profile 이 빌드 디렉토리의 중간 파일에 저장된다. 이 경우 코드를 커밋할 때 최신 생성된 profile 이 저장되지 않는다.
baselineProfile {
    saveInSrc = true
}

각 variants 별로 지정할 수도 있다.

baselineProfile {
    variants {
        freeRelease {
            saveInSrc = true
        }
    }
}

Filter profile rules

Baseline Profile Gradle 플러그인은 생성된 Baseline Profile 규칙을 필터링할 수 있다. 이는 샘플 앱이나 라이브러리 자체의 다른 종속성과 관련된 클래스 및 메서드의 프로파일 규칙을 제외하고 싶을 때 특히 유용하다. 필터는 특정 패키지 및 클래스를 포함하거나 제외할 수 있다. 제외 사항만 지정하는 경우, 일치하는 Baseline Profile 규칙만 제외되고 나머지는 모두 포함된다.

필터의 사양(옵션) 은 다음과 같다.

  • 두 개의 와일드카드로 끝나는 패키지 이름: 지정된 패키지와 모든 하위 패키지에 일 치 하는 경우. 예를 들어, com.example.**com.example.methodcom.example.method.bar와 일치한다.
  • 와일드카드로 끝나는 패키지 이름: 지정된 패키지에만 일치하는 경우. 예를 들어, com.example.*com.example.method 와 일치하지만 com.example.method.bar와는 일치하지 않는다.
  • 특정 클래스에 일치하는 클래스 이름: 예를 들어, com.example.MyClass.

다음 예제는 특정 패키지를 포함하거나 제외하는 방법이다.

baselineProfile {
    filter {
        include("com.somelibrary.widget.grid.**")
        exclude("com.somelibrary.widget.grid.debug.**")
        include("com.somelibrary.widget.list.**")
        exclude("com.somelibrary.widget.list.debug.**")
        include("com.somelibrary.widget.text.**")
        exclude("com.somelibrary.widget.text.debug.**")
    }
}

필터 규칙을 variants 마다 다르게 커스텀 할 수도 있다.

// Non-specific filters applied to all the variants.
// 모든 variants 에 적용되는 필터
baselineProfile {
    filter { include("com.myapp.**") }
}

// Flavor-specific filters.
baselineProfile {
    variants {
        free {
            filter {
                include("com.myapp.free.**")
            }
        }
        paid {
            filter {
                include("com.myapp.paid.**")
            }
        }
    }
}

// Build-type-specific filters.
baselineProfile {
    variants {
        release {
            filter {
                include("com.myapp.**")
            }
        }
    }
}

// Variant-specific filters.
baselineProfile {
    variants {
        freeRelease {
            filter {
                include("com.myapp.**")
            }
        }
    }
}

Custzmize benchmark and Baseline Profile build types

Baseline Profile Gradle 플러그인은 profile 을 생성하고 benchmark 를 실행하기 위해 추가 build type 을 생성한다. 이러한 build type 은 benchmarknonMinified 가 접두사로 붙는다.

예를 들어, release build 의 경우 특정 사용 사례에 맞게 자동으로 구성되며 일반적으로 추가적인 사용자 정의가 필요하지 않다. 그러나 다른 signing config 등을 적용하기 위해 일부 사용자 정의 옵션을 적용하는 것이 유용한 경우도 있다.

자동 생성된 build type 을 사용자 정의할 때는 일부 build type 속성을 사용할 수 있으며, 사용 불가능한 속성은 덮어씌워진다.

android {
    buildTypes {
        release {
            ...
        }
        create("benchmarkRelease") {
							// `benchmarkRelease` 빌드 유형의 속성을 customize 한다.
              // 예를 들어, 서명 구성을 변경할 수 있다.
              // (기본적으로 릴리스 빌드 유형과 동일함).
            signingConfig = signingConfigs.getByName("benchmarkRelease")
        }
        create("nonMinifiedRelease") {
            // `nonMinifiedRelease` 빌드 type 의 속성을 customize 한다.
            signingConfig = signingConfigs.getByName("nonMinifiedRelease")

            // Baseline Profile Gradle 플러그인 1.2.4 이상부터는
            // 다음 속성을 사용자 정의할 수 없다. 
            // 이 속성들은 Baseline Profile 생성에 문제가 생기지 않도록 항상 덮어씌워진다.
            //
            // isJniDebuggable = false
            // isDebuggable = false
            // isMinifyEnabled = false
            // isShrinkResources = false
            // isProfileable = true
            // enableAndroidTestCoverage = false
            // enableUnitTestCoverage = false
        }
    }
}
profile
Android Developer

0개의 댓글