So erstellen Sie ein Bibliotheksprojekt in Android Studio und ein Anwendungsprojekt, das das Bibliotheksprojekt verwendet

164

Ich bin neu im Gradle Build System und IntelliJ.

Wie erstelle ich ein Android-Bibliotheksprojekt (z. B. com.myapp.lib1) und das Anwendungsprojekt (z. B. com.myapp.app) und lasse das Build-System com.myapp.lib1 in das Anwendungsprojekt aufnehmen?

Ich ging zu Projektstruktur -> Module -> Mein App-Projekt und fügte dem lib-Projekt eine Abhängigkeit hinzu. IntelliJ kann jetzt Klassen aus dem lib-Projekt erkennen, wenn sie im App-Projekt verwendet werden. Wenn ich das App-Projekt ausführe, treten jedoch folgende Fehler auf:

Gradle: error: package com.myapp.lib1 does not exist
Randy Sugianto 'Yuku'
quelle
1
Ich habe Android-Bibliotheken verwendet, um kostenlose / kostenpflichtige Versionen meiner App zu erstellen. Das neue Gradle-Build-System macht diesen Ansatz mit dem Build Variants-Konzept überflüssig. Sie können jetzt automatisch verschiedene signierte APKs aus demselben Code erstellen. Ich wünschte, ich hätte das früher gewusst.
Theczechsensation
1
@ theczechsensation - kannst du das näher erläutern? Nach dem Hochladen von APK für die Vollversion habe ich versucht, APK für die kostenlose Version hochzuladen, aber denselben Paketnamen verwendet. Der Google Play Store (GPS) gab mir die Nachricht, dass ich diesen Paketnamen bereits verwendet habe. Bedeutet das, was Sie über gradle sagen, dass ich keine zwei separaten Apps in zwei separaten Paketen benötige?
DSlomer64
Hier ist die perfekte Antwort stackoverflow.com/a/31366602/1118772 . Aqib Mumtaz in den Antworten erwähnt, aber es ist endlich. Anstatt Zeit auf andere Weise zu verschwenden, können Sie dies tun. philosophicalhacker.com/2014/10/02/…
Noundla Sandeep
Interessanter Thread zum Hinzufügen von Bibliotheken .mit bildlicher Erklärung.
Harish

Antworten:

111

So erstellen Sie eine Bibliothek:

Datei> Neues Modul

Wählen Sie Android Library

Lib

Um die Bibliothek zu verwenden, fügen Sie sie als Abhängigkeit hinzu:

Datei> Projektstruktur> Module> Abhängigkeiten

dep

Fügen Sie dann das Modul (Android-Bibliothek) als Modulabhängigkeit hinzu.

Modul hinzufügen

Führen Sie Ihr Projekt aus. Es wird funktionieren.

Blundell
quelle
194
Dadurch werden die Dateien des Moduls innerhalb des Projekts erstellt. Was ist, wenn das Modul außerhalb des Projekts sein soll, damit es mit einer anderen Anwendung verwendet werden kann?
rrbrambley
2
@rrbrambley: Ich habe einen Weg gefunden, ein Modul in mehreren Projekten wiederzuverwenden. Ich habe Ordnerlinks (NTFS Junction) mit einer Anwendung namens winbolic link für Windows erstellt. Wenn ich ein Modul habe, das ich in mehreren Projekten wiederverwenden möchte, erstelle ich im Verzeichnis jedes Projekts, in dem es verwendet werden soll, einen Ordnerlink zu dem wiederzuverwendenden Projekt. Danach füge ich die Modulabhängigkeit hinzu (in Andr. Studio). Jetzt kann ich das Modul in jedem Projekt verwenden / bearbeiten, während es synchron bleibt. Ich bin mir nicht sicher, ob es der richtige Weg ist, aber im Moment scheint es ganz gut zu funktionieren! Dies funktioniert besser als ein lokales Maven-Repo.
Peter
1
Leider gibt es ab Juli 2014 keine Projekteinstellungen mehr wie im Screenie. Ich musste die .grade-Dateien wie in der Antwort von GrkEngineer unten bearbeiten.
Tim Bray
24
Dies sollte abgelehnt werden, da dies ein Modul aus einem bestehenden Projekt erstellt
Jonathan
2
Wenn Sie dieselbe Bibliothek in anderen Projekten verwenden möchten, müssen Sie das Bibliotheksmodul in dieses Projekt kopieren und settings.gradle und build.gradle des Hauptmoduls manuell konfigurieren.
Hanoo
114

