Das Hinzufügen lokaler .aar-Dateien zum Gradle-Build mit "flatDirs" funktioniert nicht


161

Mir ist diese Frage bekannt: Hinzufügen lokaler .aar-Dateien zu meinem Gradle-Build, aber die Lösung funktioniert bei mir nicht.

Ich habe versucht, diese Anweisung zur obersten Ebene meiner build.gradleDatei hinzuzufügen :

repositories {
    mavenCentral()
    flatDir {
        dirs 'libs'
    }
}

Ich habe die slidingmenu.aarDatei auch in /libsden dependenciesAbschnitt eingefügt und darauf verwiesen : compile 'com.slidingmenu.lib:slidingmenu:1.0.0@aar'aber es hat überhaupt nicht funktioniert.

Ich habe es auch versucht, compile files('libs/slidingmenu.aar')aber ohne Glück.

Was vermisse ich? Irgendwelche Ideen?

PS Android Studio 0.8.2


1
flatDirs + compile (Name: 'libname', ext: 'aar') funktioniert für mich unter Android Studio 8.2.0, + gradle 1.12. Es muss also etwas mit Ihrer Build-Datei nicht stimmen. Überprüfen Sie es noch einmal oder posten Sie mehr Code
als

Antworten:


295

Aufbauend auf Josiahs Antwort, hier ist, wie ich es zum Laufen gebracht habe.

Befolgen Sie seine Anweisungen (unter Bearbeiten) ( Datei -> Neu-> Neues Modul -> .JAR / .AAR importieren) und importieren Sie Ihr .AAR.

Fügen Sie dann in Ihrem Projekt build.gradle (nicht die oberste Ebene, die unter 'App') Folgendes hinzu (im Abschnitt Abhängigkeiten):

dependencies {
    compile project(':Name-Of-Your-Project')
}

Hinweis Der Name Ihres Projekts sollte mit dem Namen des Ordners übereinstimmen, der nach dem Import der AAR-Datei hinzugefügt wurde (auf derselben Ebene wie app/.ideaunter dem Ordner der obersten Ebene). Oder anders ausgedrückt ...

Meine Anwendung
  .Idee
  App
  build.gradle (hier wird ein Kompilierungsprojekt (': ProjectName') zum Abhängigkeitsabschnitt hinzugefügt)
  Projektname (wird nach dem Import automatisch hinzugefügt und entspricht dem Namen Ihrer AAR-Datei)
  bauen
  gradle
  etc

Dies funktionierte bei mir mit Android Studio 0.8.0. Vergessen Sie nicht, gradle zu synchronisieren (über die Symbolleistenschaltfläche oder unter Datei-> Synchronisieren ), nachdem Sie dies getan haben.

(Danke an Josiah, dass er mich in die richtige Richtung gebracht hat)

(Hinweis: Vorher habe ich versucht, es dem libs-Ordner hinzuzufügen und zu versuchen, die oberste Ebene build.gradleund die App-Ebene zu manipulieren build.gradle, aber nichts davon funktionierte für meine AAR-Dateien - JARs funktionieren einwandfrei, aber nicht für die AAR-Dateien.)


1
Huch! Dies hat den Trick getan, danke für die ausführliche Erklärung. Unter der Haube führt der Importmaster dasselbe aus, wie auf der Tools-Website beschrieben: "Eine weitere Option besteht darin, ein neues Gradle-Unterprojekt zu erstellen und das veröffentlichte Artefakt dieses Projekts als JAR- oder AAR-Datei zu verwenden, die Sie wiederverwenden möchten. Dann Sie Es kann einfach sein, dass andere Gradle-Unterprojekte von diesem neuen Unterprojekt abhängen. Erstellen Sie in diesem neuen Unterprojekt einfach ein build.gradle mit den folgenden Elementen: configuration.create ("default") artefakts.add ("default", Datei ('somelib.aar')) "
Alexey Dmitriev

Ich erhalte die Fehlermeldung: Error:(25, 0) Required keys [path] are missing from map {name=mylibrary-debug}.Wenn ich compile project(name:'mylibrary-debug').. Was vermisse ich?
MysticMagicϡ

2
Das aktuelle Gradle-Plugin hat dies gebrochen. Lösung hier: stackoverflow.com/a/28816265/560600
Sky Kelsey

1
Bitte führen Sie nach allen oben genannten Schritten auch Clean Build durch.
Anzeigen

