Crie uma biblioteca Jar Android para distribuição

160

Conheço os projetos da Biblioteca Android, que permitem criar um projeto de fonte compartilhada que pode ser puxado para os aplicativos Android, conforme necessário. No entanto, isso requer que a fonte esteja disponível.

Estou procurando uma maneira de criar e distribuir uma biblioteca de código fechado que possa ser usada em outros projetos do Android, como um JAR tradicional. Isso exigirá o uso do compilador Android, portanto, não é um arquivo JAR vanilla-Java. FWIW, não preciso incorporar recursos / layouts no JAR.

Já vi http://andparcel.com/, mas parece uma solução alternativa e prefiro usar algo 'oficialmente suportado' pelo Google. Além disso, preciso garantir que o JAR que construo seja compatível com a versão antiga / nova do SDK do Android (ou seja, preciso de uma maneira de definir a versão da plataforma de destino, etc.).

Os conjuntos de ferramentas mais recentes do Android permitem a criação / consumo de binários JAR? Você pode apontar para alguma documentação sobre como eu posso fazer isso?

psychotik
fonte
você tem resposta para sua pergunta? Eu tenho um requisito semelhante. Como você criou arquivos jar?
Krishnabhadra
Para distribuir um .jar para Android, você não precisa do compilador Android dx, o complacente Java comum funciona. Se você distribuir um jar, ele será convertido em bytecode dx quando o aplicativo for criado.
Thomasw

Respostas:

49

Se você criar um projeto da Biblioteca Android sem recursos, o ADT (observado pela primeira vez na r16) criará um .jar com o mesmo nome que o projeto na pasta 'bin'.

Freddroid
fonte
pls ver esta questão stackoverflow.com/questions/12970802/...
vnshetty
1
Isso me chama a atenção, mas ainda preciso distribuir a pasta de recursos? Tentando exibir o sherlock da barra de ação e meus projetos não serão compilados porque não conseguem encontrar os recursos da barra de ação.
Nathan Schwermann
1
@schwiz isso funciona apenas para projetos que não são de recursos (como afirmo na resposta). Caso contrário, você precisará importá-lo como um projeto padrão da Biblioteca Android.
Freddroid
1
Isso ainda é verdade? Não vejo myapp.jarna /binpasta. Existe classes.jar, mas não é isso, certo?
Garbagecollector
Estou executando o ADT mais recente e ainda recebo um <nome do projeto> .jar na minha pasta / bin. Mas se o seu projeto depende de recursos não é bom e a necessidade de projeto para ser incluído como um projeto de biblioteca (você ainda obter um embora .jar.
Freddroid
23

O Android não fornece um tipo especial de Android-JAR. Mas o que você pode fazer é adicionar um build.xml ao seu projeto e construir o JAR com ant.

Meu build.xml fica assim:

<project name="MyAndroidLib" default="dist" basedir=".">
  <description>
This is my Android lib
  </description>
  <!-- set global properties for this build -->
  <property name="src" location="src" />
  <property name="bin" location="bin" />

  <target name="jar">
    <jar destfile="MyAndroidLib.jar" basedir="bin/classes/">
      <!-- replace 'com' by what ever you are using -->
      <!-- as first part of the package name -->
      <!-- e.g. de, org, ... -->
      <!-- the ** is important to include the directory recursively -->
      <include name="com/**" />
    </jar>
  </target>
</project>

Crie o JAR executando ant jarna pasta principal do seu projeto.

white_gecko
fonte
Tentei isso e conseguiu criar um arquivo JAR, mas o tamanho era ímpar (apenas 343 bytes), em comparação com a exportação de uma biblioteca para o JAR. Alguma idéia de quais bandeiras estão faltando?
Shane Oliver
Você pode verificar o conteúdo do JAR com um programa de archive (JAR é ZIP) e ver o que está faltando e adicioná-los. Você pode encontrar mais informações aqui: ant.apache.org/manual/Tasks/jar.html
white_gecko
5
Com os mais recentes SDKs para Android, os arquivos Java são compilados para bin/classes, assim que <jar destfile="MyAndroidLib.jar" basedir="bin/">deve ser<jar destfile="MyAndroidLib.jar" basedir="bin/classes/">
Theo
17

Você pode criar um projeto Java "regular" e importar de lá o Android.jar. Então, você terá acesso a todos os componentes no SDK. Em seguida, você pode exportar seu projeto como jar ... e carregá-lo no seu aplicativo Android. Isso funciona muito bem e parece uma maneira simples de fazê-lo.

ferostar
fonte
1
Nesse caso, como declarar os componentes da biblioteca como serviços, atividades, receptores de emissoras, intentfilters. O aplicativo cliente precisa manter todas essas declarações em manifesto?
Ron
@ferostar Como posso importar android.jar para o projeto java?
Krishnabhadra
No caso de que a biblioteca tem recursos, como gerar um R.java e adicioná-lo à JAR
15

basta ir às propriedades do projeto que você deseja criar jar.Clique na guia Android. e marque na biblioteca É. agora você pode ver o arquivo .jar na pasta bin. use-o onde deseja usar.

Dhrupal
fonte
2
Isso parece funcionar se o LibraryProject não tiver recursos. Alguma idéia de como fazê-lo funcionar com recursos?
Nathan Schwermann
Essa é uma resposta ruim, se o seu projeto de biblioteca depende de outros projetos. Essas referências não serão apanhadas.
24515 stevebot
10

A única solução 'oficialmente suportada' pelo Google é o projeto Biblioteca, e exige que o código fonte seja distribuído. Você pode criar um JAR da maneira normal, mas não pode incluir ou referenciar recursos nele.

Infelizmente, acho que também não é possível incluir um JAR empacotado em um projeto da Biblioteca, como forma de contornar o requisito do código-fonte.

Jeff Gilfelt
fonte
"Você pode criar um JAR da maneira normal, mas não pode incluir ou referenciar recursos nele." <- não parece funcionar corretamente no Eclipse se eu fizer referência a classes Android ou usar o compilador Android. Pistas sobre como fazer isso funcionar?
21811 psychotik
5
Acabei de criar um projeto Java normal no Eclipse, adicionei o android.jar ao caminho de construção e selecione Exportar - Java - Jar File.
91111 Jeff Gilfelt
@JeffGilfelt e se você incluir o android.jar no diretório android-13 sdk no exemplo, será capaz de usar sua biblioteca jar ainda em projetos para um nível de API mais alto?
Fran Marzoa 31/10/12
10

Na versão mais recente do Android Studio 1.2, a criação da biblioteca JAR foi tão simples quanto apontar e clicar.

Passos a seguir:

  • Ir para Arquivo -> Novo -> Novo Módulo insira a descrição da imagem aqui
  • Selecione "Java Library" no final da lista de opções insira a descrição da imagem aqui
  • Digite o nome do jar lib e o nome da classe nele e pressione o botão Concluir insira a descrição da imagem aqui
  • É isso aí !

A próxima etapa é adicionar sua Biblioteca Jar como dependência no seu aplicativo. Simples como isso

  • Saltar Arquivo -> Estrutura do Projeto -> Selecionar 'app' -> Selecionar 'Dependency'
  • Selecione o '+' na parte inferior -> selecione 'Dependência do módulo' insira a descrição da imagem aqui
  • Selecione seu módulo jar lib que você acabou de criar acima insira a descrição da imagem aqui insira a descrição da imagem aqui
  • Selecione Ok e pronto!

.... Ou você pode simplesmente adicionar a linha abaixo ao seu arquivo de classificação do aplicativo

dependencies {
      compile fileTree(dir: 'libs', include: ['*.jar']) // Default Gradle Task, should be already present
      compile 'com.android.support:appcompat-v7:21.0.3' // Default Gradle Task, should be already present

      compile project(':nameOfYourJarLibraryModule') // This is your jar library module
 }

O Google está promovendo o Android Archive (AAR), embora o JAR suportado seja trazido de volta ao android studio.Para descobrir a diferença entre o AAR e o JAR, consulte este link

Nishant.
fonte
Não entendo como isso cria um novo arquivo jar. Parece que você está criando juste um novo módulo que será usado como uma biblioteca no seu projeto Android
Jejefcgb
O que?! você cria um novo frasco do nada?
Ewoks
@ Ewoks: depois de criar o módulo, você deve adicionar as classes a ele. Uma vez feito, você o adiciona como uma dependência
Nishant.
2
A pergunta era: existe uma biblioteca implenentada com código fonte. Como fazer o jar dele, para que apenas o jar seja usado em outro projeto, em vez de todo o código-fonte da biblioteca. Ou perdi alguma coisa?
Ewoks
2
@Nishant. Trabalhou para mim! Obrigado!
precisa saber é o seguinte
6

Tente isto: Isso funciona

1) torne seu projeto de biblioteca um projeto normal, desmarcando o sinalizador IsLibrary.

