Comment exporter une bibliothèque vers Jar dans Android Studio?

84

J'ai téléchargé des sources de bibliothèque et je souhaite l'exporter sous forme de fichier Jar à l'aide d'Android Studio. Existe-t-il un moyen d'exporter vers un fichier JAR en utilisant Android Studio?

Éditer:

La bibliothèque que je souhaite exporter en tant que jar est une bibliothèque Android. Il s'appelle "StandOut" et peut être téléchargé depuis GitHub. https://github.com/pingpongboss/StandOut

Sauge Pourpre
la source
Veuillez donner plus de détails sur la bibliothèque que vous souhaitez exporter
gamag
J'ai modifié ma question avec les détails de la bibliothèque Android.
Sage Pourpre

Réponses:

85

Il n'est pas possible d'exporter une bibliothèque Android sous forme de fichier jar. Il est cependant possible de l'exporter sous forme de aarfichier. Aarfichiers étant le nouveau format binaire pour les bibliothèques Android. Il y a des informations à leur sujet dans Google I / O, la vidéo New Build System .

Commencez par créer la bibliothèque dans Android Studio ou à partir de la ligne de commande issue gradle builddu répertoire racine de votre bibliothèque.

Cela entraînera un <yourlibroot>/libs/build/yourlib.aarfichier.

Ce fichier aar est une représentation binaire de votre bibliothèque et peut être ajouté à votre projet au lieu de la bibliothèque en tant que projet de dépendance.

Pour ajouter un fichier aar en tant que dépendance, vous devez le publier dans le maven central ou dans votre référentiel maven local, puis référencer le fichier aar dans le fichier de votre projet gradle.build.

Cependant, cette étape est un peu compliquée. J'ai trouvé une bonne explication sur la façon de procéder ici:

http://www.flexlabs.org/2013/06/using-local-aar-android-library-packages-in-gradle-builds

Alexandre Kulyakhtin
la source
2
avoir également une bibliothèque Android en fonction d'autres bibliothèques Android peut briser les choses.
Loïc Faure-Lacroix
Le dossier res sera-t-il inclus dans le fichier aar?
Bagusflyer
voir la réponse de @ Wallmart_Hobo ci-dessous, c'est possible et je peux confirmer que le pot exporté fonctionne bien dans un projet d'application Android éclipse.
Pellet
2
J'ai trouvé mon fichier aar inclus dans ce lien: lib \ build \ sorties \ aar
Simon
44

J'ai pu créer un code source de bibliothèque dans un .jarfichier compilé , en utilisant l'approche de cette solution: https://stackoverflow.com/a/19037807/1002054

Voici le détail de ce que j'ai fait:

1. Archiver le référentiel de la bibliothèque

En mai, c'était une bibliothèque Volley

2. Importez la bibliothèque dans Android Studio.

J'ai utilisé Android Studio 0.3.7. J'ai rencontré des problèmes au cours de cette étape, à savoir que j'ai dû copier le gradledossier d'un nouveau projet Android avant de pouvoir importer le code source de la bibliothèque Volley, cela peut varier en fonction du code source que vous utilisez.

3. Modifiez votre build.gradlefichier

// If your module is a library project, this is needed
//to properly recognize 'android-library' plugin
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.6.3'
    }
}

apply plugin: 'android-library'

android {
    compileSdkVersion 17
    buildToolsVersion = 17

    sourceSets {
        main  {
            // Here is the path to your source code
            java {
                srcDir 'src'
            }
        }
    }
}

// This is the actual solution, as in https://stackoverflow.com/a/19037807/1002054
task clearJar(type: Delete) {
    delete 'build/libs/myCompiledLibrary.jar'
}

task makeJar(type: Copy) {
    from('build/bundles/release/')
    into('build/libs/')
    include('classes.jar')
    rename ('classes.jar', 'myCompiledLibrary.jar')
}

makeJar.dependsOn(clearJar, build)

4. Exécutez la gradlew makeJarcommande à partir de la racine de votre projet.

Dans mon cas, je devais copier gradlew.batet les gradlefichiers du nouveau projet Android dans la racine de mon projet de bibliothèque. Vous devriez trouver votre fichier de bibliothèque compilé myCompiledLibrary.jardans le build\libsrépertoire.

J'espère que quelqu'un trouvera cela utile.

Éditer:

Caveat

