Настройка создания базового профиля

Плагин Baseline Profile Gradle упрощает создание и поддержку Baseline Profiles . Он помогает вам выполнять следующие задачи:

На этой странице объясняется, как использовать плагин Baseline Profile Gradle для настройки генерации базовых профилей.

Требования к плагину

Используйте Gradle Managed Devices для создания базовых профилей

Чтобы использовать Gradle Managed Device (GMD) для создания базового профиля, добавьте его в конфигурацию build.gradle.kts модуля производителя профилей (вероятно, это тестовый модуль :baselineprofile ), как показано в следующем примере:

Котлин

android {
   testOptions.managedDevices.devices {
       create<com.android.build.api.dsl.ManagedVirtualDevice>("pixel6Api31") {
           device = "Pixel 6"
           apiLevel = 31
           systemImageSource = "aosp"
       }
   }
}

Круто

android {
   testOptions.managedDevices.devices {
       pixel6Api31(ManagedVirtualDevice) {
           device 'Pixel 6'
           apiLevel = 31
           systemImageSource 'aosp'
       }
   }
}

Используйте GMD для генерации базовых профилей, добавив его в конфигурацию плагина Gradle Baseline Profile следующим образом в build.gradle.kts тестового модуля :baselineprofile :

Котлин

baselineProfile {
    managedDevices += "pixel6Api31"
}

Круто

baselineProfile {
    managedDevices = ['pixel6Api31']
}

При использовании GMD для генерации базовых профилей установите useConnectedDevices в false в тестовом модуле :baselineprofile :

Котлин

baselineProfile {
    ...
    useConnectedDevices = false
}

Круто

baselineProfile {
    ...
    useConnectedDevices false
}

Генерация базовых профилей для различных вариантов

Вы можете генерировать базовые профили для каждого варианта, для каждого вкуса или как один файл для использования для всех вариантов. Управляйте этим поведением с помощью настройки слияния, как показано в следующем примере, в build.gradle.kts модуля приложения или библиотеки.

Котлин

baselineProfile {
    mergeIntoMain = true
}

Круто

baselineProfile {
    mergeIntoMain true
}

Чтобы объединить сгенерированные профили для всех вариантов в один профиль, установите mergeIntoMain в true . Невозможно сгенерировать базовые профили для каждого варианта, если этот параметр установлен в значение true , поэтому есть одна задача Gradle, которая называется generateBaselineProfile . Профиль выводится в src/main/generated/baselineProfiles .

Чтобы отключить слияние и иметь один профиль на вариант, установите mergeIntoMain на false . В этом случае существует несколько задач Gradle, специфичных для вариантов. Например, когда есть два варианта — например, бесплатный и платный — и один тип сборки релиза, задачи будут следующими:

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

Чтобы указать поведение слияния для каждого варианта, используйте следующий код:

Котлин

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

Круто

baselineProfile {
    variants {
        freeRelease {
            mergeIntoMain true
        }
    }
}

В предыдущем примере все варианты, где флаг установлен на true объединяются в src/main/generated/baselineProfiles , тогда как профили для вариантов, где флаг установлен на false хранятся в папке src/<variant>/generated/baselineProfiles .

По умолчанию mergeIntoMain имеет значение true для библиотек и false для приложений.

Автоматически генерировать базовые профили при сборке нового релиза

Вы можете настроить Baseline Profiles для автоматического создания с каждой сборкой релиза вместо ручного использования задачи generateBaselineProfile . При автоматическом создании в сборку релиза включается самый обновленный профиль.

Чтобы включить автоматическую генерацию для релизных сборок, используйте флаг automaticGenerationDuringBuild :

Котлин

baselineProfile {
    automaticGenerationDuringBuild = true
}

Круто

baselineProfile {
    automaticGenerationDuringBuild true
}

