Erstellen Sie eine Android Jar-Bibliothek zur Verteilung

160

Ich kenne Android Library-Projekte, mit denen Sie ein Projekt mit gemeinsam genutzten Quellen erstellen können, das bei Bedarf in Android-Anwendungen abgerufen werden kann. Voraussetzung dafür ist jedoch, dass die Quelle verfügbar ist.

Ich suche nach einer Möglichkeit, eine Closed-Source-Bibliothek zu erstellen und zu verteilen, die in anderen Android-Projekten wie einer herkömmlichen JAR verwendet werden kann. Dies erfordert die Verwendung des Android-Compilers, sodass es sich nicht um eine Vanilla-Java-JAR-Datei handelt. FWIW, ich muss keine Ressourcen / Layouts in die JAR einbetten.

Ich habe http://andparcel.com/ gesehen, aber es fühlt sich wie eine Problemumgehung an, und ich würde lieber etwas verwenden, das von Google offiziell unterstützt wird. Außerdem muss ich sicherstellen, dass die von mir erstellte JAR mit der alten / neuen Version des Android SDK kompatibel ist (dh ich muss die Zielplattformversion usw. festlegen können).

Ermöglichen die neuesten Android-Toolsets das Erstellen / Verwenden von JAR-Binärdateien? Können Sie auf eine Dokumentation verweisen, wie ich das machen kann?

Psychotik
quelle
Hast du eine Antwort auf deine Frage? Ich habe eine ähnliche Anforderung. Wie haben Sie JAR-Dateien erstellt?
Krishnabhadra
Um eine .jar für Android zu vertreiben, benötigen Sie keinen Android dx-Compiler, der reguläre Java-Complier funktioniert. Wenn Sie ein JAR verteilen, wird es beim Erstellen der App in dx-Bytecode konvertiert.
ThomasW

Antworten:

49

Wenn Sie ein Android Library-Projekt ohne Ressourcen erstellen, erstellt das ADT (erstmals in r16 bemerkt) eine JAR-Datei mit demselben Namen wie das Projekt im Ordner 'bin'.