Ich frage mich, warum es kein Beispiel für ein eigenständiges Glasprojekt gibt.

In Eclipse aktivieren wir einfach das Kontrollkästchen "Ist Bibliothek" im Dialogfeld "Projekteinstellungen".
In Android Studio habe ich diese Schritte ausgeführt und eine JAR-Datei erhalten.

  1. Erstellen Sie ein Projekt.

  2. Öffnen Sie die Datei im linken Projektmenü. (app / build.gradle): Gradle Scripts> build.gradle (Modul: XXX)

  3. Ändern Sie eine Zeile: apply plugin: 'com.android.application'->'apply plugin: com.android.library'

  4. Entfernen Sie die Anwendungs-ID in der Datei: applicationId "com.mycompany.testproject"

  5. Projekt erstellen: Erstellen> Projekt neu erstellen

  6. dann können Sie aar-Datei erhalten: app> build> output> aar-Ordner

  7. Ändern Sie den aarNamen der Dateierweiterung inzip

  8. entpacken, und Sie können classes.jarim Ordner sehen. umbenennen und verwenden!

Wie auch immer, ich weiß nicht, warum Google die Erstellung von JARs in Android Studio so mühsam macht.

Jinbom Heo
quelle
1
Funktioniert für mich unter Android Studio 2.2.2 dec. 2016.
Herman
95

Das vom Google Gradle Plugin empfohlene Verfahren zum Konfigurieren Ihrer Gradle-Dateien zum Erstellen mehrerer Projekte weist einige Mängel auf. Wenn Sie abhängig von einem Bibliotheksprojekt mehrere Projekte haben, werden in diesem Beitrag die von Google empfohlene Konfiguration und seine Mängel kurz erläutert und eine andere Methode zum Konfigurieren Ihrer Gradle-Dateien empfohlen Unterstützung von Multi-Projekt-Setups in Android Studio:

Ein alternatives Multiprojekt-Setup für Android Studio

Ein anderer Weg :

Es stellt sich heraus, dass es eine bessere Möglichkeit gibt, mehrere Projekte in Android Studio zu verwalten. Der Trick besteht darin, separate Android Studio-Projekte für Ihre Bibliotheken zu erstellen und gradle mitzuteilen, dass sich das Modul für die Bibliothek, von der Ihre App abhängt, im Projektverzeichnis der Bibliothek befindet. Wenn Sie diese Methode mit der oben beschriebenen Projektstruktur verwenden möchten, gehen Sie wie folgt vor:

  1. Erstellen Sie ein Android Studio-Projekt für die StickyListHeaders-Bibliothek
  2. Erstellen Sie ein Android Studio-Projekt für App2
  3. Erstellen Sie ein Android Studio-Projekt für App1
  4. Konfigurieren Sie App1 und App2 so, dass die Module im StickyListHeaders-Projekt erstellt werden.

Der 4. Schritt ist der schwierige Teil, daher ist dies der einzige Schritt, den ich im Detail beschreiben werde. Sie können auf Module verweisen, die sich außerhalb des Projektverzeichnisses befinden, indem Sie eine Projektanweisung in Ihre Datei settings.gradle einfügen und die Eigenschaft projectDir für das ProjectDescriptor-Objekt festlegen, das von dieser Projektanweisung zurückgegeben wird:

Geben Sie hier die Bildbeschreibung ein

Der Code, den man eingeben muss settings.gradle:

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

Wenn Sie dies richtig gemacht haben, werden Sie feststellen, dass die Module, auf die Ihr Projekt verweist, im Projektnavigator angezeigt werden, auch wenn sich diese Module außerhalb des Projektverzeichnisses befinden:

Geben Sie hier die Bildbeschreibung ein

Auf diese Weise können Sie gleichzeitig an Bibliothekscode und App-Code arbeiten. Die Integration der Versionskontrolle funktioniert auch einwandfrei, wenn Sie Module auf diese Weise extern referenzieren. Sie können Ihre Änderungen am Bibliothekscode festschreiben und übertragen, genauso wie Sie Änderungen an Ihrem App-Code festschreiben und übertragen können.