Установка флага automaticGenerationDuringBuild в значение true запускает генерацию нового Baseline Profile для каждой сборки выпуска. Это означает, что запуск задачи сборки сборки выпуска, такой как ./gradlew:app:assembleRelease , также запускает :app:generateReleaseBaselineProfile , запускает тесты инструментирования Baseline Profile и создает сборку Baseline Profile, на которой они работают. Хотя автоматическая генерация помогает пользователям получить максимальную производительность, она также увеличивает время сборки из-за двойной сборки и тестов инструментирования.

Вы также можете указать это поведение для каждого варианта, как показано в следующем примере:

Котлин

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

Круто

baselineProfile {
    variants {
        freeRelease {
            automaticGenerationDuringBuild true
        }
    }
}

В предыдущем примере задача generateFreeReleaseBaselineProfile запускается при запуске assembleFreeRelease . Это помогает, когда пользователь хочет иметь, например, release для сборки распространения, который всегда генерирует профиль при сборке, и сборку releaseWithoutProfile для внутреннего тестирования.

Вместо добавления нового варианта без базового профиля вы также можете отключить генерацию из командной строки следующим образом:

./gradlew assembleRelease -Pandroid.baselineProfile.automaticGenerationDuringBuild=false

Сохранение базовых профилей в источниках

Вы можете сохранить базовые профили в исходном каталоге с помощью флага saveInSrc в build.gradle.kts приложения или модуля библиотеки:

  • true : базовый профиль хранится в src/<variant>/generated/baselineProfiles . Это позволяет вам зафиксировать последний сгенерированный профиль с вашими источниками.
  • false : базовый профиль хранится в промежуточных файлах в каталоге сборки. Таким образом, при фиксации кода вы не сохраняете последний сгенерированный профиль.

Котлин

baselineProfile {
    saveInSrc = true
}

Круто

baselineProfile {
    saveInSrc true
}

Вы также можете указать это поведение для каждого варианта:

Котлин

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

Круто

baselineProfile {
    variants {
        freeRelease {
            saveInSrc true
        }
    }
}

Отключить предупреждения

По умолчанию плагин Baseline Profile Gradle предупреждает вас о ситуациях, которые могут вызвать проблемы. Чтобы отключить предупреждения, вы можете установить соответствующий параметр на false в файле build.gradle.kts . Вот параметры предупреждений:

baselineProfile {
    warnings {

        /**
        * Warn when the Android Gradle Plugin version is higher than the max
        * tested one.
        */
        maxAgpVersion = true

        /**
        * Warn when a benchmark or baseline profile variant has been disabled.
        */
        disabledVariants = true

        /**
        * Warn that running `generateBaselineProfile` with AGP 8.0 doesn't
        * support running instrumentation tests for multiple build types at
        * once.
        */
        multipleBuildTypesWithAgp80 = true

        /**
        * Warn when no baseline profiles are generated after running the
        * generate baseline profile command.
        */
        noBaselineProfileRulesGenerated = true

        /**
        * Warn when no startup profiles are generated after running the generate
        * baseline profile command.
        */
        noStartupProfileRulesGenerated = true
    }
}

Правила профиля фильтра

Плагин Baseline Profile Gradle позволяет фильтровать сгенерированные правила Baseline Profile. Это особенно полезно для библиотек, если вы хотите исключить правила профиля для классов и методов, которые являются частью других зависимостей примера приложения или самой библиотеки. Фильтры могут включать и исключать определенные пакеты и классы. Если вы указываете только исключения, исключаются только соответствующие правила Baseline Profile, а все остальное включается.

Спецификация фильтров может быть любой из следующих:

  • Имя пакета заканчивается двойными подстановочными знаками для соответствия указанному пакету и всем подпакетам. Например, com.example.** соответствует com.example.method и com.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.**")
    }
}

Круто

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.**'
    }
}

Настройте правила фильтрации для различных вариантов следующим образом:

Котлин

// Non-specific filters applied to all the 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.**")
            }
        }
    }
}

Круто

// Non-specific filters applied to all the 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.**'
            }
        }
    }
}

