So erstellen Sie ein Glas für Android Library Project

74

Ich muss eine Bibliothek erstellen, die ich in einer JAR-Datei auf den Client exportieren werde. Gibt es eine Möglichkeit, ein Glas mit den darin enthaltenen Ressourcen zu erstellen?

Der Google adMob verfügt über eine solche JAR-Datei, die eine Ressourcendatei wie R $ layout.class enthält. Diese Seite beschreibt eine Möglichkeit, dies zu tun, aber ich kann nicht genau verstehen, wie ich das Bibliotheksprojekt mit der oben beschriebenen Methode in eine Anwendung importieren soll.

Aayush Rana
quelle

Antworten:

81

Dies ist der nächste, den Sie bekommen können:

Schritt 1: Erstellen Sie ein reguläres Android-Bibliotheksprojekt und bringen Sie es zum Laufen.

Schritt 2: Kopieren Sie das Android-Bibliotheksprojekt in ein anderes Verzeichnis.

Schritt 3: Erstellen Sie eine JAR aus den kompilierten Java-Klassen aus dem ursprünglichen Android-Bibliotheksprojekt und legen Sie diese JAR in dem libs/Verzeichnis der Kopie ab, die Sie in Schritt 2 erstellt haben. Sie sollten ProGuard manuell auf dieser JAR ausführen können, obwohl ich das nicht ausprobiert habe.

Schritt 4: Entfernen Sie alles im src/Verzeichnis des kopierten Bibliotheksprojekts und lassen Sie es zurück und leersrc/ Verzeichnis zurück.

Schritt 5: Komprimieren Sie das kopierte Android-Bibliotheksprojekt oder verteilen Sie es auf andere Weise.

Dadurch erhalten Sie ein Android-Bibliotheksprojekt wie das Play Services-Projekt, in dem die Ressourcen verfügbar sind, der Quellcode jedoch nicht.

UPDATE : Ein noch besserer Ansatz besteht heutzutage darin, Ihr Bibliotheksprojekt als AAR zu verpacken. Dies ist die native Methode von Android, um aus Ihrem kompilierten Code und den erforderlichen Ressourcen ein wiederverwendbares Artefakt zu erstellen. Derzeit (Juli 2014) können Gradle für Android, Android Studio android-maven-pluginund die AARs erstellen und verwenden.

CommonsWare
quelle
5
Ein Bibliotheksprojekt unterscheidet sich von einem Standard-Android-Anwendungsprojekt dadurch, dass Sie es nicht direkt in eine eigene APK-Datei kompilieren und auf einem Android-Gerät ausführen können . Ebenso können Sie das Bibliotheksprojekt nicht wie bei einer echten Bibliothek in eine eigenständige JAR-Datei exportieren. Stattdessen müssen Sie die Bibliothek indirekt kompilieren, indem Sie auf die Bibliothek in der abhängigen Anwendung verweisen und diese Anwendung erstellen. Dieses Zitat von Doc unterstützt Ihre Antwort, denke ich
Raghunandan
@CommonsWare Ihre Gliederung funktioniert sehr gut, wenn ProGuard nicht auf der JAR ausgeführt wird. Wenn Sie ProGuard (manuell) auf die JAR anwenden, beschweren sich alle abhängigen Projekte über alle referenzierten Symbole, die nicht aufgelöst werden können. Ich habe es gerade versucht und das habe ich erhalten. Vermisse ich etwas
stolperte
1
@stumpped: Sie müssen Ihre ProGuard-Konfigurationsdatei so eingerichtet haben, dass die Namen der öffentlichen Inhalte, die die abhängigen Projekte benötigen, nicht verschleiert werden.
CommonsWare
@ CommonsWare zitiert den offiziellen Leitfaden: Hinweis: Sie benötigen SDK Tools r14 oder höher, um die neue Bibliotheksprojektfunktion zu verwenden, mit der jedes Bibliotheksprojekt in einer eigenen JAR-Datei generiert wird. developer.android.com/tools/projects/index.html#LibraryProjects
Mahmoud Abou-Eita
Noch auf derselben Seite: Sie können ein Bibliotheksprojekt nicht in eine JAR-Datei exportieren. Eine Bibliothek kann nicht als Binärdatei (z. B. eine JAR-Datei) verteilt werden. Dies wird in einer zukünftigen Version der SDK-Tools hinzugefügt.
Mahmoud Abou-Eita
22

Das funktioniert!

  1. Machen Sie Ihr Bibliotheksprojekt zu einem normalen Projekt, indem Sie das IsLibrary-Flag deaktivieren.
  2. Führen Sie Ihr Projekt als Android-Anwendung aus. (Es wird kein Fehler angezeigt)
  3. Sie finden eine .jar-Datei im Ordner bin zusammen mit .apk.
  4. Geben Sie .jar, die Ihre Bibliothek verwenden möchten.
  5. Sagen Sie ihnen, sie sollen nur ein externes Glas in den Erstellungspfad importieren.