Durch diese Art der Einrichtung mehrerer Projekte werden die Schwierigkeiten vermieden, die die von Google empfohlene Konfiguration betreffen. Da wir auf ein Modul verweisen, das sich außerhalb des Projektverzeichnisses befindet, müssen wir nicht für jede App, die davon abhängt, zusätzliche Kopien des Bibliotheksmoduls erstellen, und wir können unsere Bibliotheken ohne Unsinn eines Git-Submoduls versionieren.

Leider ist diese andere Art, mehrere Projekte einzurichten, sehr schwer zu finden. Dies können Sie natürlich nicht anhand des Google-Handbuchs herausfinden. Derzeit können Sie Ihre Projekte nicht über die Benutzeroberfläche von Android Studio auf diese Weise konfigurieren.

Aqib Mumtaz
quelle
4
Dies ist die perfekte Antwort. Vielen Dank.
Noundla Sandeep
1
Gute Antwort, aber Sie sollten die relevanten Bits aus dem Beitrag in Ihre Antwort kopieren, falls der Link unterbrochen wird.
Greyson Parrelli
2
HINWEIS: Für die String-Auswertung in Gradle müssen Sie ein doppeltes Anführungszeichen (") verwenden. Dies ist" Save the Day "für mich. Verknüpft damit
Solata
1
Wie verweisen wir auf den Bibliothekscode aus dem App-Code? Nachdem Sie Ihre Einrichtungsanweisungen befolgt haben, kann der App-Code immer noch nicht auf ein Paket im Bibliothekscode verweisen. Gibt es einen zusätzlichen Schritt, der getan werden muss?
CEGRD
2
@CEGRD Sie müssen zu Datei> Projektstruktur gehen und auf den Namen des Moduls klicken, an dem Sie arbeiten. Gehen Sie dann zur Registerkarte "Abhängigkeiten" und klicken Sie im Dropdown-Menü auf "+" und dann auf "Modulabhängigkeit". Sie sollten dann in der Lage sein, das Modul library1 zu Ihrem aktuellen Projekt hinzuzufügen.
OliasailO
45

Schauen Sie sich diesen Link zu Multi-Projekt-Setups an .

Stellen Sie sicher, dass Sie Ihre settings.gradle aktualisiert haben, um sowohl auf die App- als auch auf die Bibliotheksmodule zu verweisen.

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

Stellen Sie außerdem sicher, dass build.gradle der App Folgendes enthält:

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

Sie sollten die folgende Struktur haben:

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

Das build.gradle der App sollte das com.android.applicationPlugin verwenden, während das build.gradle aller Bibliotheken das com.android.libraryPlugin verwenden sollte.

Die Android Studio-IDE sollte aktualisiert werden, wenn Sie mit diesem Setup über die Befehlszeile erstellen können.

GrkEngineer
quelle
Ist das in build.gradle definierte Plugin der einzige Unterschied? dh Können Sie ein vorhandenes Modul in eine Android-Bibliothek ändern, indem Sie diese eine Zeile ändern?
Enrico
22
Eines Tages werden wir auf eine Importschaltfläche klicken und die Bibliothek wird einfach funktionieren, dann werden wir beginnen, Code in den Editor einzugeben.
Steve M
6
Dieser Ansatz scheint die Bibliotheken in das eigentliche Projekt einzubeziehen. Was das OP wollte, war zu wissen, wie man ein separates Android-Bibliotheksprojekt erstellt, das in seinem eigenen Projekt / Raum lebt und nur als lib im Haupt-App-Projekt enthalten ist
Jonathan
@SteveM Das war während meiner gesamten Karriere mein Problem. Ich fange einfach an, ohne Design zu programmieren. Und dann stundenlang debuggen und umgestalten.
Rajkiran
13

Für Intellij IDEA (und Android Studio) ist jede Bibliothek ein Modul. Stellen Sie sich ein Modul in Android Studio als Äquivalent zu einem Projekt in Eclipse vor. Das Projekt in Android Studio ist eine Sammlung von Modulen. Module können ausführbare Anwendungen oder Bibliotheksmodule sein.

Um ein neues Android-Bibliotheksprojekt hinzuzufügen, müssen Sie ein Modul vom Typ "Android-Bibliothek" erstellen. Fügen Sie dann dieses Bibliotheksmodul zur Abhängigkeitsliste Ihres Hauptmoduls (Anwendungsmodul) hinzu.

Simon-Droid
quelle
12

Der einfachste Weg für mich, ein Bibliotheksprojekt zu erstellen und wiederzuverwenden :

  1. Bei einem geöffneten Projekt file > new > new module(und beantworten Sie die Fragen zur Benutzeroberfläche)

Geben Sie hier die Bildbeschreibung ein

  1. Überprüfen / oder Hinzufügen, wenn in der Datei settings.gradle :include ':myLibrary'
  2. Überprüfen / oder Hinzufügen, wenn in der Datei build.gradle :

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

  3. Um dieses Bibliotheksmodul in einem anderen Projekt wiederzuverwenden, kopieren Sie den Ordner im Projekt anstelle von Schritt 1 und führen Sie die Schritte 2 und 3 aus.

Sie können auch ein neues Studioanwendungsprojekt erstellen. Sie können ein vorhandenes Anwendungsmodul einfach in ein Bibliotheksmodul ändern, indem Sie die Plugin-Zuweisung in der Datei build.gradle in com.android.library ändern.

apply plugin: 'com.android.application'

android {...}

zu

apply plugin: 'com.android.library'

android {...}

mehr hier

Hanoo
quelle
Wenn Sie ein vorhandenes Anwendungsmodul durch Ändern der Plugin-Zuordnung in ein Bibliotheksmodul ändern, müssen Sie auch die Zeile "applicationId" com .... "aus der Gradle-Datei entfernen.
TDG
"WARNUNG: Die 'Kompilierung' der Konfiguration ist veraltet und wurde durch 'Implementierung' und 'API' ersetzt."
Slhck
9

Sie können jeder Anwendung ein neues Modul hinzufügen, wie Blundell in seiner Antwort sagt, und es dann von jeder anderen Anwendung aus referenzieren.

Wenn Sie das Modul an eine beliebige Stelle auf Ihrem Computer verschieben möchten, verschieben Sie einfach den Modulordner (Module sind völlig unabhängig), dann müssen Sie auf das Modul verweisen.

Um auf dieses Modul zu verweisen, sollten Sie:

  • Fügen Sie in der Datei build.gradle Ihrer App Folgendes hinzu:

    dependencies {
    ...
    compile project(':myandroidlib')
    }
    
  • Fügen Sie in der Datei settings.gradle Folgendes hinzu:

     include ':app', ':myandroidlib'
     project(':myandroidlib').projectDir = new File(PATH_TO_YOUR_MODULE)
    
julianisch
quelle
Zum Beispiel, project(':library').projectDir = new File('../library')wo libraryist der Ordnername parallel zum Ordner des Android-Projekts.
Jemand irgendwo
5

Vergessen Sie nicht, apply plugin: 'com.android.library'in Ihrem build.gradlePlugin zu verwenden, anstatt es anzuwenden:'com.android.application'

Ryan R.
quelle
4

Dokumentationsweg

Dies ist die empfohlene Methode gemäß den Hinweisen in der Android Studio-Dokumentation.

Erstellen Sie ein Bibliotheksmodul

Erstellen Sie ein neues Projekt, in dem Sie Ihre Bibliothek erstellen möchten. Klicken Sie auf Datei> Neu> Neues Modul> Android-Bibliothek> Weiter> (Name auswählen)> Fertig stellen . Fügen Sie dann Ihrer Bibliothek die gewünschten Klassen und Ressourcen hinzu.

Wenn Sie das Modul erstellen, wird eine AAR-Datei erstellt. Sie finden es in project-name/module-name/build/outputs/aar/.

Fügen Sie Ihre Bibliothek als Abhängigkeit hinzu

Sie können Ihre Bibliothek als Abhängigkeit zu einem anderen Projekt wie folgt hinzufügen:

  1. Importieren Sie die AAR-Datei Ihrer Bibliothek mit Datei> Neues Modul> .JAR / .AAR-Paket importieren> Weiter> (Speicherort der Datei auswählen)> Fertig stellen . (Importieren Sie den Code nicht, da er sonst an zu vielen Stellen bearbeitet werden kann.)
  2. Stellen Sie in der Datei settings.gradle sicher, dass Ihr Bibliotheksname vorhanden ist.

    include ':app', ':my-library-module'
    
  3. Fügen Sie in der build.gradle-Datei der App die Kompilierungszeile zum Abschnitt Abhängigkeiten hinzu:

    dependencies {
        compile project(":my-library-module")
    }
    
  4. Sie werden aufgefordert, Ihr Projekt mit gradle zu synchronisieren. Tu es.

Das ist es. Sie sollten jetzt in der Lage sein, Ihre Bibliothek zu verwenden.

Anmerkungen

Wenn Sie Ihre Bibliothek einem größeren Publikum leicht zugänglich machen möchten, sollten Sie JitPac oder JCenter verwenden .

Suragch
quelle
3

Hatte die gleiche Frage und löste sie folgendermaßen:

Startsituation :

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

Ziel : Sie möchten ein Modul mit dem Namen hinzufügendataformats

  1. Fügen Sie ein neues Modul (zB: Java Library)
  2. Stellen Sie sicher, dass Sie so settings.gradleaussehen (normalerweise automatisch):

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

  3. Stellen Sie ( manuell ) sicher, dass die build.gradleDateien der Module, die Ihre Bibliothek verwenden müssen, die folgende Abhängigkeit aufweisen:

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

Matthias
quelle
2

Als Kommentar zur tschechischen Sensation oben versuche ich, nach Gradle Build Varians zu suchen, und habe diesen Link gefunden: http://code.tutsplus.com/tutorials/using-gradle-build-variants--cms-25005 Dies ist eine sehr einfache Lösung. Folgendes habe ich getan: - In build.gradle:

flavorDimensions "version"

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

}

