Criar perfis de inicialização

Os perfis de inicialização são um subconjunto dos perfis de referência. Os perfis de inicialização são usados pelo sistema de build para otimizar ainda mais as classes e os métodos que eles contêm, melhorando o layout do código nos arquivos DEX do APK. Com os perfis de inicialização, a inicialização do app é pelo menos 15% mais rápida do que usando apenas os perfis de referência.

Figura 1. Melhoria da localidade de código da otimização do layout DEX.

Requisitos

Recomendamos o uso de Perfis de inicialização com as seguintes ferramentas:

  • Macrobenchmark do Jetpack 1.2.0 ou mais recente.
  • Plug-in do Android para Gradle 8.2 ou mais recente
  • Android Studio Iguana ou versão mais recente

Além disso, você precisa das seguintes configurações no seu app:

  • R8 ativado. Para o build de lançamento, defina isMinifyEnabled = true.
  • Otimizações de layout DEX ativadas. No bloco baselineProfile {} do arquivo de build do módulo do app, defina dexLayoutOptimization = true.

Criar um perfil de startup

O Android Studio cria um perfil de inicialização junto a um perfil de referência quando você usa o modelo padrão do gerador de perfil de referência.

As etapas gerais para criar e gerar um perfil de inicialização são as mesmas para criar um perfil de referência.

A maneira padrão de criar um perfil de inicialização é usando o modelo de módulo do gerador de perfil de referência no Android Studio. Isso inclui interações de inicialização que formam um perfil básico. Para aumentar esse perfil de inicialização com jornadas ideais do usuário (CUJs), adicione as CUJs de inicialização do seu app a um bloco rule com includeInStartupProfile definido como true. Para apps simples, iniciar o MainActivity do app pode ser suficiente. Para apps mais complexos, considere adicionar os pontos de entrada mais comuns, como iniciar o app pela tela inicial ou usar um link direto.

O snippet de código abaixo mostra um gerador de perfis de referência (por padrão, o arquivo BaselineProfileGenerator.kt) que inclui iniciar o app na tela inicial e usar um link direto. O link direto vai diretamente para o feed de notícias do app, não para a tela inicial dele.

@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")
            })
        }
    }
}

Execute a configuração Generate Baseline Profile for app e encontre as regras do perfil de inicialização em src/<variant>/generated/baselineProfiles/startup-prof.txt.

Confirmar a otimização dos perfis de inicialização

Para confirmar a otimização do layout DEX, use o Android Studio para abrir o APK e verificar as classes nos arquivos DEX. Confira se o classes.dex principal não está completamente preenchido. Caso seu app seja composto por um único arquivo DEX, você pode verificar se ele contém dois arquivos DEX depois de ativar o perfil de inicialização.

O Android Studio avisará se as classes de inicialização não couberem em um único arquivo DEX. Para receber informações de diagnóstico que incluam a quantidade de métodos que não são de inicialização nas classes de inicialização, verifique se o compilador R8 está atualizado para, no mínimo, a versão 8.3.36-dev fazendo as seguintes mudanças no arquivo settings.gradle ao aplicar o perfil de inicialização:

Kotlin

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

Groovy

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

Adicione --info depois de assembleRelease no comando abaixo ao criar com o Gradle.

./gradlew assembleRelease --info

O diagnóstico é impresso no terminal.

Se o app ou qualquer biblioteca referenciar uma API simplificada, as implementações de compatibilidade de pacote dessas classes sempre estarão contidas no último arquivo DEX. Esse último arquivo DEX simplificado não participa de otimizações de layout DEX.