Dodawanie lokalnych plików .aar do kompilacji Gradle przy użyciu „flatDirs” nie działa


159

Jestem świadomy tego pytania: Dodawanie lokalnych plików .aar do mojej kompilacji Gradle, ale rozwiązanie nie działa dla mnie.

Próbowałem dodać to oświadczenie do najwyższego poziomu mojego build.gradlepliku:

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

Włożyłem również slidingmenu.aarplik do /libsi odniosłem się do niego w dependenciessekcji: compile 'com.slidingmenu.lib:slidingmenu:1.0.0@aar'ale to w ogóle nie działało.

Ja też próbowałem, compile files('libs/slidingmenu.aar')ale bez powodzenia.

czego mi brakuje? Jakieś pomysły?

PS Android Studio 0.8.2


1
flatDirs + compile (name: 'libname', ext: 'aar') działa dla mnie na Android Studio 8.2.0, + gradle 1.12. Więc musi być coś nie tak z plikiem kompilacji. Sprawdź to jeszcze raz lub wyślij więcej kodu
niż

Odpowiedzi:


293

Opierając się na odpowiedzi Josiaha, oto jak to działa.

Postępuj zgodnie z jego instrukcjami (pod edycją) ( Plik -> Nowy-> Nowy moduł -> Importuj .JAR / .AAR ) i zaimportuj .AAR.

Następnie w swoim projekcie build.gradle (nie na najwyższym poziomie, ten pod 'app') dodaj następujące elementy (w sekcji zależności):

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

Uwaga Nazwa-Twojego-projektu powinna być zgodna z nazwą folderu, który został dodany po zaimportowaniu pliku AAR (na tym samym poziomie, co app/.ideaw folderze najwyższego poziomu). Albo inaczej ...

Moja aplikacja
  .pomysł
  aplikacja
  build.gradle (tutaj jest miejsce, w którym można dodać projekt kompilacji (': ProjectName') do sekcji zależności)
  ProjectName (dodawane automatycznie po zaimportowaniu, pasujące do nazwy twojego pliku aar)
  budować
  gradle
  itp

To zadziałało dla mnie z Androidem Studio 0.8.0. Nie zapomnij zsynchronizować gradle (za pomocą przycisku na pasku narzędzi lub w Plik-> Synchronizuj ) po wykonaniu tej czynności.

(Dziękuję Josiahowi za poprowadzenie mnie we właściwym kierunku)

(Uwaga: wcześniej próbowałem dodać go do folderu libs, próbując manipulować najwyższym poziomem build.gradlei poziomem aplikacji build.gradle, ale nic z tego nie działało w przypadku moich plików aars - jar będzie działał dobrze, ale nie pliki aar)


1
Yikes! To załatwiło sprawę, dziękuję za szczegółowe wyjaśnienie. Pod maską wzorca importu działa to samo, co opisano w witrynie Narzędzia: „Inną opcją jest utworzenie nowego podprojektu Gradle i uczynienie opublikowanym artefaktem tego projektu plikiem jar lub aar, którego chcesz ponownie użyć. może po prostu mieć inne projekty podrzędne Gradle zależne od tego nowego projektu podrzędnego. W tym nowym projekcie podrzędnym po prostu utwórz plik build.gradle zawierający: konfiguracje.create ("default") artifacts.add ("default", plik ('somelib.aar')) ”
Alexey Dmitriev

Pojawia się błąd: Error:(25, 0) Required keys [path] are missing from map {name=mylibrary-debug}.jeśli używam compile project(name:'mylibrary-debug')… Czego mi brakuje?
MysticMagicϡ,

2
Niedawna wtyczka gradle zepsuła to. Rozwiązanie tutaj: stackoverflow.com/a/28816265/560600
Sky Kelsey

1
Po wykonaniu wszystkich powyższych czynności wykonaj również czystą kompilację.
Reklamy

1
W wierszu compile project(':Name-Of-Your-Project')zastąpiłem Name-Of-Your-Projectnazwą mojego pliku .aar (bez .aarrozszerzenia). I zadziałało.
Sufian

190