Dann habe ich 2 weitere Versionen meiner App: Pro und Testversion mit 2 verschiedenen Paketnamen, dh 2 Anwendungs-IDs im obigen Code, damit ich beide auf Google Play hochladen kann. Ich codiere immer noch nur im Abschnitt "main" und verwende den getpackageName, um zwischen der Version zu wechseln. Gehen Sie einfach zu dem Link, den ich für Details gegeben habe.

Hai nguyen thanh
quelle
1

Es gibt zwei einfachste Möglichkeiten, wenn eine nicht funktioniert, versuchen Sie es mit der anderen.

  1. Fügen Sie die Abhängigkeit der Bibliothek innerhalb der Abhängigkeit innerhalb der Datei build.gradle der Bibliothek hinzu, die Sie verwenden, und fügen Sie Ihre Bibliothek in externe Bibliotheken ein.

ODER

  1. Gehen Sie einfach in Ihren libs-Ordner im App-Ordner und fügen Sie alle Ihre .jar-Dateien ein, z. B. Bibliotheksdateien. Der Trick hier ist nun, dass Sie jetzt in die settings.gradle-Datei gehen und diese Zeile "include ': app: libs'" nach "include" hinzufügen: App '"Es wird definitiv funktionieren ........... :)
Sudhanshu Gaur
quelle
1

