Comment créer un projet de bibliothèque dans Android Studio et un projet d'application qui utilise le projet de bibliothèque

164

Je suis nouveau sur le système de construction gradle et IntelliJ.

Alors, comment créer un projet de bibliothèque Android (par exemple com.myapp.lib1) et le projet d'application (par exemple com.myapp.app) et faire en sorte que le système de construction inclue com.myapp.lib1 sur le projet d'application?

Je suis allé dans la structure du projet -> Modules -> Mon projet d'application et j'ai ajouté une dépendance au projet lib. IntelliJ peut maintenant reconnaître les classes du projet lib lorsqu'il est utilisé dans le projet d'application, mais lorsque j'exécute le projet d'application, il y a des erreurs comme:

Gradle: error: package com.myapp.lib1 does not exist
Randy Sugianto 'Yuku'
la source
1
J'utilisais des bibliothèques Android pour créer des versions gratuites / payantes de mon application. Le nouveau système de build Gradle rend cette approche obsolète avec le concept Build Variants. Vous pouvez désormais créer automatiquement différents APK signés à partir du même code. J'aurais aimé le savoir plus tôt.
theczechsensation
1
@ theczechsensation - pouvez-vous élaborer? Après avoir téléchargé l'APK pour la version complète, j'ai essayé de télécharger l'APK pour la version gratuite, mais en utilisant le même nom de package. Google Play Store (GPS) m'a envoyé un message disant que j'avais déjà utilisé ce nom de package. Ce que vous dites à propos de gradle signifie-t-il que je n'ai pas besoin de deux applications distinctes dans deux packages distincts?
DSlomer64
Voici la réponse parfaite stackoverflow.com/a/31366602/1118772 . Aqib Mumtaz a mentionné dans les réponses, mais c'est enfin le cas. Au lieu de perdre du temps sur d'autres moyens, vous pouvez y aller. philosophicalhacker.com/2014/10/02/…
Noundla Sandeep
Fil intéressant ajoutant des bibliothèques. Avec une explication illustrée.
Harish

Réponses:

111

Pour créer une bibliothèque:

Fichier> Nouveau module

sélectionnez la bibliothèque Android

Lib

Pour utiliser la bibliothèque, ajoutez-la en tant que dépendance:

Fichier> Structure du projet> Modules> Dépendances

dep

Ajoutez ensuite le module (bibliothèque Android) en tant que dépendance de module.

ajouter un module

Exécutez votre projet. Il va travailler.

Blundell
la source
194
Cela crée les fichiers du module dans le projet. Que faire si vous souhaitez que le module soit externe au projet afin qu'il puisse être utilisé avec une autre application?
rrbrambley
2
@rrbrambley: J'ai trouvé un moyen de réutiliser un module dans plusieurs projets. J'ai créé des liens de dossier (NTFS Junction) à l'aide d'une application appelée lien winbolic pour Windows. Lorsque j'ai un module que je souhaite réutiliser dans plusieurs projets, je crée un lien de dossier vers le projet à réutiliser dans le répertoire de chaque projet dans lequel l'utiliser. Après cela, j'ajoute la dépendance du module (dans Andr. Studio). Maintenant, je peux utiliser / modifier le module dans chaque projet tout en gardant est synchronisé. Je ne sais pas si c'est la bonne voie à suivre, mais pour l'instant cela semble fonctionner plutôt bien! Cela fonctionne mieux qu'un repo maven local.
Peter
1
Malheureusement, à partir de juillet 2014, il n'y a plus de paramètres de projet comme celui affiché dans la screenie. J'ai dû aller éditer les fichiers .grade comme dans la réponse de GrkEngineer ci-dessous.
Tim Bray
24
Cela devrait être voté à la baisse car cela crée un module à partir d'un projet existant
Jonathan
2
Si vous souhaitez utiliser la même bibliothèque dans d'autres projets, vous devez copier le module de bibliothèque dans ce projet et configurer manuellement settings.gradle et build.gradle du module principal.
hanoo
114

Je me demande pourquoi il n'y a pas d'exemple de projet de pot autonome.

Dans eclipse, nous cochons simplement la case "Is Library" dans la boîte de dialogue de paramétrage du projet.
Dans le studio Android, j'ai suivi ces étapes et j'ai obtenu un fichier jar.

  1. Créez un projet.

  2. ouvrir le fichier dans le menu de projet de gauche. (app / build.gradle): Scripts Gradle> build.gradle (Module: XXX)

  3. changer une ligne: apply plugin: 'com.android.application'->'apply plugin: com.android.library'

  4. supprimez applicationId dans le fichier: applicationId "com.mycompany.testproject"

  5. projet de construction: Build> Rebuild Project

  6. alors vous pouvez obtenir le fichier aar: app> build> sorties> dossier aar

  7. changer aarle nom de l'extension de fichier enzip

  8. décompressez, et vous pouvez voir classes.jardans le dossier. renommez-le et utilisez-le!

