Jak ręcznie dołączyć zewnętrzny pakiet aar za pomocą nowego systemu kompilacji Gradle Android

406

Eksperymentowałem z nowym systemem kompilacji Androida i napotkałem mały problem. Skompilowałem własny pakiet aar ActionBarSherlock, który nazwałem „actionbarsherlock.aar”. To, co próbuję zrobić, to użyć tego aar do zbudowania mojego końcowego pakietu APK. Jeśli dołączę całą bibliotekę ActionBarSherlock jako moduł biblioteki Androida do mojego głównego projektu za pomocą projektu kompilacji („: actionbarsherlock”), będę mógł bez problemu zbudować pomyślnie.

Ale moim problemem jest to, że chcę zapewnić tę zależność jako pakiet plików AAR RĘCZNIE, tylko gdybym zrobił JAR, to nie wydaje mi się, aby wymyślić, jak poprawnie włączyć go do mojego projektu. Próbowałem użyć konfiguracji kompilacji, ale wydaje się, że to nie działa. Ciągle nie mogę znaleźć symbolu podczas kompilacji, co mówi mi, że plik klas.jar z pakietu aar nie jest uwzględniany w ścieżce klasy.

Czy ktoś wie o składni, aby ręcznie dołączyć pakiet aar jako plik?

build.gradle

buildscript {

 repositories {
     mavenCentral()
  }
  dependencies {
    classpath 'com.android.tools.build:gradle:0.4'
  }
}
apply plugin: 'android'

repositories {
   mavenCentral()
}
dependencies {
    compile files('libs/actionbarsherlock.aar')
}

android {
    compileSdkVersion 15
    buildToolsVersion "17.0"
}

EDYCJA: Więc odpowiedź jest taka, że ​​obecnie nie jest obsługiwana, oto problem, jeśli chcesz go śledzić.

EDYCJA: Obecnie, ponieważ nie jest to bezpośrednio obsługiwane, najlepszą alternatywą wydaje się proponowane rozwiązanie z @RanWakshlak

EDYCJA: Również prostsza przy użyciu składni zaproponowanej przez @VipulShah

Miguel Lavigne
źródło
Zastanów się nad odpowiedzią Vipul Shah: w końcu zadziałało dla mnie, bez lokalnego repozytorium maven, od wersji Android Studio 0.5.8.
shkschneider
Spójrz na moje pytanie i odpowiedz tutaj stackoverflow.com/a/31662782/746347
mixel
Jeśli korzystasz z wersji 3.0.0 lub nowszej, ta prosta konfiguracja Gradle działała dla mnie: stackoverflow.com/questions/29081429/...
user1506104

Odpowiedzi:

670

Wykonaj poniższe kroki, aby go uruchomić (przetestowałem go do wersji Android Studio 2.2)

Powiedzmy, że trzymałeś plik AAR w folderze libs. (załóż, że nazwa pliku to cards.aar)

następnie w aplikacji build.gradleokreśl następujące i kliknij zsynchronizuj projekt z plikami Gradle. Otwórz build.gradle na poziomie projektu i dodaj flatDir{dirs 'libs'}tak jak poniżej

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

a teraz otwórz plik build.grdle na poziomie aplikacji i dodaj .aarplik

    dependencies {
       compile(name:'cards', ext:'aar')
}

Jeśli wszystko pójdzie dobrze, zobaczysz, że wpis do biblioteki jest wykonywany w build -> exploded-aar

Pamiętaj również, że jeśli importujesz plik .aar z innego projektu, który ma zależności, musisz je również uwzględnić w pliku build.gradle.

