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
.
- Adicione
android.experimental.fusedLibrarySupport=true
ao arquivogradle.properties
para ativar o suporte à biblioteca unificada. - 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 plugins 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 em "My Application" > New > Directory). - Crie um arquivo
build.gradle.kts
no módulomyFusedLibrary
(clique com o botão direito do mouse no módulomyFusedLibrary
> Novo > Arquivo). - 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. KotlinandroidFusedLibrary { 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.