1
In der Zeile habe compile project(':Name-Of-Your-Project')ich durch Name-Of-Your-Projectden Namen meiner .aar-Datei ersetzt (ohne die .aarErweiterung). Und es hat funktioniert.
Sufian

190

Update : Wie bereits bei @ amram99 erwähnt, wurde das Problem mit der Veröffentlichung von Android Studio v1.3 behoben.

Getestet und verifiziert mit den folgenden Spezifikationen

  • Android Studio v1.3
  • Gradle Plugin v1.2.3
  • Gradle v2.4

Was funktioniert jetzt?

  • Jetzt können Sie eine lokale AAR-Datei über die Option Datei> Neu> Neues Modul> .JAR / .AAR-Paket importieren in Android Studio v1.3 importieren

  • Die folgende Antwort gilt jedoch unabhängig von den Änderungen in Android Studio, da diese auf Gradle-Skripten basiert.


Alte Antwort: In einem kürzlich veröffentlichten Update haben die Mitarbeiter von Android die Aufnahme lokaler AAR-Dateien über die Menüoption "Neues Modul hinzufügen" von Android Studio aufgehoben. Überprüfen Sie die Ausgabe hier aufgeführt. Unabhängig von allem, was in die IDE-Funktionsliste ein- und ausgeht, funktioniert die folgende Methode, wenn Sie mit lokalen AAR-Dateien arbeiten. (Heute getestet):

Legen Sie die aar-Datei im libs-Verzeichnis ab (erstellen Sie sie bei Bedarf) und fügen Sie den folgenden Code in Ihr build.gradle ein:

dependencies {
   compile(name:'nameOfYourAARFileWithoutExtension', ext:'aar')
 }
repositories{
      flatDir{
              dirs 'libs'
       }
 }

1
Dies ist die richtige Antwort und die neueste Methode. Bitte stimmen Sie dieser Antwort zu;)
lmo

Ich habe Ihren Code kopiert, aber wissen Sie, warum ich diesen Fehler erhalten habe? "Fehler: Beim Konfigurieren des Projekts ': app' ist ein Problem aufgetreten.> Artefakt 'signalr-client-sdk-android-release.aar (: signalr-client-sdk-android-release :)' nicht gefunden. An folgenden Speicherorten gesucht: jitpack.io//signalr-client-sdk-android-release//… "
toddmo

10
Der repositoriesTeil geht in einen anderen, build.gradle um zu arbeiten - den globalen. Der dependenciesTeil geht in das Modul build.gradle. Deshalb habe ich den Fehler bekommen.
Toddmo

@toddmo Meine Antwort gilt also tatsächlich für lokale AAR-Dateien. dh eine .aar-Datei, die sich in Ihrem libs-Verzeichnis befindet.
Nishant.

1
Vielen Dank. Die alte Version hat bei mir nicht funktioniert, die neue Importmethode hat super funktioniert! Gradle 3.5, groovy 2.4.10
Arnold Schrijver

26

Bearbeiten: Die korrekte Möglichkeit (derzeit), eine lokale AAR-Datei als Build-Abhängigkeit zu verwenden, besteht darin, den Modulimport-Assistenten (Datei | Neues Modul | .JAR- oder .AAR-Paket importieren) zu verwenden, der die .aar automatisch als Bibliotheksmodul hinzufügt in Ihrem Projekt.

Alte Antwort

Versuche dies:

allprojects {
  repositories {
    jcenter()
    flatDir {
      dirs 'libs'
    }
  }
}

...

compile(name:'slidingmenu', ext:'aar')

1
Hat auch nicht funktioniert ... Es scheint
Alexey Dmitriev

Ich habe getan, wie Sie in der Bearbeitung gesagt haben, aber am Ende wurde nichts hinzugefügt. Im Assistenten habe ich den Pfad zur AAR-Datei ausgewählt und den Modulnamen angegeben. Nach dem Klicken auf Fertig stellen wurden Gradle-Dateien synchronisiert, aber es wurden keine neuen Dateien oder Zeilen in build.gradle angezeigt (es gab keine Änderungen in der Arbeitskopie meines Git). Ich habe es mit AAR- und JAR-Dateien mit dem gleichen Ergebnis versucht. (Ich benutze Android Studio 0.8.1)
Alexey Dmitriev