Quoi qu'il en soit, je ne sais pas pourquoi Google rend la création de pots si compliquée dans Android Studio.

Jinbom Heo
la source
1
Fonctionne pour moi sur Android Studio 2.2.2 déc. 2016.
Herman
95

La méthode recommandée par Google Gradle Plugin pour configurer vos fichiers gradle pour créer plusieurs projets présente des lacunes Si vous avez plusieurs projets en fonction d'un projet de bibliothèque, cet article explique brièvement la configuration recommandée par Google, ses lacunes et recommande une autre façon de configurer vos fichiers gradle pour prendre en charge les configurations multi-projets dans Android Studio:

Une configuration alternative multiprojet pour Android Studio

Une manière différente:

Il s'avère qu'il existe un meilleur moyen de gérer plusieurs projets dans Android Studio. L'astuce consiste à créer des projets Android Studio séparés pour vos bibliothèques et à indiquer à Gradle que le module de la bibliothèque dont dépend votre application se trouve dans le répertoire de projet de la bibliothèque. Si vous souhaitez utiliser cette méthode avec la structure de projet que j'ai décrite ci-dessus, procédez comme suit:

  1. Créer un projet Android Studio pour la bibliothèque StickyListHeaders
  2. Créer un projet Android Studio pour App2
  3. Créer un projet Android Studio pour App1
  4. Configurez App1 et App2 pour créer les modules dans le projet StickyListHeaders.

La 4ème étape est la partie difficile, c'est donc la seule étape que je vais décrire en détail. Vous pouvez référencer des modules externes au répertoire de votre projet en ajoutant une instruction de projet dans votre fichier settings.gradle et en définissant la propriété projectDir sur l'objet ProjectDescriptor renvoyé par cette instruction de projet:

entrez la description de l'image ici

Le code à insérer settings.gradle:

include ':library1'
project(':library1').projectDir = new File('../StickyListHeader/library1')

Si vous avez fait cela correctement, vous remarquerez que les modules référencés par votre projet apparaîtront dans le navigateur de projet, même si ces modules sont externes au répertoire du projet:

entrez la description de l'image ici

Cela vous permet de travailler simultanément sur le code de la bibliothèque et le code de l'application. L'intégration du contrôle de version fonctionne également très bien lorsque vous référencez des modules en externe de cette façon. Vous pouvez valider et pousser vos modifications dans le code de la bibliothèque, tout comme vous pouvez valider et pousser les modifications dans le code de votre application.

Cette façon de mettre en place plusieurs projets évite les difficultés qui pèsent sur la configuration recommandée par Google. Parce que nous référençons un module qui se trouve en dehors du répertoire du projet, nous n'avons pas à faire de copies supplémentaires du module de bibliothèque pour chaque application qui en dépend et nous pouvons versionner nos bibliothèques sans aucune sorte d'absurdité de sous-module git.

Malheureusement, cette autre façon de mettre en place plusieurs projets est très difficile à trouver. De toute évidence, ce n'est pas quelque chose que vous comprendrez en consultant le guide de Google, et à ce stade, il n'y a aucun moyen de configurer vos projets de cette manière en utilisant l'interface utilisateur d'Android Studio.

Aqib Mumtaz
la source
4
C'est la réponse parfaite. Merci.
Noundla Sandeep
1
Bonne réponse, mais vous devriez copier les éléments pertinents du message dans votre réponse au cas où le lien se romprait.
Greyson Parrelli
2
REMARQUE: pour l'évaluation de la chaîne dans gradle, vous devez utiliser des guillemets doubles ("). Ceci" sauve la journée "pour moi. Lié à ceci
Solata
1
Comment référencer le code de la bibliothèque à partir du code de l'application? Après avoir suivi vos instructions de configuration, le code de l'application ne peut toujours pas faire référence à un package dans le code de la bibliothèque. Y a-t-il une étape supplémentaire à faire?
CEGRD
2
@CEGRD Vous devez aller dans Fichier> Structure du projet et cliquer sur le nom du module sur lequel vous travaillez. Allez ensuite dans l'onglet dépendances> cliquez sur le '+' puis sur 'Dépendance du module' dans le menu déroulant. Vous devriez alors pouvoir ajouter le module library1 à votre projet actuel.
OliasailO
45

Consultez ce lien sur les configurations multi-projets .

Certaines choses à souligner, assurez-vous que votre settings.gradle est mis à jour pour référencer à la fois les modules de l'application et de la bibliothèque.

settings.gradle: include ':app', ':libraries:lib1', ':libraries:lib2'