Dies funktioniert gut mit allen Ressourcen. Ich danke Ihnen allen. für Ihre Antwort

Aayush Rana
quelle
Wenn ich das mache, bekomme ich keine .jar-Datei in meinem bin / Verzeichnis generiert?
David Doria
Ich bekomme die .jar nur, wenn ich "Is Library" aktiviert habe. Wenn ich das jedoch zu meinem abhängigen Projekt hinzufüge, funktionieren die Ressourcen nicht.
David Doria
2
Wenn Ressourcen funktionieren sollen, überprüfen Sie dies: stackoverflow.com/a/17064024/1779907 . Die Methode, die ich in der Antwort erklärt habe, funktioniert, wenn Sie eine Bibliothek haben, die keine Ressourcen hat. Wenn Sie Ihre Ressourcen auch sichern möchten, codieren Sie sie bitte fest in Java (wie ich die Base64-Codierung verwendet habe, um meine Bilder direkt in einer Java-Oberfläche zu speichern). Anschließend können Sie die in meiner Antwort erläuterte Methode verwenden (arbeiten Sie besser, wenn Sie weniger Ressourcen haben). .
Aayush Rana
Sehen Sie meine Antwort hier für einen einfacheren Weg - übrigens Ihre Antwort brachte mich auf den richtigen Weg;)
Mr_and_Mrs_D
5
Dies würde mit Ressourcen nicht funktionieren! In diesem Glas befindet sich nicht einmal die Res-Bibliothek. Wahrscheinlich haben Sie die Eigenschaften des Projekts mithilfe der Bibliothek übersehen.
TacB0sS
14