Freddroid
quelle
Bitte sehen Sie diese Frage stackoverflow.com/questions/12970802/…
vnshetty
1
Das bringt mir das Glas, aber muss ich den Ressourcenordner trotzdem verteilen? Der Versuch, Actionlock Sherlock und meine Projekte zu aktivieren, wird nicht kompiliert, da sie die Actionbar-Ressourcen nicht finden können.
Nathan Schwermann
1
@schwiz dies funktioniert nur für Projekte ohne Ressourcen (wie ich in der Antwort angegeben habe). Andernfalls müssen Sie es als Standardprojekt für die Android-Bibliothek importieren.
Freddroid
1
Ist das noch wahr? Ich sehe nicht myapp.jarim /binOrdner. Es gibt classes.jar, aber das ist es nicht, oder?
Müllsammler
Ich führe das neueste ADT aus und erhalte immer noch eine <Name des Projekts> .jar in meinem Ordner / bin. Aber wenn Ihr Projekt von Ressourcen abhängt, ist es nicht gut und das Projekt muss als Bibliotheksprojekt aufgenommen werden (Sie erhalten jedoch immer noch eine .jar.
Freddroid
23

Android bietet keine spezielle Art von Android-JAR. Sie können Ihrem Projekt jedoch eine build.xml hinzufügen und die JAR mit ant erstellen.

Meine build.xml sieht folgendermaßen aus:

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

Erstellen Sie die JAR, indem Sie sie ant jarim Hauptordner Ihres Projekts ausführen.

white_gecko
quelle
Versuchte dies und konnte eine JAR-Datei erstellen, aber die Größe war ungerade (nur 343 Bytes) im Vergleich zum Exportieren einer Bibliothek in JAR. Irgendeine Idee, welche Flaggen fehlen?
Shane Oliver
Sie können den Inhalt der JAR mit einem Archivprogramm überprüfen (JAR ist ZIP) und feststellen, was fehlt, und sie hinzufügen. Weitere Informationen finden Sie hier: ant.apache.org/manual/Tasks/jar.html
white_gecko
5
Mit den neuesten Android SDKs werden die Java-Dateien kompiliert bin/classes, so <jar destfile="MyAndroidLib.jar" basedir="bin/">sollte es sein<jar destfile="MyAndroidLib.jar" basedir="bin/classes/">
Theo
17

Sie können ein "normales" Java-Projekt erstellen und von dort Android.jar importieren. Anschließend haben Sie Zugriff auf alle Komponenten im SDK. Anschließend können Sie Ihr Projekt als JAR exportieren ... und von Ihrer Android-App laden. Dies funktioniert großartig und es scheint ein sehr einfacher Weg zu sein, dies zu tun.

Ferostar
quelle
1
In diesem Fall deklarieren Sie die Komponenten der Bibliothek wie Dienste, Aktivitäten, Rundfunkempfänger und Absichtsfilter. Muss die Client-Anwendung alle diese Deklarationen im Manifest halten?
Ron
@ferostar Wie kann ich android.jar in ein Java-Projekt importieren?
Krishnabhadra
Falls diese Bibliothek über Ressourcen verfügt, können Sie eine R.java generieren und zu JAR hinzufügen
15

Gehen Sie einfach zu den Eigenschaften des Projekts, für das Sie jar erstellen möchten. Klicken Sie auf die Registerkarte Android. und kreuzen Sie in der Is-Bibliothek an. Jetzt können Sie die JAR-Datei im Ordner bin sehen. Verwenden Sie sie dort, wo Sie sie verwenden möchten.

Dhrupal
quelle
2
Dies scheint zu funktionieren, wenn LibraryProject keine Ressourcen hat. Irgendeine Idee, wie man es mit Ressourcen zum Laufen bringt?
Nathan Schwermann
Dies ist jedoch eine schlechte Antwort, wenn Ihr Bibliotheksprojekt von anderen Projekten abhängt. Diese Referenzen werden nicht abgeholt.
Stevebot
10

Die einzige von Google offiziell unterstützte Lösung ist das Bibliotheksprojekt, für das der Quellcode verteilt werden muss. Sie können eine JAR auf normale Weise erstellen, jedoch keine Ressourcen darin einschließen oder referenzieren.

Leider denke ich, dass es auch nicht möglich ist, eine gepackte JAR in ein Bibliotheksprojekt aufzunehmen, um die Quellcode-Anforderungen zu umgehen.

Jeff Gilfelt
quelle
"Sie können eine JAR auf normale Weise erstellen, aber Sie können keine Ressourcen darin einschließen oder referenzieren." <- scheint in Eclipse nicht richtig zu funktionieren, wenn ich auf Android-Klassen verweise oder den Android-Compiler verwende. Hinweise, wie man das zum Laufen bringt?
Psychotik
5
Ich erstelle einfach ein normales Java-Projekt in Eclipse, füge die Datei android.jar zum Erstellungspfad hinzu und wähle dann Export - Java - Jar File.
Jeff Gilfelt
@JeffGilfelt und wenn Sie beispielsweise die Datei android.jar für das Verzeichnis android-13 sdk angeben, können Sie Ihre JAR-Bibliothek dann noch in Projekten für eine höhere API-Ebene verwenden?
Fran Marzoa
10

In der neuesten Version von Android Studio 1.2 wurde die Erstellung der JAR-Bibliothek so einfach wie Zeigen und Klicken gemacht.

Schritte zum folgen :

  • Gehe zu Datei -> Neu -> Neues Modul Geben Sie hier die Bildbeschreibung ein
  • Wählen Sie am Ende der Optionsliste "Java Library" Geben Sie hier die Bildbeschreibung ein
  • Geben Sie den Namen der jar lib und den Namen der Klasse ein und klicken Sie auf "Fertig stellen" Geben Sie hier die Bildbeschreibung ein
  • Das ist es !

Der nächste Schritt ist das Hinzufügen Ihrer Jar Library als Abhängigkeit in Ihrer App. So einfach ist das

  • Gehe zu Datei -> Projektstruktur -> Wähle 'App' -> Wähle 'Abhängigkeit'
  • Wählen Sie unten das '+' -> Wählen Sie 'Modulabhängigkeit'. Geben Sie hier die Bildbeschreibung ein
  • Wählen Sie Ihr soeben erstelltes jar lib-Modul aus Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein
  • Wählen Sie OK und das wars!

.... Oder Sie können einfach die folgende Zeile zu Ihrer App-Gradle-Datei hinzufügen

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 bewirbt das Android-Archiv (AAR), obwohl die von JAR unterstützte Version wieder in Android Studio verfügbar ist. Um den Unterschied zwischen AAR und JAR herauszufinden, klicken Sie auf diesen Link

Nishant.
quelle
Ich verstehe nicht, wie dies eine neue JAR-Datei erstellt. Es sieht so aus, als würden Sie ein neues Modul erstellen, das als Bibliothek in Ihrem Android-Projekt verwendet wird
Jejefcgb
Was?! Sie erstellen neues Glas aus dem Nichts?
Ewoks
@Ewoks: Nachdem Sie das Modul erstellt haben, müssen Sie die Klassen hinzufügen. Sobald Sie fertig sind, fügen Sie es als Abhängigkeit hinzu
Nishant.
2
Die Frage war: Es gibt eine implenzierte Bibliothek mit Quellcode. Wie mache ich jar daraus, so dass nur jar in einem anderen Projekt anstelle des gesamten Quellcodes der Bibliothek verwendet wird? Oder habe ich etwas verpasst?
Ewoks
2
@ Nishant. Hat für mich gearbeitet! Vielen Dank!
ramires.cabral
6

Versuchen Sie Folgendes: Dies 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. viel Glück.

Aayush Rana
quelle
1
Ich muss diesen Beitrag korrigieren: JAR-Dateien können nur Code enthalten, keine Android-Ressourcen. Wenn Ressourcen enthalten sind / benötigt werden, müssen wir das Bibliotheksprojekt offen halten und können nicht einfach eine einfache JAR-Datei verwenden.
Cody
@cody: Wie generieren wir eine JAR-Datei zusammen mit Ressourcen und verwenden sie in einem anderen Projekt?
Mahantesh M Ambi
1

Das ADT erstellt einen bin-Ordner, der alle Klassendateien für alle übereinstimmenden Quelldateien und Verzeichnisse in Ihrem Projekt enthält. Sie können mit dem Befehl jar ein jar-Archiv erstellen, das diese Klassendateien und Verzeichnisse enthält, und vermutlich Ihre Bibliothek, aber natürlich die Klassendateien Die Plattformebene wird nur für die aktuelle Ebene des Projektergebnisses ausgewählt. Sie benötigen für jede Plattformebene eine andere JAR-Datei. Das Tolle daran ist jedoch, dass die R.class-Datei in den Projektverzeichnisbaum aufgenommen wird und Sie daher Zugriff auf ihre Ressourcen haben. Ich weiß nicht, ob dies der offizielle Weg ist, Dinge in Android zu tun, aber es hat bei mir funktioniert.

David Evans
quelle
0

In unserem Projekt erstellen wir apk (mit apkbuilder), das in / system / framework installiert ist, und fügen dieses apk im Standardklassenpfad hinzu. Für die Kompilierung von Anwendungen mit dem JAR erstellen wir eine JAR-Datei (mit JAR C).

Hinweis: Wir haben keine Ressourcen in der Bibliothek.

Karan
quelle
0

.jar ist nur eine .zip-Datei, die eine .class-Datei enthält (Sie können versuchen, die Erweiterung einer .jar-Datei in .zip zu ändern, um das Ergebnis anzuzeigen). Sie können ganz einfach eine JAR-Bibliothek für jeden Zweck erstellen, indem Sie eine Klassendatei komprimieren.

Renzokuken
quelle
Nicht unbedingt wahr, siehe en.wikipedia.org/wiki/JAR_(file_format) für subtile Unterschiede (hauptsächlich Reihenfolge der Einträge innerhalb der ZIP)
iddo
0

Schritte :

1) Öffnen Sie die Datei project.properties

2) Mehrwert android.library=true

3) Datei speichern

4) Wählen Sie im Eclipse-Menü für das Projekt die Option " Automatisch erstellen" und dann " Reinigen"

Ergebnis: Ein brandneues Glas wird unter bin erstellt .

Pana Technica
quelle