Bien que cela fonctionne, vous rencontrerez une exception de bibliothèque en double lors de la compilation d'un projet avec plusieurs modules, où plus d'un module (y compris le module d'application) dépend du même jarfichier (par exemple, les modules ont leur propre répertoire de bibliothèque, qui est référencé dans build.gradleun module donné) .

Au cas où vous auriez besoin d'utiliser une seule bibliothèque dans plus d'un module, je recommanderais d'utiliser cette approche: Android gradle build et la bibliothèque de support

7hny
la source
J'ai trouvé qu'il n'y avait aucun moyen d'inclure les res à l'intérieur du pot. Est-ce possible?
Bagusflyer
7
Dans les versions récentes d'Android studio nécessite un changement: la ligne doit lire `from ('build / intermediates / bundles / release /')`
Greg Ennis
@GregEnnis ya, mais dans mon cas, il crée un pot avec mon nom de mobule et le pot réel se trouve à l'intérieur de ce pot. J'ai extrait le fichier jar créé avec mon nom de module comme nom_module.jar.
pyus13
6
@bagusflyer, Si vous voulez un resdossier, un fichier AAR est exactement cela - un fichier JAR avec resprise en charge de dossier.
Martin Konecny
comment appliquer proguard pour générer ce pot?
Amrut Bidri
37

Depuis Android Studio V1.0, le fichier jar est disponible dans le lien de projet suivant:

debug ver: "votre_app" \ build \ intermediates \ bundles \ debug \ classes.jar

version ver: "votre_app" \ build \ intermediates \ bundles \ release \ classes.jar

Le fichier JAR est créé sur la procédure de construction, dans l'interface graphique d'Android Studio, c'est à partir de Build-> Make Project et à partir de la ligne CMD, c'est "gradlew build".

Avi Levin
la source
3
tu recevras tous mes internets pour cette réponse
m02ph3u5
1
Trouvé, dans Build Variants, nous devons choisir Build Variant pour être «release». Mais maintenant, le class.jar n'est pas présent dans le dossier release!
Aparajith Sairam
1
@AparajithSairam Comment avez-vous construit votre JAR, votre ligne de commande ou votre interface graphique?
Avi Levin
1
@AparajithSairam, j'ai trouvé quelque chose dans l'interface graphique, mais cela n'est pertinent que pour les versions de fichiers APK. après avoir sélectionné la variante de construction appropriée, appuyez sur l'icône verte "play". il exécutera une commande gradle d'assemblage d'arrière-plan qui créera le fichier. Pour un fichier JAR dans CMD, vous devrez exécuter gradlew assembleDebug ou Release ou quelle que soit la saveur que vous avez. Après cela, le JAR serait disponible à l'emplacement suivant: your_app "\ build \ intermediates \ bundles \" falvor "\ classes.jar vous pouvez voir toutes vos commandes d'assemblage en utilisant" gradlew tasks "
Avi Levin
1
J'ai voté pour une autre réponse il y a plus d'un an. Vissez cette affaire. C'est du gâteau! Merci!!
Kevin
31

Incluez les éléments suivants dans build.gradle:

android.libraryVariants.all { variant ->
    task("generate${variant.name}Javadoc", type: Javadoc) {
        description "Generates Javadoc for $variant.name."
        source = variant.javaCompile.source
        ext.androidJar = "${android.plugin.sdkDirectory}/platforms/${android.compileSdkVersion}/android.jar"
        classpath = files(variant.javaCompile.classpath.files) + files(ext.androidJar)
    }

    task("javadoc${variant.name}", type: Jar) {
        classifier = "javadoc"
        description "Bundles Javadoc into a JAR file for $variant.name."
        from tasks["generate${variant.name}Javadoc"]

    }

    task("jar${variant.name}", type: Jar) {
        description "Bundles compiled .class files into a JAR file for $variant.name."
        dependsOn variant.javaCompile
        from variant.javaCompile.destinationDir
        exclude '**/R.class', '**/R$*.class', '**/R.html', '**/R.*.html'
    }
}

Vous pouvez ensuite exécuter gradle avec: ./gradlew clean javadocRelease jarReleasequi vous construira votre Jar et également un jar javadoc dans le build/libs/dossier.

EDIT: Avec les outils Android Gradle 1.10. + Obtenir le répertoire du SDK Android est différent qu'avant. Vous devez modifier ce qui suit (merci Vishal!):

android.sdkDirectory 

au lieu de

android.plugin.sdkDirectory
Andrey
la source
Excellente réponse, cela a parfaitement fonctionné pour moi. Vous pouvez également ajouter une cible gradle dans Android Studio pour exécuter la tâche jarDebug qui créera le fichier jar utilisable (j'ai testé cela dans un projet eclipse et cela fonctionne également très bien).
Pellet
8
Pourquoi le "nouveau" système de construction Android le rend-il aussi laid :(.
Martin Konecny
Jusqu'à présent, c'est la seule réponse qui a fonctionné. Merci beaucoup @Walmart_Hobo
Drew
Excellente solution pour générer un fichier JAR! Est-il possible d'inclure également les ressources?
Gaëtan
12

J'ai pu exporter un fichier jar dans Android Studio à l'aide de ce tutoriel: https://www.youtube.com/watch?v=1i4I-Nph-Cw "Comment exporter un fichier Jar à partir d'Android Studio"

J'ai mis à jour ma réponse pour inclure toutes les étapes d'exportation d'un JAR dans Android Studio:

1) Créez un projet d'application Android, accédez à app-> build.gradle

2) Modifiez les éléments suivants dans ce fichier:

  • modifier appliquer le plugin: 'com.android.application' pour appliquer le plugin: 'com.android.library'

  • supprimez les éléments suivants: applicationId, versionCode et versionName

  • Ajoutez le code suivant:

// Task to delete old jar
task deleteOldJar(type: Delete){
   delete 'release/AndroidPlugin2.jar'
}
// task to export contents as jar
task exportJar(type: Copy) {
    from ('build/intermediates/bundles/release/')
    into ('release/')
    include ('classes.jar')
    rename('classes.jar', 'AndroidPlugin2.jar')
}
exportJar.dependsOn(deleteOldJar, build)

3) N'oubliez pas de cliquer sur synchroniser maintenant dans ce fichier (en haut à droite ou utilisez le bouton de synchronisation).