In meinem Fall mit MAC OS X 10.11 und Android 2.0 und genau das, was Aqib Mumtaz erklärt hat.

Aber jedes Mal hatte ich die folgende Meldung: "Beim Konfigurieren des Projekts ': app' ist ein Problem aufgetreten.> Modul xxx kann nicht ausgewertet werden: Konfiguration mit dem Namen 'default' wurde nicht gefunden ."

Ich habe festgestellt, dass der Grund für diese Meldung darin besteht, dass Android 2.0 das direkte Erstellen einer Bibliothek nicht zulässt. Daher habe ich mich entschlossen, zuerst ein App-Projekt zu erstellen und dann das build.gradle zu ändern, um es als Bibliothek zu transformieren.

Diese Lösung funktioniert nicht, da sich ein Bibliotheksprojekt stark von einem App-Projekt unterscheidet.

Also habe ich mein Problem folgendermaßen gelöst:

  • Erstellen Sie zuerst eine Standard-App (falls erforderlich).
  • Wählen Sie dann "Datei / Modul erstellen".
  • Gehen Sie zum Finder und verschieben Sie den Ordner des Moduls, der frisch in Ihrem Framework-Verzeichnis erstellt wurde

Fahren Sie dann mit der von Aqib Mumtaz vorgeschlagenen Lösung fort.

Infolgedessen wird Ihre Bibliotheksquelle freigegeben, ohne dass jedes Mal Quelldateien dupliziert werden müssen (es war eine Häresie für mich!).

Ich hoffe, das hilft dir.

Chrstph SLN
quelle