Biblioteca de arquivos do Android (aar) x jar padrão

131

Eu tenho lido alguns artigos sobre a nova adoção do Gradle como o sistema de compilação padrão para aplicativos Android. Bem, vindo do desenvolvimento padrão do Java, geralmente dependo de arquivos jar para construir meu projeto. No entanto, parece que o Android também possui pacotes aar , que são equivalentes aos arquivos DLL em um sistema operacional Windows, conforme mencionado aqui :

Primeiro, você deve perceber que a plataforma Android não permite “bibliotecas compartilhadas” no nível do aplicativo. Nas plataformas “tradicionais” da linguagem de programação, C, C ++, Java, você escolhe, temos esse mecanismo de compartilhamento de bibliotecas de tempo de execução. (Por exemplo, DLL no Windows, DSO no Unix, Jar na JVM, etc.). No Android, no entanto, você não pode fazer isso, a menos que seja o Google ou um fabricante de celulares (consulte a Nota de rodapé 1 abaixo). Como desenvolvedor de aplicativos, isso pode ser uma limitação fundamental. Os códigos de "compartilhamento" ou "reutilização", tanto no tempo de construção quanto no tempo de execução, são uma parte muito importante da prática de engenharia de software. Isso é bastante difícil (não impossível, apenas mais difícil) no Android por causa da limitação acima mencionada.

No entanto, tenho algumas dúvidas sobre esse conceito. Quero dizer, quando um desenvolvedor deve estar interessado, incluindo dependências aar em sua aplicação? Essas dependências foram reforçadas para alguma versão mínima do SDK?

Por exemplo, em um projeto, acesso uma porta COM, para a qual uso as bibliotecas .so pré-compiladas do NDK . Tenho que criar um aar se quiser compartilhar este utilitário?

Xtreme Biker
fonte

Respostas:

221

AARos arquivos são mais parecidos com Jars do que com Dlls pelo seguinte motivo:

Dlls podem ser compartilhados entre aplicativos nos quais AARs e jarros são empacotados com seu aplicativo.

AARs vs Jars:

A principal diferença entre a Jare a AARé que AARs incluem recursos como layouts, drawablesetc. Isso facilita muito a criação de componentes visuais independentes. Por exemplo, se você possui vários aplicativos que usam a mesma tela de login, com Jars você pode compartilhar classes, mas não o layout, estilos, etc., você ainda precisará duplicá-los. Com AARs tudo é empacotado em um único pacote.

Em conclusão, AARs são um grande passo na direção certa.

Nota:
Tentativas semelhantes foram feitas com apk-libs, mas agora estão obsoletas, pois AARs são muito melhores.

unificar
fonte
@unify. Existe alguma maneira de impedir que os arquivos aar ofusquem a biblioteca?
Abh22ishek
Estou confuso com esta resposta. A primeira citação em bloco diz que "os jarros e jarros são fornecidos com seu aplicativo", não "compartilhados entre aplicativos"; ainda a segunda cotação em bloco implica que os aars permitem compartilhar classes e outros recursos entre vários aplicativos?
Larsh
5
@ LarH Acho que significa que você pode compartilhar o código (arquivos aar) entre seus aplicativos, mas ele será incluído em cada pacote separadamente para permitir que os usuários instalem os aplicativos de forma independente. Se dois aplicativos estiverem instalados e os dois usarem o mesmo aar, o tempo de execução do Android poderá ser inteligente o suficiente para carregá-lo apenas uma vez.
Habib
1
Eu tenho um grande problema com arquivos AAR. Quero criar um arquivo AAR e entregá-lo a algum comerciante para ter soluções de pagamento com nossos negócios. e não quero que eles reflitam os alunos e não possam receber chamadas de métodos de seus aplicativos. Eu existe alguma maneira de proteger meu código da reflexão.
Mohammad moradyar 3/02
5
@ Mohammadmoradyar, você pode usar o Proguard em sua biblioteca para ofuscar suas classes, mas como em qualquer código de código baseado em Java, não há como impedir que as pessoas descompilem seu código.
unify
11

A declaração " A principal diferença entre um Jar e um AAR é que os AARs incluem recursos como layouts, drawables etc. " não corresponde à especificação do arquivo JAR e, portanto, não é uma verdade. De acordo com a especificação do arquivo JAR :

O arquivo JAR é um formato de arquivo baseado no popular formato de arquivo ZIP e é usado para agregar muitos arquivos em um. Um arquivo JAR é essencialmente um arquivo zip que contém um diretório META-INF opcional.

Como você pode ver, não há nenhuma limitação de conteúdo que proíba a inclusão de recursos como layouts, drawables etc. em um arquivo JAR. Para obter mais detalhes, consulte o artigo 5.3 "Criação e carregamento" da especificação da máquina virtual Java®.

Então, sobre a questão Android Archive Library (aar) vs jar padrão. A resposta depende de qual ferramenta de construção você está usando.

Se você estiver usando o Android Studio como uma ferramenta de criação (respectivamente como organizador do projeto), é melhor usar os arquivos * .aar para compartilhar recursos encapsulados entre projetos do Android. O formato de arquivo AAR faz parte da compilação do Android Studio e, como comentado nos outros comentários aqui, sua interface com o usuário suporta o formato aar para bibliotecas do Android.

Mas, exceto o Android Studio, o resto do mundo não sabe o que é esse arquivo aar (artefato). Por exemplo, se sua compilação do Android for baseada no Maven, o arquivo preferido para o compartilhamento de recursos será jar, porque esse é o artefato nativo do projeto java do Maven e não há limitação no que colocar no arquivo jar padrão. Além disso, existe uma maneira de explicar ao Maven qualquer formato de arquivo, incluindo aar usando o aprimoramento do ciclo de vida com um novo componente. Um exemplo simples está disponível aqui. Como crio um novo tipo de embalagem para o Maven?

ggghhhjjj
fonte
Eu diria então que a diferença é que o JAR deve ser uma maneira de compartilhar qualquer tipo de recurso no ecossistema java, enquanto o AAR é focado no Android e o força a um layout concreto .
Xtreme Biker
Acho que o autor da resposta escolhida (@unify) deve esclarecer isso.
Lfree
Não conheço o mundo Java maior, mas no mundo Android os arquivos jar não podem incluir recursos. Ou seja, mesmo que os recursos estavam no arquivo .jar, não seriam trazidos para o projeto que inclui-los: stackoverflow.com/q/2474904/211292
Thomasw
6

A citação na pergunta não tem nada em comum com a realidade atual. Obviamente, é possível usar bibliotecas externas no Android e existem muitas bibliotecas disponíveis. Talvez eles quisessem dizer que cada aplicativo deve agrupar todas as bibliotecas de que precisa, mas a reutilização da biblioteca no momento da construção (vinculação estática) não é realmente um problema.

.aardifere de .jarnão mais do que .jardifere de .zip. Tem certos conceitos em que tipo de conteúdo deve ser esperados lá, mas ambos .jare .aarna maioria das vezes contêm compilado classes e eles recursos. .aarapenas especifica que a biblioteca é específica para Android e tem alguma estrutura esperada, razoável para essas bibliotecas (bem, .jartambém tem alguma estrutura esperada).

A exibição de que .aar é suportada apenas pelo Android studio também está obsoleta. Essas bibliotecas podem ser implantadas no Maven Central, e ferramentas como gradle podem fazer referência a elas usando o sufixo @aar, por exemplo:

dependencies {
    compile ('io.github.andviane:uncover:2.0.1@aar')
    ..
}  

para fazer referência a essa implantação central do Maven.

Audrius Meskauskas
fonte