Vipul Shah
źródło
5
@VipulShah gdzie znajduje się katalog libs?
StuStirling,
2
Być może należy zalecić umieszczenie modyfikacji w module aplikacji „build.gradle”, a nie w górnym folderze „build.gradle”.
loloof64
3
znalazłem odpowiedź na moje pytanie powyżej: zamiast compilezależności dodaj dwie zależności debugCompile(name:'cards-debug', ext:'aar')ireleaseCompile(name:'cards-release', ext:'aar')
Iftah
2
Nie należy mylić z przykładowym kodem. Pierwszy blok z allprojects {...}przechodzi do pliku oceny poziomu „projektu”, a druga część z dependencies {...}należy przejść do pliku oceny poziomu „aplikacji”.
Kirill Karmazin
8
Zaktualizuj swoją odpowiedź: OSTRZEŻENIE: Konfiguracja „kompiluj” jest przestarzała i została zastąpiona przez „implementacja” i „api”. Zostanie on usunięty pod koniec 2018 roku. Więcej informacji na stronie: d.android.com/r/tools/update-dependency-configurations.html
B-GangsteR
248
  1. Kliknij projekt prawym przyciskiem myszy i wybierz „Otwórz ustawienia modułu” .

Otwórz ustawienia modułu

  1. Kliknij przycisk „+” w lewym górnym rogu okna, aby dodać nowy moduł.

Dodaj nowy moduł

  1. Wybierz „Importuj .JAR lub .AAR Package” i kliknij przycisk „Dalej” .

Importuj AAR

  1. Znajdź plik AAR za pomocą przycisku wielokropka „...” obok pola „Nazwa pliku”.

Znajdź plik AAR

  1. Pozostaw wybrany moduł aplikacji i kliknij panel Zależności, aby dodać nowy moduł jako zależność.

Okienko zależności

  1. Użyj przycisku „+” na ekranie zależności i wybierz „Zależność modułu” .

Dodaj zależność modułu

  1. Wybierz moduł i kliknij „OK” .

Wybierz moduł

Oliver Kranz
źródło
4
Najlepsza odpowiedź, pamiętaj o tym Alt+B> zrób > wyczyść i przebuduj projekt. Android Studio, dlaczego jesteś bolesny! Chcę mieć NetBeans IDE jako platformę programistyczną dla Androida
java acm
@Oliver You are awesome!
ankit purwar
Jesteście najlepsi!
codezombie
2
Nie jest najlepszym pomysłem tworzenie nowego modułu za każdym razem, gdy chcesz dodać trochę aarlib do swojego projektu
Kirill Karmazin
Jesteś niesamowity, przyjacielu. !! Pozdrawiam to.
Timothy Macharia
111

Możesz odwołać się do pliku AAR z repozytorium. Maven jest opcją, ale istnieje prostsze rozwiązanie: umieść plik aar w katalogu libs i dodaj repozytorium katalogów.

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

Następnie odwołaj się do biblioteki w sekcji zależności:

  dependencies {
        implementation 'com.actionbarsherlock:actionbarsherlock:4.4.0@aar'
}

Więcej informacji można znaleźć na blogu Min'an .

Ran Wakshlak
źródło
1
Działa to świetnie i jest lepsze niż odpowiedzi zaakceptowane / wyżej ocenione, ponieważ jest prostsze i mogę włączyć to do kontroli wersji bez dodawania pliku do lokalnego repozytorium maven każdego programisty (jeśli miałbym to zrobić, to po co używać Gradle ?) Dzięki!
ajpolt
@ajpolt Prawdopodobnie zaleca się, aby zamiast tego skonfigurować serwer repo (dla zastrzeżonych zasobów), abyś nie musiał umieszczać go na maszynach programistycznych lub w folderze lib swojego projektu. Jeśli masz tylko jedną zależność, wyrzuć ją do repozytorium kodu Google o strukturze maven (jako repozytorium tymczasowe)
Lo-Tan
4
Najważniejszym punktem, na który należy zwrócić uwagę w tej odpowiedzi, jest wymienienie „@aar” na końcu zależności.
Atharva
Przypuszczam, że to już nie zadziała z najnowszą wtyczką gradle: stackoverflow.com/questions/60878599/…
David
Jest to jedyna odpowiedź, która obejmuje najprostszą formę, z całą nowoczesną składnią, w tym implementationitp. Jest to rozwiązanie kopiuj-wklej. Nadchodzi mnóstwo nowych upvotes, ponieważ wtyczka Gradient Build 4.0.0 dla Androida generuje teraz błąd zamiast ignorować zepsute ścieżki .aar
Patrick
51

