Publicar várias bibliotecas do Android como uma com a biblioteca combinada

Em projetos com muitos módulos, pode ser difícil distribuir bibliotecas do Android para os usuários e manter uma estrutura de projeto clara. Em muitos casos, mais bibliotecas precisam ser publicadas do que o esperado.

O plug-in da biblioteca unificada disponibilizado com o Plug-in do Android para Gradle ajuda a empacotar vários módulos da biblioteca Android em uma única biblioteca Android publicável. Isso permite modularizar o código-fonte e os recursos da biblioteca no build conforme achar melhor, evitando a exposição da estrutura do projeto após a distribuição.

Distribuir como uma única biblioteca pode ter os seguintes benefícios:

  • Dependências simplificadas:substituem várias dependências de biblioteca por um único AAR, simplificando a configuração do projeto e o gerenciamento de versões para os usuários.
  • Tamanho reduzido da biblioteca:pode melhorar a redução de código, resultando em AARs menores.
  • Segurança aprimorada:pode oferecer melhor controle sobre os detalhes de implementação interna das bibliotecas publicadas.

Criar uma biblioteca combinada

Para criar uma biblioteca combinada, é necessário criar um novo módulo do Android, adicionar dependências e publicar a biblioteca combinada.

Adicionar um novo módulo de biblioteca combinada

Para usar o plug-in, adicione um novo módulo do Android ao projeto:

Neste exemplo, o módulo de biblioteca combinada será chamado de myFusedLibrary.

  1. Adicione android.experimental.fusedLibrarySupport=true ao arquivo gradle.properties para ativar o suporte à biblioteca unificada.
  2. Anexe include(":myFusedLibrary") ao arquivo settings.gradle.kts.
  3. Adicione android-fusedlibrary = { id = "com.android.fused-library", version.ref = "agp" } na seção [plugins] do arquivo gradle/libs.versions.toml.
  4. Adicione alias(libs.plugins.android.fusedlibrary) apply false no bloco plugins no arquivo build.gradle.kts de nível superior.
  5. Para criar o módulo myFusedLibrary, crie um novo diretório chamado myFusedLibrary (clique com o botão direito em "My Application" > New > Directory).
  6. Crie um arquivo build.gradle.kts no módulo myFusedLibrary (clique com o botão direito do mouse no módulo myFusedLibrary > Novo > Arquivo).
  7. Cole o seguinte no arquivo myFusedLibrary/build.gradle.kts:

Kotlin

plugins {
    alias(libs.plugins.android.fusedlibrary)
    `maven-publish`
}

androidFusedLibrary {
    namespace = "com.example.myFusedLibrary"
    minSdk = 21
}

dependencies { }

Groovy

plugins {
    id 'fused-library'
}

androidFusedLibrary {
    namespace 'com.example.myFusedLibrary'
    minSdk 21
}

dependencies {

}

Adicionar dependências

A funcionalidade principal da biblioteca fundida é agrupar dependências. O plug-in permite adicionar dependências de projetos locais e bibliotecas externas. Para especificar as dependências que serão empacotadas, use a configuração include. As dependências transitivas não são empacotadas.

Exemplo:

Kotlin

dependencies {
    include(project(":image-rendering"))
    include("mycoolfonts:font-wingdings:5.0")
}

Groovy

dependencies {
    include project(':image-rendering')
    include 'mycoolfonts:font-wingdings:5.0'
}

Publicar sua biblioteca combinada

Familiarize-se com a publicação de uma biblioteca Android antes de publicar uma biblioteca combinada. Publicar uma biblioteca combinada é semelhante a publicar uma biblioteca Android, mas há algumas diferenças importantes que você precisa considerar para publicar a biblioteca combinada corretamente:

  • O plug-in Maven Publish também precisa ser aplicado a qualquer módulo que tenha o plug-in Fused Library aplicado.
  • A publicação precisa herdar de fusedLibraryComponent porque isso fornece as dependências necessárias para compilar o artefato da biblioteca fundida.

Confira um exemplo de configuração de publicações:

Kotlin

plugins {
    alias(libs.plugins.android.fusedlibrary)
    `maven-publish`
}

androidFusedLibrary {  }

