2014-02-28 8 views
7

Ich habe ein Android-Bibliotheksprojekt FooLib. FooLib verweist auf Dinge wie Android Context s, erfordert aber keine Ressourcendateien (Dinge in res/), also verpacke ich gerade dies als JAR für meine App zu konsumieren.Kann eine Android-Bibliothek JAR von einer Android-Bibliothek AAR abhängen?

Ich will jetzt machen FooLib hängen von BarLib, aber BarLibtut Verwendung Ressourcen, damit ich nicht BarLib als JAR-Paket kann. Stattdessen ist es als AAR verpackt. Ist es für mich möglich, FooLib von BarLib abhängig zu machen, aber weiterhin FooLib als JAR-Paket? Oder zwingt mich eine AAR-Abhängigkeit in FooLib dazu, es auch zu einem AAR zu machen?

+1

Wie kann ein JAR von irgendetwas "abhängen"? Es ist nur ein Container für Klassen. –

+0

Hmm, ja, vielleicht hätte ich es ausdrücken sollen - "Kann ein Android Library-Projekt, das als JAR gepackt werden kann, von einem anderen Android Library-Projekt abhängen, das Ressourcen verwendet (und daher als AAR verpackt ist) und trotzdem als JAR gepackt wird?"Ich vermute, die Antwort ist nein, aber ich möchte nur bestätigen. – Matthew

Antwort

5

Wenn Sie ein Projekt haben, das JAR-Dateien und AAR-Dateien als Abhängigkeiten enthält (siehe Hinweis unten), können Sie Android-spezifische JARs als Abhängigkeiten verwenden, die auf Klassen in den Android-APIs basieren, die JAR-Dateien jedoch nicht enthält Android-Ressourcen, wie Sie bereits wissen. Nur weil es von Android-Klassen abhängt, bedeutet das nicht, dass es als AAR verpackt werden muss.

Hier spreche ich über, was ist vielleicht ein Einzel-Modul-Projekt, das eine Reihe von JAR und AAR-Abhängigkeiten enthält. Eine JAR-Datei ist nur eine Sammlung von Klassendateien (und möglicherweise nicht von Android stammende Ressourcen und andere Dateien) und hat kein Gefühl für Abhängigkeiten, daher gibt es nichts zu brechen. Wenn es an der Zeit ist, den Build zu erstellen, bündelt der Builder lediglich alles zusammen und packt es und prüft nicht, ob die JAR nicht lösbare Abhängigkeiten von anderen Klassen aufweist - Sie werden mit Classloader-Ausnahmen zur Laufzeit herausfinden.

Wenn Sie sprechen Bibliothek Module in einem Multimodul-Projekt in der IDE, dann ist das eine andere Sache. Wenn Sie ein Modul A haben, das zu einem einfachen JAR kompilieren kann (es verwendet die apply plugin: 'java'-Anweisung in der Build-Datei), dann kann es nicht von einem Android-Modul (apply plugin: 'android-library') abhängen, das zu einem AAR kompiliert wird. Dies wird wahrscheinlich nie oder zumindest in absehbarer Zeit nicht behoben sein. Es liegt daran, dass Android-Module eine viel komplexere Vorstellung von Quellordnern haben und das Java-Plugin in Gradle die Quellgruppen von Android nicht verstehen kann.

Das Gegenteil ist wahr, obwohl - Android-Module können auf einfache Java-Module abhängen.

HINWEIS

Aufgrund von Einschränkungen noch nicht im Gradle Builder gelöst, können Sie lokale AARs auf die gleiche Art und Weise Zugriff auf nicht Sie als JAR-Dateien Dateien in Ihrem Build tun (indem man sich über compile files(...) Aussagen Referenzierung); Sie müssen Gradle vortäuschen, dass sie sich in einer Art Maven-Repository befinden (vielleicht indem Sie sie in ein tatsächliches Maven-Repository setzen, das lokal sein kann). Eine Abhilfe finden Sie unter Adding local .aar files to my gradle build, wenn Sie sie benötigen.

+0

Ja, ich bin Sprechen wir über Bibliotheksmodule in einem Multimodul-Projekt Angenommen, Modul A und Modul B sind beide Android-Module (beide haben das 'apply plugin: 'android-library'-Anweisungen in ihren build.gradle-Dateien). Es scheint, dass ich sie noch benutzen kann http://StackOverflow.com/a/19484146/128948 um Modul A als JAR zu verpacken, wenn es keine Ressourcen benötigt Wenn Modul B Ressourcen benötigt und ich es als AAR gepackt habe, kann ich Modul A von Modul B abhängig machen und noch Paket-Modul A als JAR? – Matthew

+0

Das sieht aus wie es funktionieren sollte android-library plugi ns können voneinander abhängen, und Jake Whartons Skript sieht so aus, als ob es funktionieren sollte, um einen JAR-Ausgang aus dem Modul zu bekommen. Ich glaube, dass das Modul mit diesen Änderungen zwei Ausgänge, AAR und JAR, generieren wird. –

+0

Eine Frage zu diesem ... weil appcompat-v7 sowohl .aar als auch .jar im selben maven-Unterordner anbietet ... wenn ich die Abhängigkeit festlege, wählt gradle immer die .aar-Datei und natürlich das gradle java-plugin weiß nicht, was es ist ... gibt es eine Möglichkeit, das .jar über das .aar zu wählen, selbst wenn das POM Paket .aar spezifiziert? –

1

Da AAR format Klassen nicht direkt als JAR-Dateien enthält, ist es für ein nicht-Android-Projekt nicht sinnvoll. Daher wäre es besser, FooLib zu einem AAR zu machen.

Eine andere Lösung wäre, JAR-Bibliothek aus BarLib zu extrahieren und davon abhängig zu sein.

+0

Ich bin nicht auf der Suche nach FooLib in einem Nicht-Android-Projekt, aber ich möchte FooLib als JAR behalten, um die Kompatibilität zu maximieren, da es ein AAR, ich wäre nicht in der Lage, es in meinen Ant-basierten Android-Apps zu verwenden. Um die ursprüngliche Frage zu beantworten, sagst du "nein, eine Android-Bibliothek JAR kann nicht von einer Android-Bibliothek AAR abhängen"? – Matthew