Frage Erstellen Sie eine AAR, die von mehreren AARs abhängt


Ich arbeite daran, ein SDK zu erstellen, das in anderen Anwendungen verwendet werden kann.

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, haben wir 3 verschiedene Bibliotheken, an denen wir arbeiten, jeder ist ein Modul in unserem System (infra, ui und Protokoll). Jeder von ihnen erstellt einen AAR.

Unser SDK ist ein Wrapper mit einigen API-Aufrufen für die unteren Ebenen.

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. Habe auch versucht mit zu arbeiten transitive Abhängigkeiten, aber das Endergebnis ist das gleiche - kann den Quellcode nicht finden.

  1. android-studio-how-to-package-single-aar-from-multiple-library-projekte: Eine Antwort, die besagt, dass es dafür keine Lösung gibt (Google-Mitarbeiter).
  2. create-a-aar-mit-mehreren-aars-jars: Benutze die transitive Abhängigkeiten.
  3. Erstellen Sie Mojo zum Erstellen von AAR mit allen "aar" Abhängigkeiten

Können wir noch etwas anderes machen?


7
2017-07-18 15:46


Ursprung


Antworten:


Von meinem antworte hier:

So weit ich weiß, können Sie keine Aare in ein Aar aufnehmen. Sie haben keine Konfigurationsdateien, die angeben, welche Abhängigkeiten sie benötigen. Du kannst entweder

  1. Entkeime den Quellcode aus den verwendeten Bibliotheken und kompiliere ihn mit deinem aar. Dies funktioniert, wenn die UI / Protocal / Infra-Bibliotheken intern sind und Sie der einzige Anbieter sind.

  2. Ziehe das Hochladen auf Bintray oder Maven Central Repository

Nummer zwei ist mehr vorzuziehen, da auf diese Weise Ihr Client nur einen Link wie z compile 'com.abc.efg:version' um alle von Ihnen konfigurierten Abhängigkeiten zu erfassen. Es ist auch eine viel bessere Option, weil es Möglichkeiten gibt, mit Versionskonflikten umzugehen (zB mit exclude group).

Stellen Sie sich vor, Ihr Client würde einen anderen SDK verwenden, 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 sei frei von all diesen Kopfschmerzen. Ein echtes Beispiel ist das Facebook SDK. Es zieht google's play-services an, aber die Leute nehmen das oft schon als Abhängigkeit für ihr Projekt auf und stoßen auf Probleme wie Dies.


3
2017-07-21 22:42



Da Ihre Projekte in der Regel sowohl auf internen als auch auf externen Bibliotheken 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! Gehe einfach durch die folgenden Artikel,

Dies ist hoch skalierbar und es ist einfach, den Code über mehrere Module hinweg zu verwalten.

Hoffe das würde dir helfen!


1
2017-07-27 16:50