Создать профили запуска

Профили запуска — это подмножество базовых профилей. Профили запуска используются системой сборки для дальнейшей оптимизации содержащихся в них классов и методов за счет улучшения компоновки кода в файлах DEX вашего APK. Благодаря профилям запуска ваше приложение обычно запускается на 15–30 % быстрее, чем при использовании только базовых профилей.

Рисунок 1. Улучшение локальности кода за счет оптимизации макета DEX.

Требования

Мы рекомендуем использовать профили запуска со следующими инструментами:

  • Jetpack Macrobenchmark 1.2.0 или выше
  • Плагин Android Gradle 8.2 или выше
  • Android Studio Iguana или выше

Кроме того, вам потребуются следующие настройки в вашем приложении:

  • R8 включен. Для вашей сборки выпуска установите isMinifyEnabled = true .
  • Оптимизация макета DEX включена. В блоке baselineProfile {} файла сборки модуля приложения установите dexLayoutOptimization = true .

Создать профиль запуска

Android Studio создает профиль запуска вместе с базовым профилем, когда вы используете шаблон генератора базового профиля по умолчанию.

Общие шаги по созданию и созданию стартового профиля такие же, как и при создании базового профиля .

По умолчанию для создания профиля запуска используется шаблон модуля «Генератор базового профиля» из Android Studio. Сюда входят взаимодействия при запуске, которые формируют базовый профиль запуска. Чтобы дополнить этот профиль запуска дополнительными критическими действиями пользователя (CUJ), добавьте CUJ запуска приложения в блок rule с параметром includeInStartupProfile , для которого установлено true . Для простых приложений может быть достаточно запуска MainActivity приложения. Для более сложных приложений рассмотрите возможность добавления в приложение наиболее распространенных точек входа, таких как запуск приложения с главного экрана или переход по глубокой ссылке .

В следующем фрагменте кода показан генератор базового профиля (по умолчанию файл BaselineProfileGenerator.kt ), который включает запуск вашего приложения с главного экрана и переход по глубокой ссылке. Глубокая ссылка ведет непосредственно на ленту новостей приложения, а не на главный экран приложения.

@RunWith(AndroidJUnit4::class)
@LargeTest
class BaselineProfileGenerator {

    @get:Rule
    val rule = BaselineProfileRule()

    @Test
    fun generate() {
        rule.collect(
            packageName = "com.example.app",
            includeInStartupProfile = true
        ) {
            // Launch directly into the NEWS_FEED.
            startActivityAndWait(Intent().apply {
                setPackage(packageName)
                setAction("com.example.app.NEWS_FEED")
            })
        }
    }
}

Запустите команду «Создать базовый профиль для конфигурации приложения» и найдите правила профиля запуска по адресу src/<variant>/generated/baselineProfiles/startup-prof.txt .

Подтвердить оптимизацию профилей запуска

Чтобы подтвердить оптимизацию макета DEX, используйте Android Studio, чтобы открыть APK и проверить классы в файлах DEX. Убедитесь, что основной classes.dex заполнен не полностью. Если ваше приложение состоит из одного файла DEX, вы можете проверить, содержит ли приложение два файла DEX после включения профиля запуска.

Android Studio предупреждает вас, если классы запуска не помещаются в один файл DEX. Чтобы получить диагностическую информацию, включающую количество незапускаемых методов в классах запуска, убедитесь, что компилятор R8 обновлен как минимум до версии 8.3.36-dev, внеся следующие изменения в файл settings.gradle при применении параметра Startup. Профиль:

Котлин

pluginManagement {
    buildscript {
        repositories {
            mavenCentral()
            maven {
                url = uri("https://storage.googleapis.com/r8-releases/raw")
            }
        }
        dependencies {
            classpath("com.android.tools:r8:8.3.6-dev")
        }
    }
}

классный

pluginManagement {
    buildscript {
        repositories {
            mavenCentral()
            maven {
                url uri('https://storage.googleapis.com/r8-releases/raw')
            }
        }
        dependencies {
            classpath 'com.android.tools:r8:8.3.6-dev"
        }
    }
}

Обязательно добавьте --info после assembleRelease в следующей команде при сборке с помощью Gradle.

./gradlew assembleRelease --info

Диагностическое сообщение затем распечатывается на терминале.

Если ваше приложение или какие-либо библиотеки ссылаются на какие-либо отключенные API , связанные реализации совместимости этих классов всегда содержатся в последнем файле DEX. Этот обессахаренный последний файл DEX не участвует в оптимизации макета DEX.

Рекомендации по созданию профилей запуска

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

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

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

  1. Основная активность лаунчера
  2. Уведомления, запускающие запуск приложения
  3. Дополнительные действия по запуску

Работайте над этим списком сверху и остановитесь до того, как class.dex заполнится. Чтобы впоследствии охватить больше циклов, переместите код из пути запуска и добавьте больше циклов. Чтобы удалить код из пути запуска, проверьте трассировки Perfetto во время запуска приложения и найдите длительные операции. Вы также можете использовать макротест с включенной трассировкой методов для автоматического и полного просмотра вызовов методов во время запуска приложения.

{% дословно %} {% дословно %} {% дословно %} {% дословно %}