3
Diese alte Antwort funktioniert tatsächlich für mich, solange ich den flatDir { dirs 'libs' }im OP erwähnten Block mit AS 8.13 / Gradle 2.1
qix

4
Ich habe eine .aar-Datei mit einer neuen Importmethode importiert. Ich kann den Klassennamen der Bibliothek jedoch nicht sehen, wenn ich den halben Namen eingebe und Strg + Leertaste drücke. Die Bibliothek wird also immer noch nicht berücksichtigt. Irgendeine Idee?
MysticMagicϡ

1
Die bearbeitete Version funktioniert gut für Android Studio 1.2.1.1. Es muss kein anderes Gradel-Scripting durchgeführt werden. Sie können ein neues Modul wie oben beschrieben erstellen. Wählen Sie im Dialogfeld 'Neues Modell erstellen' den Pfad zu Ihrer Bibliotheks-AAR-Datei aus, z. B. MyLib \ mylibrary \ build \ output \ aar. AS kopiert die Datei in einen neuen lokalen Ordner. Erstellen Sie Ihr Anwendungsprojekt neu und das neue Bibliotheksmodul wird in der Projektansicht angezeigt. Jetzt können Sie das Bibliotheksmodul als Abhängigkeit für Ihr Anwendungsmodul (zB 'App') in der Projektstruktur hinzufügen: Projektstruktur | Module | App | Abhängigkeiten | Hinzufügen | Modulabhängigkeit.
Christian Schulzendorff

15

Ich habe dies auf Android Studio 2.1 funktioniert. Ich habe ein Modul namens "Native_Ads", das von mehreren Projekten gemeinsam genutzt wird.

Zuerst habe ich in meinem Native_ads-Modul ein Verzeichnis mit dem Namen 'aars' erstellt und dann die aar-Datei dort abgelegt.

Verzeichnisaufbau:

libs/
aars/    <-- newly created
src/
build.gradle
etc

Dann ändern sich die anderen:

Gradle-Datei der obersten Ebene:

allprojects {
    repositories {
        jcenter()
        // For module with aar file in it
        flatDir {
            dirs project(':Native_Ads').file('aars')
        }
    }
}

Build.gradle-Datei des App-Moduls: - Keine Änderungen

Settings.gradle-Datei (um das Modul einzuschließen):

include ':app'
include 'Native_Ads'
project(':Native_Ads').projectDir = new File(rootProject.projectDir, '../path/to/Native_Ads')

Gradle-Datei für das Native_Ads-Modul:

repositories {
    jcenter()
    flatDir {
        dirs 'aars'
    }
}
dependencies {
    compile(name:'aar_file_name_without_aar_extension', ext:'aar')
}

Das ist es. Reinigen und bauen.


Funktioniert auch für mehrere AAR-Dateien in 'Native_Ads'. Sehr gute Lösung!
Christian Schulzendorff

8

Am einfachsten ist es jetzt, es als Modul hinzuzufügen

Geben Sie hier die Bildbeschreibung ein

Dadurch wird ein neues Modul erstellt, das die aar-Datei enthält. Sie müssen dieses Modul anschließend nur noch als Abhängigkeit einfügen


Haben Sie vielleicht eine Idee, warum meine nextSchaltfläche im Create New ModuleDialogfeld nach Auswahl von Importieren ausgegraut ist JAR/AAR Package?
Kevin Crain

1
Beachten Sie, dass ich die .aar-Datei ausgewählt und ihr einen Namen gegeben habe
Kevin Crain

Ich habe den Grund herausgefunden, die IDE überprüft den Pfad, um festzustellen, ob sich die .aarDatei in einem Projektverzeichnis befindet. Ich habe sie einfach .aarauf meinem Desktop abgelegt und erneut versucht, und es funktioniert, danke für Ihre Lösung!
Kevin Crain

Vielleicht eine blöde Frage, aber in Bezug auf so you just need to include that module as a dependency afterwards- wie machst du das?
Boltup_im_coding

1
@Marian Klühspies Ich sehe jetzt, ich war mir nicht sicher, ob das includein der settings.gradlegenug sein sollte. Ich habe es zum Laufen gebracht. Vielen Dank!
Boltup_im_coding

7

Dies ist meine Struktur und wie ich das löse:

MyProject / app / libs / mylib-1.0.0.aar

MyProject / app / myModulesFolder / myLibXYZ