Führen Sie die folgenden Schritte aus, um eine verteilbare JAR-Datei Ihrer Bibliothek zu erhalten (überprüft für Bibliotheksprojekte ohne externe Abhängigkeiten):

  1. Erstellen Sie Ihr Bibliotheksprojekt. Putze es. Sie erhalten eine Datei libraryProjectName.jar im Ordner bin. (Stellen Sie sicher, dass im Bibliotheksprojekt "Bibliothek ist" ausgewählt ist .
  2. Kopieren Sie die JAR-Datei in den libs- Ordner Ihres Zielanwendung
  3. Aktualisieren Sie Ihren Arbeitsbereich und drücken Sie Ctr+Shift+O(unter Windows / Linux) oder Cmd+Shift+O(unter Mac), um alle Importabhängigkeiten aus der hinzugefügten Bibliothek aufzulösen.

Kommentar für den Fall eines Problems.

Akshat Singhal
quelle
6
Dies ist bei weitem der einfachste Weg, eine JAR aus einem Bibliotheksprojekt zu erstellen, aber ... sie enthält nicht resdie assetsOrdner und. Vermisse ich etwas
Ripopenid
@ripopenid Diese können nicht in einem JAR sein. Dafür müssen Sie auf Bibliotheksprojekte verweisen.
Caw
@MarcoW., Nur resist möglich. Selbst das Referenzieren erlaubt uns nicht die Verwendung assets. Siehe developer.android.com/tools/projects/index.html#LibraryProjects : "Alle von einer Anwendung verwendeten Asset-Ressourcen müssen in den Assets / gespeichert werden. Verzeichnis des Anwendungsprojekts selbst ".
Pacerier
Korrekt. Ein JAR bringt Ihnen das srcVerzeichnis. Ein Bibliotheksprojekt bringt Sie reszusätzlich. Mehr ist nicht möglich.
Caw
3

Sie können keine Ressourcendateien in jar packen. Sie können Ihr Projekt als Bibliotheksprojekt exportieren.

Sie exportieren Ihre Dienstprogrammklassen, die sich nicht auf Ressourcen in Android beziehen, dh reine Java-Klassen, als JAR-Datei.

Überprüfen Sie den Link unten

http://developer.android.com/tools/projects/index.html

Um Ihr Projekt zu einem Bibliotheksprojekt zu machen

Klicken Sie mit der rechten Maustaste auf Ihr Projekt. Gehen Sie zu Eigenschaften. Wählen Sie Android. Stellen Sie sicher, dass Is Library aktiviert ist.

So verweisen Sie auf das Bibliotheksprojekt in Ihrem Android-Projekt

Klicken Sie mit der rechten Maustaste auf Ihr Projekt. Gehen Sie zu Eigenschaften. Wählen Sie Android. Klicken Sie auf Hinzufügen. Durchsuchen und das Bibliotheksprojekt.

Zitieren aus den Dokumenten

Ein Bibliotheksprojekt unterscheidet sich von einem Standard-Android-Anwendungsprojekt dadurch, dass Sie es nicht direkt in eine eigene APK-Datei kompilieren und auf einem Android-Gerät ausführen können. Ebenso können Sie das Bibliotheksprojekt nicht wie bei einer echten Bibliothek in eine eigenständige JAR-Datei exportieren. Stattdessen müssen Sie die Bibliothek indirekt kompilieren, indem Sie auf die Bibliothek in der abhängigen Anwendung verweisen und diese Anwendung erstellen.

Raghunandan
quelle
1
Eine Bibliothek kann nicht als Binärdatei (z. B. JAR-Datei) verteilt werden. Dies wird in einer zukünftigen Version der SDK-Tools hinzugefügt. Zitat aus developer.android.com/tools/projects/index.html
Raghunandan
8
Im neuen Gradle-Build-System haben Sie die Möglichkeit, eine sogenannte AAR-Datei (Android Archive) zu erstellen, genau das, was Sie wollen. Es ist im Grunde wie eine APK (enthält Ressourcen, Manifest usw.) nur für Bibliotheken. Wechseln Sie also zu Gradle, wenn Sie dafür angemessene Unterstützung wünschen.
Tim Roes
Ich habe nicht herabgestimmt (nicht genug Punkte), aber ich kann mir vorstellen , dass Sie geantwortet haben, dass es nicht möglich ist , anstatt zu antworten, wie man ein Glas für Android Library Project erstellt. Alle anderen Antworten zeigen tatsächlich einen (funktionierenden) Weg, um ein solches Glas zu erstellen.
Ripopenid
3

Getestet mit adt 22.2.1

  1. Erstellen Sie Ihr Bibliotheksprojekt
  2. Leeres Projekt erstellen
  3. Fügen Sie Ihrem leeren Projekt ein Bibliotheksprojekt hinzu
  4. Projekt erstellen
  5. Im Ordner / gen finden Sie eine Klasse für Ihr Bibliotheksprojekt. Diese enthält Ihre Ressourcen für das lib-Projekt.
  6. JAR exportieren (nur diese Klasse auswählen ... aus dem Ordner / gen)
  7. Exportieren Sie JAR aus Ihrem lib-Projekt
  8. Benennen Sie exportierte Dateien um, um Inhalte zu komprimieren und zusammenzuführen
  9. Benennen Sie die endgültige Datei in JAR um und fügen Sie sie dem Projekt hinzu.
coltbg
quelle
Haben Sie versucht, Proguard auf das JAR anzuwenden? Wenn ja, wie hat es funktioniert? Gab es irgendwelche Schwierigkeiten oder Komplikationen?
Ripopenid
Schritt 6 hätte Ihren Ansatz zu einer besseren neueren Alternative zum Ansatz von @ CommonsWare gemacht, außer dass er nicht wirklich funktioniert, wenn der Benutzer (dh das Anwendungsprojekt) dieser Bibliothek seine eigenen Ressourcen definiert. Es sieht also so aus, als ob die Methode von CommonsWare immer noch die beste ist.
Ripopenid
Dies schließt nicht die Ressourcen ein, was normalerweise der Punkt hinter einem Android-Bibliotheksprojekt ist.
CommonsWare
1

Hier ist eine einfache Möglichkeit, dies mit Ameisen zu tun. Diese finden Sie im Volley-Quellcode. Fügen Sie den folgenden Code zu custom_rules.xml hinzu und erstellen Sie mitant jar

<?xml version="1.0" encoding="UTF-8"?>
<project name="volley-rules" default="help">

  <!-- A rule to generate the JAR for inclusion in an Android
       application. Output file will be bin/volley.jar -->
  <target name="jar" depends="-compile">
    <jar destfile="bin/volley.jar"
         basedir="bin/classes" />
  </target>
</project>
Nathan Schwermann
quelle
Schön, Idee mit Ameise, aber es wäre schwierig, .class eins nach dem anderen in xml
hinzuzufügen
1

Nach dem neuesten Android Studio v1.2 ist es so einfach wie ein Kuchen. Bereits beantwortete Komplettlösung mit Screenshots auf diesem Link

Nishant.
quelle
0

Mit Eclipse ADT v22.6.2 können Sie JAR einfach exportieren, indem Sie auf Datei-> Exportieren-> Java-> JAR-Datei klicken, Verzeichnisse und Ziel auswählen, in denen gespeichert werden soll.

someUser
quelle
3
Dies schließt nicht die Ressourcen ein, was normalerweise der Punkt hinter einem Android-Bibliotheksprojekt ist.
CommonsWare
Die Verwendung von Eclipse nur zum Erstellen von JAR ist nicht vollständig. Ich denke, es ist besser, direkt in Android Studio zu verwenden.
Subhanshuja