Créer une bibliothèque Android Jar pour la distribution

160

Je connais les projets de bibliothèque Android, qui vous permettent de créer un projet à source partagée qui peut être extrait dans les applications Android si nécessaire. Cependant, cela nécessite que la source soit disponible.

Je recherche un moyen de créer et de distribuer une bibliothèque à source fermée pouvant être utilisée dans d'autres projets Android comme un JAR traditionnel. Cela nécessitera l'utilisation du compilateur Android, ce n'est donc pas un fichier JAR vanilla-Java. FWIW, je n'ai pas besoin d'intégrer des ressources / mises en page dans le JAR.

J'ai vu http://andparcel.com/ mais cela ressemble à une solution de contournement, et je préférerais utiliser quelque chose «officiellement pris en charge» par Google. De plus, je dois m'assurer que le JAR que je construis est compatible avec l'ancienne / nouvelle version du SDK Android (c'est-à-dire que j'ai besoin d'un moyen de définir la version de la plate-forme cible, etc.).

Les derniers ensembles d'outils Android permettent-ils la création / la consommation de binaires JAR? Pouvez-vous citer de la documentation sur la façon dont je peux le faire?

psychotik
la source
avez-vous une réponse à votre question? J'ai une exigence similaire. Comment avez-vous créé des fichiers JAR?
Krishnabhadra
Pour distribuer un .jar pour Android, vous n'avez pas besoin du compilateur Android dx, le complément Java standard fonctionne. Si vous distribuez un fichier jar, il est converti en bytecode dx lors de la création de l'application.
ThomasW

Réponses:

49

Si vous créez un projet de bibliothèque Android sans avoir aucune ressource, l'ADT (d'abord remarqué dans r16) créera un .jar avec le même nom que le projet dans le dossier 'bin'.

Freddroid
la source
pls voir cette question stackoverflow.com/questions/12970802/…
vnshetty
1
Cela me permet d'obtenir le fichier jar, mais dois-je toujours distribuer le dossier de ressources? Essayer de jar up actionbar sherlock et mes projets ne se compileront pas car ils ne peuvent pas trouver les ressources de la barre d'action.
Nathan Schwermann
1
@schwiz cela ne fonctionne que pour les projets sans ressources (comme je le dis dans la réponse). Sinon, vous devez l'importer en tant que projet de bibliothèque Android standard.
Freddroid
1
Est-ce toujours vrai? Je ne vois pas myapp.jardans le /bindossier. Il y a classes.jar, mais ce n'est pas ça, non?
garbagecollector
J'exécute le dernier ADT et j'obtiens toujours un <nom du projet> .jar dans mon dossier / bin. Mais si votre projet dépend des ressources, ce n'est pas bon et le projet doit être inclus en tant que projet de bibliothèque (vous obtenez
quand
23

Android ne fournit pas de type spécial d'Android-JAR. Mais ce que vous pouvez faire, c'est ajouter un build.xml à votre projet et construire le JAR avec ant.

Mon build.xml ressemble à ceci:

<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>

Générez le JAR en l'exécutant ant jardans le dossier principal de vos projets.

white_gecko
la source
J'ai essayé et a pu créer un fichier JAR, mais la taille était étrange (seulement 343 octets), par rapport à l'exportation d'une bibliothèque vers JAR. Une idée sur les drapeaux manquants?
Shane Oliver
Vous pouvez vérifier le contenu du JAR avec un programme d'archivage (JAR est ZIP) et voir ce qui manque et les ajouter. Vous pouvez trouver plus d'informations ici: ant.apache.org/manual/Tasks/jar.html
white_gecko
5
Avec les derniers SDK Android, les fichiers Java sont compilés bin/classes, donc <jar destfile="MyAndroidLib.jar" basedir="bin/">devrait l'être<jar destfile="MyAndroidLib.jar" basedir="bin/classes/">
Theo
17

Vous pouvez créer un projet Java "normal" et importer à partir de là Android.jar. Ensuite, vous aurez accès à tous les composants du SDK. Ensuite, vous pouvez exporter votre projet sous forme de jar ... et le charger depuis votre application Android. Cela fonctionne très bien et cela semble être un moyen simple de le faire.

ferostar
la source
1
Dans ce cas, comment déclarer les composants de la bibliothèque comme les services, les activités, les récepteurs de diffusion, les filtres d'intention. L'application cliente doit-elle contenir toutes ces déclarations dans le manifeste?
Ron
@ferostar Comment puis-je importer android.jar dans un projet java?
Krishnabhadra
Dans le cas où cette bibliothèque a des ressources, comment générer un R.java et l'ajouter au JAR
15

il vous suffit d'aller dans les propriétés du projet dont vous voulez faire jar.Cliquez sur l'onglet Android. et cochez la bibliothèque Is. maintenant vous pouvez voir le fichier .jar dans le dossier bin. utilisez-le là où vous voulez l'utiliser.

Dhrupal
la source
2
Cela semble fonctionner si LibraryProject ne dispose pas de ressources. Une idée de comment le faire fonctionner avec des ressources?
Nathan Schwermann
C'est une mauvaise réponse cependant, si votre projet de bibliothèque dépend d'autres projets. Ces références ne seront pas reprises.
stevebot
10

La seule solution «officiellement prise en charge» par Google est le projet Bibliothèque, et il nécessite la distribution du code source. Vous pouvez créer un JAR de la manière habituelle, mais vous ne pouvez pas y inclure ni y référencer des ressources.

Malheureusement, je pense qu'il n'est pas non plus possible d'inclure un JAR packagé dans un projet de bibliothèque, comme moyen de contourner l'exigence de code source.

