Em projetos com muitos módulos, pode ser difícil distribuir as bibliotecas do Android para os usuários e manter uma estrutura de projeto clara. Em muitos casos, muitas mais bibliotecas precisam ser publicadas do que o esperado.
O plug-in de biblioteca mesclada fornecido com o Plug-in do Android para Gradle ajuda a empacotar vários módulos de biblioteca Android em uma única biblioteca publicável. Isso permite modularizar o código-fonte e os recursos da biblioteca no build como achar melhor, evitando a exposição da estrutura do projeto após a distribuição.
A distribuição como uma única biblioteca pode ter os seguintes benefícios:
- Dependências simplificadas:substitui 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 da biblioteca reduzido:pode melhorar a redução de código, levando a AARs menores.
- Segurança aprimorada:oferece melhor controle sobre os detalhes de implementação interna das bibliotecas publicadas.
Criar uma biblioteca combinada
Para criar uma biblioteca combinada, você precisa 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 Android ao projeto:
Neste exemplo, o módulo de biblioteca mesclada será chamado de myFusedLibrary
.
- Ative o suporte à biblioteca mesclada adicionando
android.experimental.fusedLibrarySupport=true
ao arquivogradle.properties
. - Anexe
include(":myFusedLibrary")
ao arquivosettings.gradle.kts
. - Adicione
android-fusedlibrary = { id = "com.android.fused-library", version.ref = "agp" }
na seção[plugins]
do arquivogradle/libs.versions.toml
. - Adicione
alias(libs.plugins.android.fusedlibrary) apply false
no bloco de plug-ins no arquivobuild.gradle.kts
de nível superior. - Para criar o módulo
myFusedLibrary
, crie um novo diretório chamadomyFusedLibrary
(clique com o botão direito do mouse em "Meu aplicativo" > Novo > Diretório). - Crie um arquivo
build.gradle.kts
no módulomyFusedLibrary
(clique com o botão direito do mouse no módulomyFusedLibrary
> New > File). - 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 combinada é agrupar dependências. O
plug-in oferece suporte à adição de dependências de projeto local e bibliotecas externas.
Para especificar as dependências a serem 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 mesclada
Familiarize-se com a publicação de uma biblioteca do Android antes de publicar uma biblioteca mesclada. A publicação de uma biblioteca mesclada é semelhante à publicação de uma biblioteca Android. No entanto, há algumas diferenças importantes que você precisa considerar para publicar a biblioteca mesclada 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 do
fusedLibraryComponent
porque ele fornece as dependências necessárias para compilar o artefato de biblioteca mesclada.
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 mesclada para testes
É necessário testar dependendo de uma biblioteca combinada publicada de um app ou biblioteca Android. O método recomendado é publicar na biblioteca mesclada e as 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 mesclada
Para distribuir sua biblioteca mesclada, consulte Fazer o upload da biblioteca.
Comportamento e proteções
A combinação de bibliotecas do Android tem complexidades que podem dificultar a priorização do plug-in. Por exemplo, duas bibliotecas com o mesmo classpath vão causar uma falha de build ao mesclar a biblioteca. A mesclagem de recursos considerará a ordem das dependências especificadas ao selecionar um recurso com o mesmo nome em bibliotecas diferentes.
- As bibliotecas mescladas só podem ser publicadas como um artefato de biblioteca Android AAR para serem adicionadas como uma dependência.
- Não há suporte para a fusão de bibliotecas que usam a vinculação de dados.
- Não é possível mesclar vários tipos de build e variações de produto em uma única biblioteca mesclada. Crie bibliotecas mescladas separadas para variantes diferentes.
Para equilibrar a quantidade de configuração necessária e a facilidade de uso, o plug-in falhará na build em conflitos ambíguos ou usará heurísticas ao fundir artefatos. Os detalhes de como os artefatos são mesclados estão na tabela a seguir:
Tipo | Comportamento |
---|---|
Classes | Bibliotecas com o mesmo caminho de classe vão causar uma falha de build ao mesclar a biblioteca. |
Recursos para Android | A mesclagem de recursos vai considerar a ordem das dependências especificadas ao selecionar um recurso com o mesmo nome em diferentes. |
Metadados de AAR | As versões de metadados do AAR são mescladas priorizando o valor mais alto de cada biblioteca de dependência. Há um DSL fornecido para substituir esses valores. KotlinandroidFusedLibrary { aarMetadata { minCompileSdk = 21 minCompileSdkExtension = 1 } } |
Recursos Java | Não é permitido usar arquivos de recursos Java em várias bibliotecas com caminhos idênticos, o que resulta em uma falha de build. |
Problemas conhecidos
A Biblioteca Fused é um novo plug-in, e há problemas conhecidos que estão sendo trabalhados para atender a todos os casos de uso.
- Os arquivos
lint.jar
não são incluídos no AAR mesclados. - Como adicionar dependências de arquivo em outros arquivos .aar
- Não há suporte para a mesclagem de artefatos do RenderScript e do Prefab
Entender as dependências de uma biblioteca mesclada
A biblioteca mesclada não tem fontes e usa efetivamente as bibliotecas do Android
como única fonte. Por isso, é importante entender de onde vem cada coisa. 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 mesclada. As tarefas geram um relatório JSON que é salvo no
diretório build/reports
da biblioteca mesclada.
Para mais informações relacionadas a dependências internas de plug-ins, execute a
tarefa gradle :dependencies
para conferir o estado das configurações de plug-ins.