2) Execute seu projeto como aplicativo Android. (Não mostrará nenhum erro)

3) você encontrará um arquivo .jar na pasta bin junto com .apk.

4) Dê a você .jar que deseja usar sua biblioteca.

5) Diga a eles para importar apenas o jar externo para o caminho da compilação.

isso funcionará bem com todos os recursos. boa sorte.

Aayush Rana
fonte
1
Eu tenho que corrigir este post: arquivos JAR podem conter apenas código, sem recursos do Android. Se algum recurso for incluído / necessário, temos que manter o projeto da biblioteca aberto e não podemos simplesmente usar um arquivo JAR simples.
usar o seguinte
@ody: Como podemos gerar arquivos jar junto com os recursos e usá-los em outro projeto?
Mahantesh M Ambi
1

O ADT cria uma pasta bin que contém todos os arquivos de classe para todos os arquivos e diretórios de origem correspondentes em seu projeto. Você pode usar o comando jar, criar um arquivo jar contendo esses arquivos e diretórios de classe e presumir sua biblioteca, mas é claro que o nível da plataforma dos arquivos de classe seria direcionado apenas para o nível atual da construção do projeto - você precisaria de um arquivo jar diferente para cada nível da plataforma; No entanto, o melhor disso é que o arquivo R.class é incluído na árvore de diretórios do projeto e, portanto, você tem acesso a seus recursos. Não sei se essa é a maneira oficial de fazer as coisas no android, mas funcionou para mim.

David Evans
fonte
0

Em nosso projeto, estamos criando um apk (usando apkbuilder) instalado em / system / framework e adicionado este apk no caminho de classe padrão. Para a compilação de aplicativos usando o jar, estamos criando um arquivo jar (usando o jar c).

Nota: Não temos nenhum recurso na biblioteca.

Karan
fonte
0

.jar é apenas um arquivo .zip que contém o arquivo .class (você pode tentar alterar a extensão de qualquer arquivo .jar para .zip e ver o resultado). Facilmente, você pode criar qualquer biblioteca .jar para qualquer finalidade, compactando o arquivo .class.

Renzokuken
fonte
Não estritamente verdadeiro, consulte en.wikipedia.org/wiki/JAR_(file_format) para diferenças sutis (principalmente ordenação de entradas dentro do ZIP)
Ido
0

Passos :

1) Abra o arquivo project.properties

2) Agregar valor android.library=true

3) Salvar arquivo

4) No menu eclipse do projeto, selecione construir automaticamente e selecione limpar

Resultado: um frasco novo é criado na lixeira .

Pana Technica
fonte