Auf build.gradle

von Project / app / myModulesFolder / myLibXYZ

Ich habe folgendes gesagt:

repositories {
   flatDir {
    dirs 'libs', '../../libs'
  }
}
compile (name: 'mylib-1.0.0', ext: 'aar')

Fertig und funktioniert einwandfrei. Mein Submodul XYZ hängt von einer Bibliothek des Hauptmoduls ab.


5

Sie können es so machen. Es muss im Maven-Format vorliegen:

repositories {
  maven { url uri('folderName')}
}

Und dann muss Ihr AAR in eine Ordnerstruktur für eine Gruppen-ID "com.example" gehen:

folderName/
  com/
    example/
       verion/
          myaar-version.aar

Dann als Abhängigkeit referenzieren:

compile 'com.example:myaar:version@aar'

Wo versionist die Version Ihrer aar-Datei (dh 3.0 usw.)


3

Für alle, die dieses Problem ab Android Studio 1.4 haben, habe ich es zum Laufen gebracht, indem ich ein Modul innerhalb des Projekts erstellt habe, das zwei Dinge enthält.

  1. build.gradle mit folgenden Inhalten:

    configurations.create("default")

    artifacts.add("default", file('facebook-android-sdk-4.7.0.aar'))

  2. die aar-Datei (in diesem Beispiel 'facebook-android-sdk-4.7.0.aar')

Fügen Sie dann die neue Bibliothek als Modulabhängigkeit hinzu. Jetzt können Sie einen erstellten AAR verwenden, ohne die Quellen in das Projekt einzubeziehen.

Dank an Facebook für diesen Hack. Ich habe die Lösung gefunden, als ich das Android SDK in ein Projekt integriert habe.


Welche Art von Modul haben Sie erstellt? Datei> Neu> Neues Modul>?
Al Lelopath

In diesem Fall lautet der Modultyp "Android Library", wenn Sie die GUI zum Erstellen eines Moduls verwenden. Sie können ein vorhandenes Modul in eine Android-Bibliothek verwandeln, indem Sie das build.gradle des Moduls ändern. Wechsel apply plugin: 'com.android.application'zuapply plugin: 'com.android.library'
Victor Ude

Ist es möglich, mehrere aar´s zu einem Modul hinzuzufügen? Andernfalls müsste ich über 10 Gradle-Module erstellen, um meine AAR-Dateien einzuschließen
Marian Klühspies

@ MarianKlühspies hat sich sehr verändert, seit ich diese Antwort geschrieben habe. Ich würde empfehlen, die offizielle Dokumentation zu versuchen, um ein aar in Ihr Projekt aufzunehmen: developer.android.com/studio/projects/…
Victor Ude

3

In meinem Fall hat keine der oben genannten Antworten funktioniert! da hatte ich verschiedene productFlavors nur hinzugefügtrepositories{ flatDir{ dirs 'libs' } }

funktioniert nicht! Am Ende habe ich den genauen Speicherort des libs- Verzeichnisses angegeben:

repositories{
flatDir{
    dirs 'src/main/libs'
}

}}

Ich denke, man sollte flatDirs wie dieses einführen, wenn es in build.gradle verschiedene productFlavors gibt


2

In meinem Fall habe ich einfach die aar-Datei in libs abgelegt und hinzugefügt

dependencies { ... api fileTree(dir: 'libs', include: ['*.aar']) ... }

in build.gradle und es funktioniert. Ich denke, dass es mit der standardmäßig generierten Abhängigkeit ähnlich ist:

implementation fileTree(dir: 'libs', include: ['*.jar'])


Der "api fileTree (dir: 'libs', include: ['* .aar])" hat großartig funktioniert. Es hat nicht funktioniert, wenn ich "Implementierung" anstelle von "API" verwendet habe. Ich konnte Victor Ude's Lösung nie dazu bringen, mit mehreren Aars zu arbeiten. Eine zusätzliche Erkenntnis: Wenn Sie Ressourcen (z. B. Layouts) verwenden, stellen Sie sicher, dass die von Ihnen verknüpften aar (s) keine Ressource mit demselben Namen wie in Ihrer apk enthalten. Möglicherweise erhalten Sie den Fehler, dass eine der IDs im Layout nicht gefunden werden kann. Das Problem ist, dass der falsche Namespace für id im aar-Layout verwendet wird.
Tom Rutchik