Poniższe podejście działa z najnowszym Android studio (> v0.8.x):

  • Zapisz aarplik w libsfolderze modułu aplikacji (np . <project>/<app>/libs/myaar.aar:)

  • Dodaj poniżej plik build.gradle do folderu modułu „app” (nie do katalogu głównego build.gradle projektu). Zanotuj nazwę w wierszu kompilacji, myaar @ aar nie myaar.aar.

    dependencies {
        compile 'package.name.of.your.aar:myaar@aar'
    }
    
    repositories{
        flatDir{
            dirs 'libs'
        }
    }
  • Kliknij Tools -> Android -> Sync Project with Gradle Files

Ashoke
źródło
3
Działa idealnie na AS 1.0
Pablo Johnson
1
Jeśli ktoś tego potrzebuje, jeśli grad działa poprawnie, ale nadal nie widzisz zajęć, uruchom ponownie Android Studio ...
htafoya
1
To rozwiązanie działa świetnie w AS2.2 - gradle jest niesamowicie wybredna pod względem składni plików AAR.
Jim Andreas,
Zaktualizuj lub usuń, kompilacja jest przestarzała i występuje również ten problem: stackoverflow.com/questions/60878599/...
David
49

przed (domyślnie)

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

wystarczy dodać '*.aar'w includetablicy.

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

działa dobrze na Android Studio 3.x.

jeśli chcesz zignorować bibliotekę? rób jak to.

implementation fileTree(include: ['*.jar', '*.aar'], exclude: 'test_aar*', dir: 'libs')
debugImplementation files('libs/test_aar-debug.aar')
releaseImplementation files('libs/test_aar-release.aar')
Changhoon
źródło
1
Chociaż ten kod może odpowiedzieć na pytanie, zapewnienie dodatkowego kontekstu dotyczącego tego, jak i / lub dlaczego rozwiązuje problem, poprawiłoby długoterminową wartość odpowiedzi.
Alexander
1
Działa dobrze, jest to droga, jeśli biblioteka jest prosta. Ale tutaj jest problem: musisz zaimportować całą bibliotekę zaimportowaną do pliku AAR, aby działała. Import z pliku aar nie jest propagowany przy użyciu tej metody.
Tobliug
Lub jeszcze prościej:implementation fileTree(include: ['*.?ar'], dir: 'libs')
friederbluemle
@friederbluemle Zamiast prostszego powiedziałbym, że jest krótszy, a jednocześnie nieokreślony teoretycznie.
David
21

Właśnie mi się udało!

  1. Skopiuj plik mylib-0.1.aar do folderu libs /

  2. Dodaj te wiersze na dole build.gradle (powinna to być aplikacja, a nie projekt):

    repositories {
       flatDir {
           dirs 'libs'
       }
    }
    dependencies {
        compile 'com.example.lib:mylib:0.1@aar'
    }
  3. Na razie w porządku. Oto najważniejszy punkt:

Gradle musi uzyskać dostęp do sieci w celu uzyskania zależności, chyba że tryb offline jest włączony.

Upewnij się, że masz włączoną pracę offline za pomocą pola wyboru w Strukturach projektu / Gradade

- LUB -

Skonfiguruj ustawienia proxy , aby uzyskać dostęp do sieci.

Aby skonfigurować ustawienia proxy, musisz zmodyfikować plik gradle.properties projektu , konfigurując HTTP i https osobno, jak poniżej:

systemProp.http.proxyHost=proxy.example.com
systemProp.http.proxyPort=8080
systemProp.http.proxyUser=user
systemProp.http.proxyPassword=pass
systemProp.http.nonProxyHosts=localhost
systemProp.http.auth.ntlm.domain=example <for NT auth>

systemProp.https.proxyHost=proxy.example.com
systemProp.https.proxyPort=8080
systemProp.https.proxyUser=user
systemProp.https.proxyPassword=pass
systemProp.https.nonProxyHosts=localhost
systemProp.https.auth.ntlm.domain=example <for NT auth>

Mam nadzieję, że to zadziała.

Orhun D.
źródło
Zaktualizuj lub usuń, kompilacja jest przestarzała i występuje również ten problem: stackoverflow.com/questions/60878599/...
David
20

Obecnie odwołanie do lokalnego pliku .aar nie jest obsługiwane (co potwierdził Xavier Ducrochet)

Zamiast tego możesz skonfigurować lokalne repozytorium Maven (o wiele prostsze niż się wydaje) i stamtąd odwołać się do pliku .aar.

Napisałem post na blogu, w którym szczegółowo opisuję, jak to działa:

http://www.flexlabs.org/2013/06/using-local-aar-android-library-packages-in-gradle-builds

Artiom Chilaru
źródło
Nie udało mi się sprawić, by działał, gdy artefakt jest migawką, jakiś pomysł, dlaczego?
tbruyelle
Czy dostałeś tę pracę tylko w Eclipse lub w studiu Android? W przypadku zaćmienia „stopień zaćmienia” dodaje plik AAR do ścieżki klasy, ale zaćmienie nie rozpoznaje w nim klas.
andrej_k
Sprawdź to pytanie stackoverflow.com/questions/20911665/... jeśli po wykonaniu samouczka nie można znaleźć lokalnego pliku .aar (w wersji 1.9 lub nowszej)
ligi od
Zaktualizuj lub usuń, ta odpowiedź jest nieaktualna.
David
18

Możesz dodać wiele aarzależności za pomocą zaledwie kilku wierszy kodu.

Dodaj lokalne flatDirrepozytorium:

repositories {
    flatDir {
        dirs 'libs'
    }
} 

Dodaj każdy aarw libskatalogu do compilekonfiguracji zależności:

fileTree(dir: 'libs', include: '**/*.aar')
        .each { File file ->
    dependencies.add("compile", [name: file.name.lastIndexOf('.').with { it != -1 ? file.name[0..<it] : file.name }, ext: 'aar'])
}
mixel
źródło
To zadziałało, ale jak można sprawdzić, jeśli zależność jest już dodana jako zależność maven, to nie chcę, aby plik AAR musiał zostać dodany, PS: Używam tego, aby napisać wtyczkę, która automatycznie dodaje mój AAR do projektu Android i dodaje zależność w build.gradle
Adi
@Adi Jeśli masz już zależność od maven, nie umieszczaj odpowiedniego aar w libsfolderze.
mixel
Dzięki za odpowiedź, jak już wspomniałem, dodawanie aar do libs jest zautomatyzowane przez wtyczkę studyjną Android, która przy programowaniu chce wiedzieć, czy zależność dodana przez wtyczkę do pliku build.gradle jest już wcześniej dodana.
Adi
Nie mam teraz odpowiedzi. Myślę, że lepiej jest utworzyć osobne pytanie.
mixel
15

Niestety żadne z rozwiązań tutaj nie zadziałało (dostaję nierozwiązane zależności). To, co w końcu działało i jest najłatwiejszym sposobem IMHO: Podświetl nazwę projektu z Android Studio, a następnie Plik -> Nowy moduł -> Importuj pakiet JAR lub AAR. Kredyt trafia do rozwiązania w tym poście