dependencies {  }

publishing {
    publications {
        register<MavenPublication>("release") {
             groupId = "my-company"
             artifactId = "my-fused-library"
             version = "1.0"
             from(components["fusedLibraryComponent"])
        }
    }
}

Groovy

plugins {
    id 'fused-library'
    id 'maven-publish'
}

androidFusedLibrary {  }

dependencies {  }

publishing {
    publications {
        release(MavenPublication) {
            groupId = "my-company"
            artifactId = "my-fused-library"
            version = "1.0"
            afterEvaluate {
            from components.fusedLibraryComponent
        }
    }
}

Publicar a biblioteca combinada para teste

Teste dependendo de uma biblioteca combinada publicada de um app ou biblioteca Android. O método recomendado é publicar na biblioteca combinada e nas dependências do projeto em um repositório Maven local.

Para publicar os artefatos da biblioteca combinada em um repositório local, defina uma configuração semelhante a esta:

Kotlin

plugins {
    alias(libs.plugins.android.fusedlibrary)
    `maven-publish`
}

repositories {
    maven {
        name = "myLocalRepo"
        url = uri(layout.buildDirectory.dir("myLocalRepo"))
    }
}

Groovy

plugins {
    id 'fused-library'
    id 'maven-publish'
}

repositories {
    maven {
        name 'myLocalRepo'
        url layout.buildDirectory.dir('myLocalRepo')
    }
}

Fazer upload da biblioteca combinada

Para distribuir sua biblioteca combinada, consulte Fazer upload da biblioteca.

Comportamento e salvaguardas

A combinação de bibliotecas do Android tem complexidades que podem dificultar a justificação de prioridades pelo plug-in. Por exemplo, duas bibliotecas com o mesmo classpath causam uma falha de build ao fundir a biblioteca. A fusão de recursos considera a ordem das dependências especificadas ao selecionar um recurso com o mesmo nome em bibliotecas diferentes.

  • As bibliotecas combinadas só podem ser publicadas como um artefato AAR de biblioteca Android para serem adicionadas como uma dependência.
  • Não é possível combinar bibliotecas que usam vinculação de dados.
  • Não é possível fundir vários tipos de build e variações de produtos em uma única biblioteca fundida. Crie bibliotecas fundidas separadas para variantes diferentes.

Para equilibrar a quantidade de configuração necessária e a facilidade de uso, o plug-in vai falhar na build em conflitos ambíguos ou usar heurísticas ao combinar artefatos. Os detalhes de como os artefatos são combinados estão na tabela a seguir:

Tipo Comportamento
Classes Bibliotecas com o mesmo classpath causam uma falha de build ao serem combinadas.
Recursos para Android A fusão de recursos considera a ordem das dependências especificadas ao selecionar um recurso com o mesmo nome em diferentes.
Metadados de AAR As versões de metadados AAR são mescladas priorizando o valor mais alto de cada biblioteca de dependência. Há uma DSL fornecida para substituir esses valores.

Kotlin

 androidFusedLibrary { aarMetadata { minCompileSdk = 21 minCompileSdkExtension = 1 } }
Recursos Java Não é permitido ter arquivos de recursos Java em várias bibliotecas com caminhos idênticos, o que resulta em uma falha de build.

Problemas conhecidos

A biblioteca fundida é um novo plug-in, e há problemas conhecidos que estão sendo trabalhados para atender a todos os casos de uso.

  • Não é possível gerar arquivos JAR de origem
  • Adicionar dependências de arquivos em outros arquivos .aar
  • Não há suporte para fusão de artefatos RenderScript e Prefab

Entender as dependências de uma biblioteca combinada

A biblioteca combinada não tem fontes e usa efetivamente as bibliotecas do Android como única fonte. Por isso, é importante entender o que vem de onde. Para listar as dependências mescladas no artefato resultante e as dependências necessárias para criar o artefato, execute a tarefa gradle :report na biblioteca combinada. As tarefas geram um relatório JSON que é salvo no diretório build/reports da biblioteca combinada.

Para mais informações relacionadas a dependências internas do plug-in, execute a tarefa gradle :dependencies para conferir o estado das configurações do plug-in.