Вы также можете фильтровать правила с помощью аргумента filterPredicate в BaselineProfileRule.collect() , но мы рекомендуем использовать плагин Gradle для фильтрации, поскольку он обеспечивает более простой способ фильтрации подпакетов и единое место для настройки всего модуля.

Настройте типы построения эталонного теста и базового профиля

Плагин Baseline Profile Gradle создает дополнительные типы сборки для генерации профилей и запуска бенчмарков. Эти типы сборки имеют префикс benchmark и nonMinified . Например, для типа сборки release плагин создает типы сборки benchmarkRelease и nonMinifiedRelease . Эти типы сборки автоматически настраиваются для конкретного варианта использования и, как правило, не требуют настройки. Но есть некоторые случаи, в которых все равно может быть полезно применить некоторые пользовательские параметры, например, применить другую конфигурацию подписи.

Вы можете настроить автоматически сгенерированные типы сборки, используя подмножество свойств типа сборки; свойства, которые не могут быть использованы, переопределяются. Следующий пример показывает, как настроить дополнительные типы сборки и какие свойства переопределяются:

Котлин

android {
    buildTypes {
        release {
            ...
        }
        create("benchmarkRelease") {
            // Customize properties for the `benchmarkRelease` build type here.
            // For example, you can change the signing config (by default
            // it's the same as for the `release` build type).
            signingConfig = signingConfigs.getByName("benchmarkRelease")
        }
        create("nonMinifiedRelease") {
            // Customize properties for the `nonMinifiedRelease` build type here.
            signingConfig = signingConfigs.getByName("nonMinifiedRelease")

            // From Baseline Profile Gradle plugin 1.2.4 and higher, you can't
            // customize the following properties, which are always overridden to
            // avoid breaking Baseline Profile generation:
            //
            // isJniDebuggable = false
            // isDebuggable = false
            // isMinifyEnabled = false
            // isShrinkResources = false
            // isProfileable = true
            // enableAndroidTestCoverage = false
            // enableUnitTestCoverage = false
        }
    }
}

Круто

android {
    buildTypes {
        release {
            ...
        }
        benchmarkRelease {
            // Customize properties for the `benchmarkRelease` build type here.
            // For example, you can change the signing config (by default it's the
            // same as for the `release` build type.)
            signingConfig = signingConfigs.benchmarkRelease
        }
        nonMinifiedRelease {
            // Customize properties for the `nonMinifiedRelease` build type here.
            signingConfig = signingConfigs.nonMinifiedRelease

            // From Baseline Profile Gradle plugin 1.2.4 and higher, you can't use
            // the following properties, which are always overridden to avoid breaking
            // Baseline Profile generation:
            //
            // isJniDebuggable = false
            // isDebuggable = false
            // isMinifyEnabled = false
            // isShrinkResources = false
            // isProfileable = true
            // enableAndroidTestCoverage = false
            // enableUnitTestCoverage = false       
        }
    }
}

Дополнительные примечания

При создании базовых профилей следует учитывать несколько дополнительных моментов:

  • Скомпилированные базовые профили должны быть меньше 1,5 МБ. Это не относится к текстовому формату в исходных файлах, которые обычно намного больше до компиляции. Проверьте размер вашего бинарного базового профиля, найдя его в выходном артефакте в assets/dexopt/baseline.prof для APK или BUNDLE-METADATA/com.android.tools.build.profiles/baseline.prof для AAB.

  • Широкие правила, которые компилируют слишком много приложения, могут замедлить запуск из-за возросшего доступа к диску. Если вы только начинаете с базовыми профилями, не беспокойтесь об этом. Однако, в зависимости от вашего приложения, а также размера и количества поездок, добавление большого количества поездок может привести к неоптимальной производительности. Проверьте производительность вашего приложения, попробовав разные профили и убедившись, что производительность не ухудшается после добавлений.

Кодовые лаборатории

Погрузитесь в макробенчмаркинг для измерения производительности.
Создайте индивидуальный базовый профиль, адаптированный под приложение Android, и проверьте его эффективность.