Nonos
źródło
1
Należy zauważyć, że Android Studio jest wyjątkowo niejasny w kreatorze importu. Gdy w jednym z kroków podają „Nazwę pliku”, tak naprawdę pytają o ścieżkę pliku ... Mam nadzieję, że ta wiadomość uratuje innych przed bólem głowy.
Tukajo
13

Istnieją 2 sposoby:

Pierwszy sposób

  1. Otwórz Android Studio i przejdź do Create New Moduleokna przezFile -> New -> New Module

wprowadź opis zdjęcia tutaj

  1. Wybierz Import .JAR/.AAR Packageelement i kliknij Nextprzycisk

  2. Dodaj zależność w build.gradlepliku należącym do appmodułu.

    dependencies {
        ...
        implementation project(path: ':your aar lib name')
    }

To wszystko.

Drugi sposób

  1. Utwórz folder w libskatalogu, np aars.

  2. Umieść swoją bibliotekę aar lib w folderze aars.

  3. Dodaj fragment kodu

repositories {
    flatDir {
        dirs 'libs/aars'
    }
}

do build.gradlepliku należy do modułu aplikacji.

  1. Dodaj zależność w build.gradlepliku należącym do appmodułu.
dependencies {
    ...
    implementation (name:'your aar lib name', ext:'aar')
}

To wszystko.

Jeśli umiesz czytać po chińsku, możesz sprawdzić blog 在 是 AAR 文件 以及 如何 在 Android 开发 中 使用

shusheng007
źródło
ta odpowiedź była dla mnie bardzo pomocna
Csabi
Czy po pierwszym przejściu klasy w pliku AAR nie są wykrywane w głównym projekcie, czy musimy dodać dodatkową konfigurację?
Kiran
Zaktualizuj lub usuń, pierwsze odpowiedzi są już opublikowane, a druga „kompilacja” jest przestarzała.
David
12

W Android Studio 3.4 i Gradle 5 możesz to po prostu zrobić w ten sposób

dependencies {
    implementation files('libs/actionbarsherlock.aar')
}
m0skit0
źródło
1
To najlepsza odpowiedź. Zależność jest wyraźna i bardzo prosta.
Nikmoon
1
Zgodził się, że to najlepsza odpowiedź. Natychmiast działał, był idealny do dodawania zależności .aar do biblioteki React Native.
Josh Baker
1
To powoduje błąd zaczynający się od wtyczki gradle 4: stackoverflow.com/questions/60878599/…
David
@David Dzięki za raport, postaram się go przetestować jak najszybciej.
m0skit0
10

AKTUALIZACJA STUDIO ANDROIDA 3.4

  1. Przejdź do Plik -> Struktura projektu

wprowadź opis zdjęcia tutaj

  1. Moduły i kliknij +

wprowadź opis zdjęcia tutaj

  1. Wybierz opcję Importuj pakiet .aar

wprowadź opis zdjęcia tutaj

  1. Znajdź trasę .aar

wprowadź opis zdjęcia tutaj

  1. Zakończ i zastosuj , a następnie sprawdź, czy pakiet został dodany

wprowadź opis zdjęcia tutaj

  1. Teraz w module aplikacji kliknij + i Zależność modułu

wprowadź opis zdjęcia tutaj

  1. Sprawdź pakiet biblioteki i OK

wprowadź opis zdjęcia tutaj

  1. Sprawdź dodaną zależność

wprowadź opis zdjęcia tutaj

  1. I taka struktura projektu

wprowadź opis zdjęcia tutaj

Álvaro Agüero
źródło
1
to jest 17. odpowiedź. Przeczytałem, że w końcu dodano zależność. eeh
Taras Matsyk
6

Też miałem ten problem. Ten raport o problemie: https://code.google.com/p/android/issues/detail?id=55863 wydaje się sugerować, że bezpośrednie odwoływanie się do pliku .AAR nie jest obsługiwane.

Być może alternatywą jest na razie zdefiniowanie biblioteki actionbarsherlock jako biblioteki Gradle w katalogu nadrzędnym projektu i odpowiednie odniesienie.