Aktualizacja : jak wspomniał @ amram99, problem został rozwiązany w momencie wydania Android Studio v1.3.

Przetestowane i zweryfikowane z poniższymi specyfikacjami

  • Android Studio v1.3
  • wtyczka gradle v1.2.3
  • Gradle v2.4

Co teraz działa

  • Teraz możesz zaimportować lokalny plik aar za pomocą opcji Plik> Nowy> Nowy moduł> Importuj pakiet .JAR / .AAR w Android Studio v1.3

  • Jednak poniższa odpowiedź jest prawdziwa i skuteczna niezależnie od zmian w Android Studio, ponieważ jest ona oparta na skryptach gradle.


Stara odpowiedź: W ostatniej aktualizacji użytkownicy Androida złamali włączanie lokalnych plików AAR za pomocą opcji menu dodawania nowego modułu w Android Studio. Sprawdź problem wymieniony tutaj. Niezależnie od wszystkiego, co wchodzi i wychodzi z listy funkcji IDE, poniższa metoda działa, jeśli chodzi o pracę z lokalnymi plikami aar. (Przetestowałem ją dzisiaj):

Umieść plik aar w katalogu libs (utwórz go w razie potrzeby), a następnie dodaj następujący kod do pliku build.gradle:

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

1
To jest właściwa odpowiedź i najnowszy sposób na zrobienie tego. Proszę o głosowanie za tą odpowiedzią;)
lmo

Skopiowałem Twój kod, ale czy wiesz, dlaczego mógł wystąpić ten błąd? „Błąd: wystąpił problem podczas konfigurowania projektu„: aplikacja ”.> Artefakt„ signalr-client-sdk-android-release.aar (: signalr-client-sdk-android-release :) ”nie został znaleziony. Wyszukiwane w następujących lokalizacjach: jitpack.io//signalr-client-sdk-android-release//… "
toddmo

10
repositoriesCzęść idzie w różnych build.gradle w celu pracy - globalny jeden. dependenciesCzęść idzie w modułu build.gradle. Dlatego otrzymałem błąd.
toddmo

@toddmo Więc moja odpowiedź faktycznie dotyczy lokalnych plików AAR. tj. plik .aar znajdujący się w katalogu libs.
Nishant.

1
Dzięki. Stara wersja nie działała dla mnie, nowy sposób importowania działał świetnie! Gradle 3.5, groovy 2.4.10
Arnold Schrijver

26

Edycja: poprawnym sposobem (obecnie) wykorzystania lokalnego pliku AAR jako zależności kompilacji jest użycie kreatora importu modułów (Plik | Nowy moduł | Importuj pakiet .JAR lub .AAR), który automatycznie doda plik .aar jako moduł biblioteki w swoim projekcie.

Stara odpowiedź

Spróbuj tego:

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

...

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

1
To też nie zadziałało ... Wygląda na to, że to znany błąd, który nie został jeszcze naprawiony: code.google.com/p/android/issues/detail?id=55863
Alexey Dmitriev

Zrobiłem tak, jak powiedziałeś w edycji, ale na końcu nic nie zostało dodane. W kreatorze wybrałem ścieżkę do pliku AAR, podałem nazwę modułu. Po kliknięciu Zakończ synchronizowano pliki Gradle, ale nie pojawiły się żadne nowe pliki ani żadne linie w pliku build.gradle (nie było żadnych zmian w kopii roboczej mojego Gita). Próbowałem z plikami AAR i JAR z tym samym wynikiem. (Używam Android Studio 0.8.1)
Alexey Dmitriev

3
Ta stara odpowiedź faktycznie działa dla mnie, o ile flatDir { dirs 'libs' }
dołączę

4
Zaimportowałem plik .aar używając nowej metody importu. Ale nie mogę zobaczyć nazwy klasy biblioteki, kiedy wpisuję połowę nazwy i naciskam ctrl + spacja. Więc nadal nie bierze pod uwagę biblioteki. Dowolny pomysł?
MysticMagicϡ,