Assurez-vous également que le build.gradle de l'application a le suivant:

dependencies {
     compile project(':libraries:lib1')
}

Vous devriez avoir la structure suivante:

 MyProject/
  | settings.gradle
  + app/
    | build.gradle
  + libraries/
    + lib1/
       | build.gradle
    + lib2/
       | build.gradle

Le build.gradle de l'application doit utiliser le com.android.applicationplugin tandis que le build.gradle de toute bibliothèque doit utiliser lecom.android.library plugin.

L'IDE Android Studio doit se mettre à jour si vous pouvez créer à partir de la ligne de commande avec cette configuration.

GrkEngineer
la source
Le plugin défini dans build.gradle est-il la seule différence? ie Pouvez-vous changer un module existant dans une bibliothèque Android en changeant cette ligne?
Enrico
22
Un jour, nous cliquerons sur un bouton d'importation et la bibliothèque fonctionnera, puis nous commencerons à taper du code dans l'éditeur.
Steve M
6
Cette approche semble inclure les bibliothèques dans le projet réel. Ce que l'OP voulait, c'était savoir comment créer un projet de bibliothèque Android séparé qui vit dans son propre projet / espace et uniquement inclus dans le projet d'application principal en tant que bibliothèque
Jonathan
@SteveM Cela a été mon problème tout au long de ma carrière. Je commence juste à coder sans aucune conception. Et puis passez des heures à déboguer et à refactoriser.
Rajkiran
13

Pour Intellij IDEA (et Android Studio), chaque bibliothèque est un module. Considérez un module dans Android Studio comme un équivalent à un projet dans Eclipse. Project dans Android Studio est une collection de modules. Les modules peuvent être des applications exécutables ou des modules de bibliothèque.