Składnia jest zdefiniowana tutaj http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Referencing-a-Library


źródło
Dziękujemy za odniesienie do problemu. Tak, wiem, jak sprawić, by działało to za pomocą biblioteki Gradle Android Library, ale ta opcja nie jest optymalna dla projektu, nad którym pracuję, ale dzięki!
Miguel Lavigne
3

Znalazłem to obejście w narzędziu do śledzenia problemów Androida: https://code.google.com/p/android/issues/detail?id=55863#c21

Sztuką (a nie poprawką) jest izolowanie plików .aar w podprojekt i dodawanie bibliotek lib jako artefaktów:

configurations.create("default")
artifacts.add("default", file('somelib.jar'))
artifacts.add("default", file('someaar.aar'))

Więcej informacji: Obsługa-przechodnie-zależności-dla-lokalnych-artefaktów-słoików-i-aar

jiparis
źródło
Zgadza się, a oto przykład: w github.com/textileio/notes/commit/… , compile project(':mobile')w android / app / build.gradle, configurations.maybeCreate("default")w android / mobile / build.gradle, include ':mobile'w android / settings.gradle
Li Zheng
3

W moim przypadku mam pewne depresje w swojej bibliotece, a kiedy utworzyłem aarz niego, nie udało mi się, z powodu pominiętych depresji, więc moim rozwiązaniem jest dodanie wszystkich depencji z mojej bibliotekiarr pliku.

Mój poziom projektu build.gradlewygląda więc tak:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.2'
    }
}

allprojects {
    repositories {
        mavenCentral()
        //add it to be able to add depency to aar-files from libs folder in build.gradle(yoursAppModule)
        flatDir {
            dirs 'libs'
        }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

build.gradle(modile app) więc:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    defaultConfig {
        applicationId "com.example.sampleapp"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    //your project depencies
    ...
    //add lib via aar-depency
    compile(name: 'aarLibFileNameHere', ext: 'aar')
    //add all its internal depencies, as arr don't have it
    ...
}

i biblioteka build.gradle:

apply plugin: 'com.android.library'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    //here goes library projects dependencies, which you must include
    //in yours build.gradle(modile app) too
    ...
}
mohax
źródło
3

Wypróbowałem tutaj wszystkie rozwiązania, ale żadne nie działa, ale zdaję sobie sprawę, że popełniłem błąd, umieściłem .aarniewłaściwy folder, jak widać poniżej, pomyślałem, że powinienem umieścić w folderze głównym, więc utworzyłem tam libsfolder (1 na zdjęciu ), ale w folderze aplikacji jest już libs, powinieneś umieścić na drugim miejscu libs, mam nadzieję, że pomoże to tym, którzy mają ten sam problem co mój:

wprowadź opis zdjęcia tutaj

GMsoF
źródło
2

Aby uprościć odpowiedź

Jeśli plik .aar jest lokalnie obecny, uwzględnij go
compile project(':project_directory')w zależnościach build.gradle twojego projektu.

Jeśli plik .aar jest obecny na zdalnym poziomie, uwzględnij compile 'com.*********.sdk:project_directory:0.0.1@aar'w zależności build.gradle twojego projektu.

anupam_kamble
źródło
0

W moim przypadku po prostu działaj, gdy dodam „projekt” do kompilacji:

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


dependencies {
   compile project('com.x.x:x:1.0.0')
}
josedlujan
źródło
0

możesz zrobić coś takiego:

  1. Umieść swoje biblioteki lokalne (z rozszerzeniem: .jar, .aar, ...) w folderze „libs” (lub innym, jeśli chcesz).

  2. W build.gradle (poziom aplikacji) dodaj tę linię do zależności

    plik implementacyjny Drzewo (obejmują: ['* .jar', '* .aar'], reż: 'libs')

nguyencse
źródło