2016-07-18 29 views
7

Ich arbeite daran, ein SDK zu erstellen, das in anderen Anwendungen verwendet werden kann.Erstellen Sie eine AAR, die von mehreren AARs abhängt

Meine Projektstruktur ist wie folgt:

ProjectFolder 
    | 
    +--AndroidLibs 
    |  | 
    |  +--UI (android library - AAR) 
    |  | 
    |  +--Protocol (android library - AAR) 
    |  | 
    |  +--infra (android library - AAR) 
    | 
    +--SDK(depends on UI, Protocol and Infra) 
    | 
    +--APP(depends on SDK) 

Wie Sie sehen können, wir drei verschiedene Bibliotheken, die wir arbeiten, die jeweils ein Modul in unserem System ist (infra, ui und Protokoll). Jeder von ihnen erstellt einen AAR.

Unser SDK ist ein Wrapper mit einigen API-Aufrufen zu den unteren Schichten.

Wir möchten einen AAR erstellen, der von allen anderen AARs abhängt, aber aus irgendeinem Grund, als wir versuchten, ihn auszuführen, heißt es, dass er den Quellcode für einige Klassen nicht finden kann.

Ich habe einige Fragen zu diesem Thema gefunden, aber sie haben nicht funktioniert. Auch versucht, mit transitive Abhängigkeiten zu arbeiten, aber das Endergebnis ist das gleiche - kann den Quellcode nicht finden.

  1. android-studio-how-to-package-single-aar-from-multiple-library-projects: Eine Antwort, die dort keine Lösung dafür (Google-Mitarbeiter) sagt.
  2. create-an-aar-with-multiple-aars-jars: Verwenden Sie die transitive Abhängigkeiten.
  3. Create Mojo for creating AAR with all "aar" dependencies

Gibt es etwas, was wir tun können?

+1

afaik aars haben diese Funktionalität nicht, da sie keine Dateien wie .pom enthalten. Am besten ist es, es auf jcenter oder maven hochzuladen. Von dort werden die Menschen in der Lage sein, Ihre aar sowie alle Aars, die konfiguriert wurden, mit zu ziehen. – Bill

+0

eine andere Möglichkeit ist, den src-Code aus jeder Abhängigkeit zu extrahieren, ihn als * .java-Dateien in Ihre src zu schreiben, dann kompilieren Sie die ganze Sache in ein .aar – Bill

Antwort

3

Aus meiner answer here:

Soweit ich weiß, Sie können nicht Aars innerhalb eines aar umfassen. Sie haben keine Konfigurationsdateien, die angeben, welche Abhängigkeiten sie benötigen. Sie können entweder

  1. Streifen Sie den Quellcode aus den Bibliotheken, die Sie verwenden, und kompilieren Sie es mit Ihrem aar. Dies funktioniert, wenn die UI/Protocal/Infra-Bibliotheken intern sind und Sie der einzige Anbieter sind.

  2. Betrachten zu bintray oder Maven Central Repository Hochladen

Nummer zwei mehr bevorzugt, da auf diese Weise alle Ihre Kunden zu tun hat, ist ein Link enthalten, wie compile 'com.abc.efg:version' alle Abhängigkeiten greifen Sie konfiguriert. Es ist auch eine viel bessere Option, da es Möglichkeiten gibt, mit Versionskonflikten umzugehen (zB mit exclude group).

Stellen Sie sich vor, wenn Ihr Client einen anderen SDK verwendet, der eine andere Version von UI/Protocal/Infra verwendet. Wenn Ihnen die aar mit der ersten Methode übergeben wurde, können sie das Projekt aufgrund von Versionskonflikten überhaupt nicht erstellen. Aber mit der zweiten Version können sie einfach tun

compile ('com.abc.efg:version') { exclude group: 'com.companyName.ui' } 

und frei von all diesen Kopfschmerzen sein. Ein echtes Beispiel ist das Facebook SDK. Es zieht Google Play-Dienste ein, aber die Leute nehmen das oft als eine Abhängigkeit für ihr Projekt auf und stoßen auf Probleme wie this.

+0

Danke für Ihre Antwort. 1. Die Bibliotheken sind zwar firmenintern, aber es gibt mehrere Teams und einige Produkte verwenden sie, so dass wir das nicht tun können. 2. Dies ist der Plan, aber es ist merkwürdig, dass diese Konfiguration nicht unterstützt wird. Ich dachte 'transitive' sollte dieses Problem lösen ... –

1

Da Ihre Projekte in der Regel auf internen Bibliotheken und Bibliotheken von Drittanbietern basieren.Die internen Bibliotheken können in Artifactory-Repositories veröffentlicht werden und die Abhängigkeiten über Artifactory mit Gradle auflösen.

Es ist einfach! Gehen Sie einfach durch die unten Artikel,

Das ist hoch skalierbar und seiner einfachen Code über mehrere Module zu erhalten.

Hoffe das würde dir helfen!