Jeff Gilfelt
la source
"Vous pouvez créer un JAR de la manière habituelle, mais vous ne pouvez pas y inclure ou y référencer des ressources." <- ne semble pas fonctionner correctement dans Eclipse si je référence des classes Android ou si j'utilise le compilateur Android. Des indices sur la façon de faire fonctionner cela?
psychotik
5
Je viens de créer un projet Java normal dans Eclipse, ajoutez le fichier android.jar au chemin de construction, puis sélectionnez Exporter - Java - Fichier Jar.
Jeff Gilfelt
@JeffGilfelt et si vous incluez le fichier android.jar pour le répertoire sdk android-13 dans l'exemple, pourrez-vous utiliser votre bibliothèque jar toujours dans des projets pour un niveau d'API plus élevé?
Fran Marzoa
10

Dans la dernière version d'Android Studio 1.2, la création de la bibliothèque JAR a été rendue aussi simple que pointer et cliquer.

Étapes à suivre :

  • Aller au fichier -> Nouveau -> Nouveau module entrez la description de l'image ici
  • Sélectionnez "Java Library" à la fin de la liste des options entrez la description de l'image ici
  • Entrez le nom de la bibliothèque jar et le nom de la classe et appuyez sur le bouton Terminer entrez la description de l'image ici
  • C'est tout !

L'étape suivante consiste à ajouter votre bibliothèque Jar en tant que dépendance dans votre application. Aussi simple que ça

  • Aller au fichier -> Structure du projet -> Sélectionnez 'app' -> Sélectionnez 'Dépendance'
  • Sélectionnez le '+' en bas -> Sélectionnez 'Dépendance du module' entrez la description de l'image ici
  • Sélectionnez votre module jar lib que vous venez de créer ci-dessus entrez la description de l'image ici entrez la description de l'image ici
  • Sélectionnez Ok et c'est tout!

.... Ou vous pouvez simplement ajouter la ligne ci-dessous à votre fichier de note d'application

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
 }

Google fait la promotion de l'archive Android (AAR), même si JAR pris en charge est ramené au studio Android.Pour découvrir la différence entre AAR et JAR, reportez - vous à ce lien

Nishant.
la source
Je ne comprends pas comment cela crée un nouveau fichier jar. Il semble que vous venez de créer un nouveau module qui sera utilisé comme bibliothèque dans votre projet Android
Jejefcgb
Quoi?! vous créez un nouveau pot à partir de rien?
Ewoks du
@Ewoks: après avoir créé le module, vous devez y ajouter les classes. Une fois cela fait, vous l'ajoutez en tant que dépendance
Nishant.
2
La question était: il existe une bibliothèque implémentée avec le code source. Comment en faire jar pour que jar soit utilisé dans un autre projet au lieu de tout le code source de la bibliothèque. Ou j'ai raté quelque chose?
Ewoks
2
@ Nishant. A travaillé pour moi! Merci!
ramires.cabral
6

Essayez ceci: cela fonctionne

1) Faites de votre projet de bibliothèque un projet normal en désélectionnant l'indicateur IsLibrary.

2) Exécutez votre projet en tant qu'application Android. (Il ne montrera aucune erreur)

3) vous trouverez un fichier .jar dans le dossier bin avec .apk.

4) Donnez-vous .jar qui souhaite utiliser votre bibliothèque.

5) Dites-leur de simplement importer le fichier jar externe dans le chemin de construction.

cela fonctionnera bien avec toutes les ressources. bonne chance.

Aayush Rana
la source
1
Je dois corriger ce message: les fichiers JAR ne peuvent contenir que du code, pas de ressources Android. Si des ressources sont incluses / nécessaires, nous devons garder le projet de bibliothèque ouvert et ne pouvons pas simplement utiliser un simple fichier JAR.
cody
@cody: Comment générer un fichier jar avec des ressources et l'utiliser dans un autre projet?
Mahantesh M Ambi
1

L'ADT crée un dossier bin qui contient tous les fichiers de classe pour tous les fichiers et répertoires source correspondants dans votre projet, vous pouvez utiliser la commande jar, créer une archive jar contenant ces fichiers et répertoires de classe et présumément votre bibliothèque, mais bien sûr le le niveau de plate-forme des fichiers de classe ne serait ciblé que pour le niveau actuel de la construction du projet - vous auriez besoin d'un fichier jar différent pour chaque niveau de plate-forme; Cependant, la grande chose à ce sujet est que le fichier R.class est inclus dans l'arborescence du répertoire du projet et que vous avez donc accès à ses ressources. Je ne sais pas si c'est la façon officielle de faire les choses dans Android, mais cela a fonctionné pour moi.

David Evans
la source
0

Dans notre projet, nous créons apk (en utilisant apkbuilder) qui est installé dans / system / framework et ajouté cet apk dans le classpath par défaut. Pour la compilation des applications utilisant le jar, nous créons un fichier jar (en utilisant jar c).

Remarque: nous n'avons aucune ressource dans la bibliothèque.

Karan
la source
0

.jar est juste un fichier .zip qui contient un fichier .class (vous pouvez essayer de changer l'extension de n'importe quel fichier .jar en .zip puis voir le résultat). Vous pouvez facilement créer n'importe quelle bibliothèque .jar pour n'importe quel but en compressant le fichier .class.

Renzokuken
la source
Ce n'est pas strictement vrai, voir en.wikipedia.org/wiki/JAR_(file_format) pour les différences subtiles (principalement l'ordre des entrées dans le ZIP)
iddo
0

Pas :

1) Ouvrez le fichier project.properties

2) Ajouter de la valeur android.library=true

3) Enregistrer le fichier

4) Dans le menu éclipse pour le projet, sélectionnez construire automatiquement puis sélectionnez nettoyer

Résultat: un tout nouveau pot est créé sous le bac .

Pana Technica
la source