Ainsi, pour ajouter un nouveau projet de bibliothèque Android, vous devez créer un module de type "Bibliothèque Android". Ajoutez ensuite ce module de bibliothèque à la liste de dépendances de votre module principal (module d'application).

Simon-Droid
la source
12

Le moyen le plus simple pour moi de créer et de réutiliser un projet de bibliothèque:

  1. Sur un projet ouvert file > new > new module(et répondez aux questions de l'interface utilisateur)

entrez la description de l'image ici

  1. vérifiez / ou ajoutez si dans le fichier settings.gradle :include ':myLibrary'
  2. vérifiez / ou ajoutez si dans le fichier build.gradle :

    dependencies { ... compile project(':myLibrary') }

  3. Pour réutiliser ce module de bibliothèque dans un autre projet, copiez son dossier dans le projet au lieu de l'étape 1 et suivez les étapes 2 et 3.

Vous pouvez également créer un nouveau projet d'application de studio Vous pouvez facilement changer un module d'application existant en module de bibliothèque en changeant l'affectation du plugin dans le fichier build.gradle en com.android.library.

apply plugin: 'com.android.application'

android {...}

à

apply plugin: 'com.android.library'

android {...}

plus ici

hanoo
la source
Si vous changez un module d'application existant en module de bibliothèque en changeant l'affectation du plugin, vous devrez également supprimer la ligne `applicationId" com .... "du fichier gradle.
TDG
"AVERTISSEMENT: la configuration 'compile' est obsolète et a été remplacée par 'implementation' et 'api'."
slhck
9

Vous pouvez ajouter un nouveau module à n'importe quelle application comme Blundell le dit dans sa réponse, puis le référencer à partir de n'importe quelle autre application.

Si vous souhaitez déplacer le module vers n'importe quel endroit de votre ordinateur, déplacez simplement le dossier du module (les modules sont complètement indépendants), vous devrez alors référencer le module.

Pour référencer ce module, vous devez:

  • Sur le fichier build.gradle de votre application, ajoutez:

    dependencies {
    ...
    compile project(':myandroidlib')
    }
    
  • Sur le fichier settings.gradle, ajoutez ce qui suit:

     include ':app', ':myandroidlib'
     project(':myandroidlib').projectDir = new File(PATH_TO_YOUR_MODULE)
    
julien
la source
par exemple, project(':library').projectDir = new File('../library')libraryest le nom du dossier en parallèle avec le dossier du projet Android.
Someone Somewhere
5

N'oubliez pas d'utiliser apply plugin: 'com.android.library'dans votre build.gradleplugin au lieu d'appliquer:'com.android.application'

Ryan R
la source
4

Manière de documentation

C'est la méthode recommandée selon les conseils donnés dans la documentation d'Android Studio.

Créer un module de bibliothèque

Créez un nouveau projet pour créer votre bibliothèque. Cliquez sur Fichier> Nouveau> Nouveau module> Bibliothèque Android> Suivant> (choisissez le nom)> Terminer . Ajoutez ensuite les classes et les ressources que vous souhaitez à votre bibliothèque.

Lorsque vous construisez le module, un fichier AAR sera créé. Vous pouvez le trouver dans project-name/module-name/build/outputs/aar/.

Ajoutez votre bibliothèque en tant que dépendance

Vous pouvez ajouter votre bibliothèque en tant que dépendance à un autre projet comme ceci:

  1. Importez votre fichier AAR de bibliothèque avec Fichier> Nouveau module> Importer le package .JAR / .AAR> Suivant> (choisissez l'emplacement du fichier)> Terminer . (N'importez pas le code, sinon il sera modifiable à trop d'endroits.)
  2. Dans le fichier settings.gradle, assurez-vous que le nom de votre bibliothèque y figure.

    include ':app', ':my-library-module'
    
  3. Dans le fichier build.gradle de l'application, ajoutez la ligne de compilation à la section des dépendances:

    dependencies {
        compile project(":my-library-module")
    }
    
  4. Vous serez invité à synchroniser votre projet avec gradle. Fais le.

C'est tout. Vous devriez pouvoir utiliser votre bibliothèque maintenant.

Remarques

Si vous souhaitez rendre votre bibliothèque facilement accessible à un public plus large, envisagez d'utiliser JitPac ou JCenter .

Suragch
la source
3

Eu la même question et l'a résolu de la manière suivante:

Situation de départ :

FrigoShare (root)
|-Modules:    frigoshare,   frigoShare-backend

Cible : souhaitez ajouter un module nommédataformats

  1. Ajoutez un nouveau module (par exemple: Java Library )
  2. Assurez-vous que votre settings.gradleapparence ressemble à ceci (normalement automatiquement):

    include ':frigoshare', ':frigoShare-backend', ':dataformats'

  3. Assurez-vous ( manuellement ) que les build.gradlefichiers des modules qui doivent utiliser votre bibliothèque ont la dépendance suivante:

    dependencies { ... compile project(':dataformats') }

Matthias
la source
2

Comme le commentaire theczechsensation ci-dessus, j'essaie de rechercher sur Gradle Build Varians et j'ai trouvé ce lien: http://code.tutsplus.com/tutorials/using-gradle-build-variants--cms-25005 C'est une solution très simple. Voici ce que j'ai fait: - Dans build.gradle:

flavorDimensions "version"

productFlavors {
    trial{
        applicationId "org.de_studio.recentappswitcher.trial"
        flavorDimension "version"
    }
    pro{
        applicationId "org.de_studio.recentappswitcher.pro"
        flavorDimension "version"
    }

}

Ensuite, j'ai 2 autres versions de mon application: pro et essai avec 2 packageName différent qui est 2 applicationId dans le code ci-dessus afin que je puisse télécharger les deux sur Google Play. Je code toujours dans la section "principale" et utilise le getpackageName pour basculer entre la version. Allez simplement sur le lien que j'ai donné pour plus de détails.

Hai nguyen thanh
la source
1

Il existe deux méthodes simples si l'une ne fonctionne pas, veuillez essayer l'autre.

  1. Ajoutez la dépendance de la bibliothèque à l'intérieur de la dépendance dans le fichier build.gradle de la bibliothèque ur en utilisant, et collez la bibliothèque ur dans les bibliothèques externes.

OU

  1. Allez simplement dans votre dossier libs dans le dossier de l'application et collez-y tous vos fichiers .jar, par exemple. app '"Cela fonctionnera certainement ........... :)
Sudhanshu Gaur
la source
1

Dans mon cas, en utilisant MAC OS X 10.11 et Android 2.0, et en faisant exactement ce qu'Aqib Mumtaz a expliqué.

Mais, à chaque fois, j'ai eu ce message: " Un problème est survenu lors de la configuration du projet ': app'.> Impossible d'évaluer le module xxx: Configuration avec le nom 'default' introuvable ."

J'ai trouvé que la raison de ce message est qu'Android 2.0 ne permet pas de créer directement une bibliothèque. J'ai donc décidé de créer d'abord un projet d'application puis de modifier le build.gradle afin de le transformer en bibliothèque.

Cette solution ne fonctionne pas, car un projet de bibliothèque est très différent d'un projet d'application.

Donc, j'ai résolu mon problème comme ceci:

  • Créez d'abord une application standard (si nécessaire);
  • Ensuite, choisissez 'Fichier / Créer un module'
  • Allez dans le Finder et déplacez le dossier du module fraîchement créé dans votre répertoire framework

Continuez ensuite avec la solution proposée par Aqib Mumtaz.

En conséquence, la source de votre bibliothèque sera partagée sans avoir besoin de dupliquer les fichiers source à chaque fois (c'était une hérésie pour moi!)

En espérant que cela vous aide.

Chrstph SLN
la source