4) Cliquez sur l'onglet Gradle (généralement au milieu à droite) et faites défiler vers le bas jusqu'à exportjar

5) Une fois que vous voyez le message de construction réussie dans la fenêtre d'exécution, à l'aide de l'explorateur de fichiers normal, accédez au fichier jar exporté en utilisant le chemin: C: \ Users \ name \ AndroidStudioProjects \ ProjectName \ app \ release, vous devriez voir dans ce répertoire votre fichier jar.

Bonne chance :)

RMDev
la source
1
L'étape 2 est essentielle. Personne d'autre ne le mentionne. Merci, cela a fonctionné pour moi!
pookie le
9

Voici encore une autre réponse légèrement différente avec quelques améliorations.

Ce code sort le .jar du .aar. Personnellement, cela me donne un peu plus confiance que les bits expédiés via .jar sont les mêmes que ceux expédiés via .aar. Cela signifie également que si vous utilisez ProGuard, le fichier jar de sortie sera obscurci comme vous le souhaitez.

J'ai également ajouté une tâche super "makeJar", qui crée des fichiers JAR pour toutes les variantes de construction.

task(makeJar) << {
    // Empty. We'll add dependencies for this task below
}

// Generate jar creation tasks for all build variants
android.libraryVariants.all { variant ->
    String taskName = "makeJar${variant.name.capitalize()}"

    // Create a jar by extracting it from the assembled .aar
    // This ensures that products distributed via .aar and .jar exactly the same bits
    task (taskName, type: Copy) {
        String archiveName = "${project.name}-${variant.name}"
        String outputDir = "${buildDir.getPath()}/outputs"

        dependsOn "assemble${variant.name.capitalize()}"
        from(zipTree("${outputDir}/aar/${archiveName}.aar"))
        into("${outputDir}/jar/")
        include('classes.jar')
        rename ('classes.jar', "${archiveName}-${variant.mergedFlavor.versionName}.jar")
    }

    makeJar.dependsOn tasks[taskName]
}

Pour le lecteur curieux, j'ai eu du mal à déterminer les variables et les paramètres corrects que le plugin com.android.library utilise pour nommer les fichiers .aar. Je les ai finalement trouvés dans le projet Open Source Android ici .

David
la source
4

Nous pouvons exporter un fichier jar pour un projet de bibliothèque Android sans fichiers de ressources par le studio Android. C'est aussi l'exigence de ce que j'ai rencontré récemment.

1. Configurez votre fichier build.gradle

    // Task to delete old jar

    task clearJar(type: Delete){
       delete 'release/lunademo.jar'
    }

    // task to export contents as jar
    task makeJar(type: Copy) {
       from ('build/intermediates/bundles/release/')
       into ('build/libs/')
       include ('classes.jar')
       rename('classes.jar', 'lunademo.jar')
    }
    makeJar.dependsOn(clearJar, build)

2. Exécutez gradlew makeJar sous la racine de votre projet

Vous verrez vos bibliothèques sous dir comme build / libs / si vous êtes heureusement.

=================================================== ==========

Si vous rencontrez un problème en tant qu '«exception de délai d'expiration du socket» sur la ligne de commande comme ci-dessous,

entrez la description de l'image ici

Vous pouvez suivre ces étapes pour ouvrir la fenêtre Gradle dans la partie droite et cliquer sur "makeJar" sur le studio Android comme ceci,

entrez la description de l'image ici

entrez la description de l'image ici

Ensuite, allez dans le répertoire build / libs, vous verrez votre fichier jar.

J'espère que cela vous sera utile.

Bonne chance @.@

Luna

Luna Kong
la source