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 seu APK. Com os perfis de inicialização, a inicialização do app geralmente é entre 15% e 30% mais rápida do que com o valor de referência Somente perfis.

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

Requisitos

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

  • Jetpack Macrobenchmark 1.2.0 ou mais recente
  • Plug-in do Android para Gradle 8.2 ou mais recente
  • Android Studio Iguana ou 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 objeto arquivo de build do módulo do app, defina dexLayoutOptimization = true.

Criar um perfil de inicialização

O Android Studio cria um perfil de inicialização junto de um perfil de referência quando você usar 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 é usar o perfil de referência Modelo de módulo do gerador do Android Studio. Isso inclui inicialização interações que formam um perfil básico de inicialização. Para ampliar este perfil de inicialização com mais jornadas ideais do usuário (CUJs), adicione as CUJs de inicialização do app a uma rule bloco com includeInStartupProfile definido como true. Para apps simples, lançar o MainActivity do app pode ser suficiente. Para apps mais complexos, adicionando os pontos de entrada mais comuns, como iniciar o aplicativo pela tela inicial ou iniciar em um link direto.

O snippet de código a seguir mostra um gerador de perfis de referência (por padrão, o BaselineProfileGenerator.kt) que inclui iniciar o app no tela inicial e abrir um link direto. O link direto leva diretamente ao no feed de notícias do app, não na 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 Generate Baseline Profile for app configuration e encontre a 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. Verifique se o classes.dex principal não é completamente preenchidos. Se o app consistir em um único arquivo DEX, você poderá verificar se ele contém dois arquivos DEX depois de ativar o perfil de inicialização.

O Android Studio avisa se as classes de inicialização não couberem em um único arquivo DEX. Para receber informações de diagnóstico que incluem a quantidade de métodos que não são de inicialização em as classes de inicialização, confira se o compilador R8 está atualizado com pelo menos 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 alguma API de simplificação, o pacote as implementações de compatibilidade dessas classes estão sempre contidas na arquivo DEX. Este último arquivo DEX de simplificação não participa do layout DEX e otimizações.

Considerações sobre a criação de perfis de inicialização

A saída das classes e dos métodos de um perfil de inicialização é limitada pelo tamanho primeiro arquivo classes.dex. Isso significa que nem todas as jornadas de perfil de referência também devem ser jornadas de perfil de startup.

Para decidir quais jornadas do usuário abordar ao criar um perfil de startup, considere em que a maioria dos usuários inicia o aplicativo. Normalmente, isso é do inicializador e após o login. Essa também é a jornada de perfil de referência mais básica.

Depois que o primeiro caso de uso tiver sido abordado, siga o funil do usuário para o app inicialização. Em muitos casos, os funis de inicialização do app seguem esta lista:

  1. Atividade principal da tela de início
  2. Notificações que acionam a inicialização do app
  3. Atividades opcionais da tela de início

Comece a seguir a lista e pare antes de o class.dex ficar cheio. Para cobrir mais jornadas depois, remova o código do caminho de inicialização e adicione mais e suas jornadas. Para remover o código do caminho de inicialização, inspecione os rastros do Perfetto durante a inicialização do app e procura operações de longa duração. Você também pode usar uma macrobenchmark com o rastreamento de métodos ativado para uma visualização automatizável e completa das chamadas de método durante a inicialização do app.