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

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.

  1. Ative o suporte à biblioteca mesclada adicionando android.experimental.fusedLibrarySupport=true ao arquivo gradle.properties.
  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 de plug-ins 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 do mouse em "Meu aplicativo" > Novo > Diretório).
  6. Crie um arquivo build.gradle.kts no módulo myFusedLibrary (clique com o botão direito do mouse no módulo myFusedLibrary > New > File).
  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 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.

Kotlin

 androidFusedLibrary { 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.