1

Diese Zeile enthält alle aarund jarDateien aus dem libsOrdner:

implementation fileTree(include: ['*.jar', '*.aar'], dir: 'libs/')

1

Diese Lösung funktioniert mit Android Studio 4.0.1.

Abgesehen davon, dass Sie ein neues Modul erstellen, wie in der obigen Lösung vorgeschlagen, können Sie diese Lösung ausprobieren.

Wenn Ihre Anwendung mehrere Module enthält und Sie nur einem der Module aar hinzufügen möchten, ist diese Lösung hilfreich.

In Ihrem Root-Projekt build.gradle

hinzufügen

repositories {
flatDir {
    dirs 'libs'
}}

Dann in dem Modul, in dem Sie die .aar-Datei lokal hinzufügen möchten. Fügen Sie einfach die folgenden Codezeilen hinzu.

dependencies {
api fileTree(include: ['*.aar'], dir: 'libs')
implementation files('libs/<yourAarName>.aar')

}}

Viel Spaß beim Codieren :)


0

Fügen Sie unten im Implementierungsprojekt für App Gradle-Dateien hinzu (Pfad: ': Projektname')


0

Wenn Sie Kotlin Gradle DSL bereits verwenden, ist die Alternative dazu:

Hier ist meine Projektstruktur

|-root
|----- app
|--------- libs // I choose to store the aar here
|-------------- my-libs-01.aar
|-------------- my-libs-02.jar
|--------- build.gradle.kts // app module gradle
|----- common-libs // another aar folder/directory
|----------------- common-libs-01.aar
|----------------- common-libs-02.jar
|----- build.gradle.kts // root gradle

Meine app/build.gradle.kts

  1. Mit einfachem Ansatz mit fileTree
// android related config above omitted...

dependencies {
    // you can do this to include everything in the both directory
    // Inside ./root/common-libs & ./root/app/libs
    implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar", "*.aar"))))
    implementation(fileTree(mapOf("dir" to "../common-libs", "include" to listOf("*.jar", "*.aar"))))
}
  1. Verwenden Sie den gleichen Ansatz wie beim Abrufen aus dem lokalen / Remote-Maven-Repository mit flatDirs
// android related config above omitted...

repositories {
    flatDir {
        dirs = mutableSetOf(File("libs"), File("../common-libs") 
    }
}

dependencies {
   implementation(group = "", name = "my-libs-01", ext = "aar")
   implementation(group = "", name = "my-libs-02", ext = "jar")

   implementation(group = "", name = "common-libs-01", ext = "aar")
   implementation(group = "", name = "common-libs-02", ext = "jar")
}

Das groupwurde aufgrund seiner obligatorischen (nicht optional / hat Standardwert) in Kotlin benötigt implementation, siehe unten:

// Filename: ReleaseImplementationConfigurationAccessors.kt
package org.gradle.kotlin.dsl

fun DependencyHandler.`releaseImplementation`(
    group: String,
    name: String,
    version: String? = null,
    configuration: String? = null,
    classifier: String? = null,
    ext: String? = null,
    dependencyConfiguration: Action<ExternalModuleDependency>? = null
)

Haftungsausschluss: Der Unterschied zwischen flatDirsNr. 1 und Nr. 2, ich weiß immer noch nicht viel. Vielleicht möchten Sie diese Antwort bearbeiten / kommentieren.

Verweise:

  1. https://stackoverflow.com/a/56828958/3763032
  2. https://github.com/gradle/gradle/issues/9272

0

Diese Lösung funktioniert mit Android Studio 4.0.1.

Abgesehen davon, dass Sie ein neues Modul erstellen, wie in der obigen Lösung vorgeschlagen, können Sie diese Lösung ausprobieren.

Wenn Ihre Anwendung mehrere Module enthält und Sie nur einem der Module aar hinzufügen möchten, ist diese Lösung hilfreich.

In Ihrem Root-Projekt build.gradle

hinzufügen

repositories {
mavenCentral()
flatDir {
    dirs 'libs'
}

Dann in dem Modul, in dem Sie die .aar-Datei lokal hinzufügen möchten. Fügen Sie einfach die folgenden Codezeilen hinzu.

dependencies {
api fileTree(include: ['*.aar'], dir: 'libs')
implementation files('libs/<yourAarName>.aar')

}}

Viel Spaß beim Codieren :)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.