1
Wersja edytowana działa dobrze w Android Studio 1.2.1.1. Nie trzeba wykonywać żadnych innych skryptów ocen. Możesz utworzyć nowy moduł, jak opisano powyżej. W oknie dialogowym „Utwórz nowy model” wybierz ścieżkę do pliku aar biblioteki, na przykład MyLib \ mylibrary \ build \ output \ aar. AS skopiuje plik do nowego folderu lokalnego. Przebuduj projekt aplikacji, a nowy moduł biblioteki zostanie wyświetlony w widoku projektu. Teraz możesz dodać moduł biblioteki jako zależność dla swojego modułu aplikacji (np. „Aplikacja”) w strukturze projektu: Struktura projektu | moduły | aplikacja | zależności | Dodaj | Zależność modułu.
Christian Schulzendorff,

15

Mam to działające na Android Studio 2.1. Mam moduł o nazwie „Native_Ads”, który jest współużytkowany w wielu projektach.

Najpierw utworzyłem katalog w moim module Native_ads o nazwie „aars”, a następnie umieściłem tam plik aar.

Struktura katalogów:

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

Następnie inne zmiany:

Plik Gradle najwyższego poziomu:

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

Plik build.gradle modułu aplikacji: - bez zmian

Plik settings.gradle (w tym moduł):

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

Plik Gradle dla modułu Native_Ads:

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

Otóż ​​to. Oczyść i zbuduj.


Działa również w przypadku wielu plików aar w „Native_Ads”. Bardzo dobre rozwiązanie!
Christian Schulzendorff

8

Najłatwiej jest teraz dodać go jako moduł

wprowadź opis obrazu tutaj

Spowoduje to utworzenie nowego modułu zawierającego plik aar, więc wystarczy później dołączyć ten moduł jako zależność


Czy może masz pomysł, dlaczego mój nextprzycisk jest wyszarzony w Create New Moduleoknie dialogowym po wybraniu Importuj JAR/AAR Package?
Kevin Crain

1
Zauważ, że wybrałem plik .aar i nadałem mu nazwę
Kevin Crain

Znalazłem przyczynę, IDE sprawdza ścieżkę, aby określić, czy .aarplik znajduje się w katalogu projektu, po prostu umieściłem plik .aarna pulpicie i ponowiłem próbę i działa, dzięki za rozwiązanie!
Kevin Crain

Może głupie pytanie, ale dotyczące so you just need to include that module as a dependency afterwards- jak to robisz?
boltup_im_coding

1
@Marian Klühspies teraz widzę, że nie był pewien, czy po includew settings.gradlemiał być za mało. Mam to działające. Dzięki!
boltup_im_coding

7

To jest moja struktura i jak to rozwiązuję:

MyProject / app / libs / mylib-1.0.0.aar

MyProject / app / myModulesFolder / myLibXYZ

Na build.gradle

z Project / app / myModulesFolder / myLibXYZ

Położyłem to:

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

Gotowe i działa dobrze, mój podmoduł XYZ zależy od biblioteki z głównego modułu.


5

Możesz to zrobić w ten sposób. Musi mieć format Maven:

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

Następnie AAR musi przejść do struktury folderów dla identyfikatora grupy „com.example”:

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

Następnie odniesienie jako zależność:

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

Gdzie versionjest wersja twojego pliku aar (np. 3.0 itd.)


3

Dla każdego, kto ma ten problem od Android Studio 1.4, uruchomiłem go, tworząc moduł w ramach projektu, który zawiera 2 rzeczy.

  1. build.gradle z następującą zawartością:

    configurations.create("default")

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

  2. plik aar (w tym przykładzie „facebook-android-sdk-4.7.0.aar”)

Następnie dołącz nową bibliotekę jako zależność modułu. Teraz możesz użyć zbudowanego aar bez uwzględniania źródeł w projekcie.

Podziękowania dla Facebooka za ten hack. Rozwiązanie znalazłem podczas integracji Android SDK z projektem.


Jaki moduł stworzyłeś? Plik> Nowy> Nowy moduł>?
Al Lelopath

W tym przypadku typ modułu to „Biblioteka systemu Android”, jeśli do tworzenia modułu używasz interfejsu GUI. Możesz przekształcić istniejący moduł w bibliotekę systemu Android, modyfikując plik build.gradle modułu. zmiana apply plugin: 'com.android.application'naapply plugin: 'com.android.library'
Victor Ude

Czy można dodać wiele aar do jednego modułu? W przeciwnym razie musiałbym stworzyć ponad 10 modułów gradle tylko po to, aby dołączyć moje pliki aar
Marian Klühspies

@ MarianKlühspies wiele się zmieniło, odkąd napisałem tę odpowiedź. Poleciłbym wypróbować oficjalną dokumentację dotyczącą włączenia aar do projektu: developer.android.com/studio/projects/ ...
Victor Ude

3

W moim przypadku żadna z powyższych odpowiedzi nie zadziałała! ponieważ po prostu dodałem różne produkty o smakurepositories{ flatDir{ dirs 'libs' } }

nie działał! Skończyło się na określeniu dokładnej lokalizacji katalogu libs :

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

}

Chyba należy wprowadzić flatDirs takie jak ten, gdy w build.gradle są różne smaki produktu


2

W moim przypadku po prostu umieściłem plik aar w libs i dodaję

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

w build.gradle i działa. Myślę, że jest podobnie z domyślną generowaną zależnością:

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


„Api fileTree (dir: 'libs', include: ['* .aar])” działało świetnie. Nie zadziałało, gdy użyłem „implementacji” zamiast „api”. Nigdy nie mogłem zmusić rozwiązania Victora Ude do pracy z wieloma aarami. Dodatkowy wgląd: jeśli korzystasz z zasobów (takich jak układy), upewnij się, że aar (y), do których tworzysz łącze, nie zawierają zasobów o tej samej nazwie, co w pliku APK. Może to spowodować błąd, że nie może znaleźć jednego z identyfikatorów w układzie. Problem polega na tym, że używa złej przestrzeni nazw dla id w układzie aar.
Tom Rutchik

1

Ta linia zawiera wszystkie pliki aari jarpliki z libsfolderu:

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

1

To rozwiązanie działa z Android Studio 4.0.1.

Oprócz stworzenia nowego modułu zgodnie z powyższym rozwiązaniem, możesz wypróbować to rozwiązanie.

Jeśli posiadasz wiele modułów w swojej aplikacji i chcesz dodać aar tylko do jednego z nich, to takie rozwiązanie się przyda.

W projekcie głównym build.gradle

Dodaj

repositories {
flatDir {
    dirs 'libs'
}}

Następnie w module, w którym chcesz dodać lokalnie plik .aar. po prostu dodaj poniższe wiersze kodu.

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

}

Miłego kodowania :)


0

Dodaj poniżej w projekcie implementacji pliku Gradle aplikacji (ścieżka: „: nazwa projektu”)


0

Jeśli korzystasz już z Kotlin Gradle DSL, alternatywa dla korzystania z niego w ten sposób:

Oto struktura mojego projektu

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

Mój app/build.gradle.kts

  1. Używając prostego podejścia z 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. Korzystanie z tego samego podejścia, co pobieranie z lokalnego / zdalnego repozytorium maven z 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")
}

groupByła potrzebna, ze względu na obowiązkowe (nie ma opcjonalnego / wartość domyślna) w Kotlin implementation, patrz poniżej:

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

Zastrzeżenie: Różnica przy zastosowaniu flatDirspodejścia nr 1 i nr 2, nadal nie wiem zbyt wiele, możesz chcieć edytować / skomentować tę odpowiedź.

Bibliografia:

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

0

To rozwiązanie działa z Android Studio 4.0.1.

Oprócz stworzenia nowego modułu zgodnie z powyższym rozwiązaniem, możesz wypróbować to rozwiązanie.

Jeśli posiadasz wiele modułów w swojej aplikacji i chcesz dodać aartylko jeden moduł, to takie rozwiązanie się przyda.

W projekcie głównym build.gradledodaj

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

Następnie w module, w którym chcesz dodać .aarplik lokalnie, po prostu dodaj wiersze kodu poniżej:

dependencies {
    api fileTree(include: ['*.aar'], dir: 'libs')
    implementation files('libs/<yourAarName>.aar')
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.