2013-03-02 16 views
16

Próbuję zbudować projekt Android z Gradle i Android Gradle plugin. Chciałbym polegać na projektach bibliotek znalezionych w zewnętrznych (maven) repozytoriach, np. ActionBarSherlock.Zewnętrzne projekty bibliotek Android z Gradle

Wydaje się możliwe według official site:

Using a library is done one of the following way:

Multi-project setup. Read here: http://www.gradle.org/docs/current/userguide/multi_project_builds.html

Dependencies through a repo such as maven or ivy.

Obecne zawartość mojego build.gradle:

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

repositories { 
    mavenCentral() 
} 

dependencies { 
    compile 'com.actionbarsherlock:library:4.2.0' 
} 

android { 
    target = 'android-16' 
    sourceSets { 
     main { 
      manifest { 
       srcFile 'AndroidManifest.xml' 
      } 
      java { 
       srcDir 'src' 
      } 
      res { 
       srcDir 'res' 
      } 
      assets { 
       srcDir 'assets' 
      } 
      resources { 
       srcDir 'src' 
      } 
     } 
    } 
} 

używam Gradle 1.2. Kiedy próbuję zbudować z gradle assemble, pojawia się następujący błąd:

Error: duplicate files during packaging of APK /[path to project]/build/apk/[project name]-debug-unaligned.apk 
    Path in archive: AndroidManifest.xml 
    Origin 1: /[path to project]/build/libs/[apk name]-debug.ap_ 
    Origin 2: /[home directory]/.gradle/caches/artifacts-14/filestore/com.actionbarsherlock/actionbarsherlock/4.2.0/apklib/dd63451a922558005d8c10be1085b488ed731d19/actionbarsherlock-4.2.0.apklib 
:packageDebug FAILED 

Wydaje się, że stara się zawierać AndroidManifest.xml zarówno z projektu biblioteki i mojego projektu. Jeśli usunę specyfikację manifest w sourceSets, nadal otrzymam ten sam błąd.

Strona wspomniana przy użyciu apply plugin: 'android-library' dla projektów bibliotecznych; Zgaduję, że jest to tylko podczas budowania rzeczywistej biblioteki (z konfiguracją wielu projektów), ponieważ nie tworzy ona pliku APK.

W jaki sposób mogę uzyskać zależności od zewnętrznych bibliotek Androida?

Odpowiedz

20

Chociaż możliwe jest uzyskanie zależności za pośrednictwem repozytorium Maven lub Ivy, nie są one pakowane w standardowe archiwum Jar. Jest nowy format zaprojektowany specjalnie dla tego systemu kompilacji. Typ jest "aar"

Obecne biblioteki Androida dostępne w Maven Central zostały utworzone przy użyciu wtyczki Maven, które używają innego formatu archiwum ("apklib"), więc nie są kompatybilne.

Jeśli spojrzysz na com.actionbarsherlock: actionbacksherlock (która jest nową lokalizacją tej biblioteki), zobaczysz, że jej format to apklib. http://search.maven.org/#artifactdetails%7Ccom.actionbarsherlock%7Cactionbarsherlock%7C4.2.0%7Capklib

Patrząc na kod źródłowy, sprawdzamy opakowanie "aar" i powracamy do przetwarzania wszystkich innych jako "słoik", co oczywiście stanowi problem. Powinniśmy wykryć apklib i dostarczyć lepszy komunikat o błędzie.

+0

Czy nowy format AAR skompilowany jak dystrybucja słoik lub inny zip źródłowy, taki jak apklib? – yorkw

+0

W wersji 0.3 wtyczki wygląda na to, że budowanie projektu biblioteki Android tworzy AAR (archiwum z skompilowanymi klasami i zasobami). Dopóki nie jest to bardziej rozpowszechnione, czy istnieje sposób, aby wtyczka do systemu Android Gradle działała z istniejącymi bibliotekami apklib znajdującymi się w Maven Central (itp.)? EDYCJA: Byłoby to szczególnie przydatne biorąc pod uwagę aktualny komunikat na stronie: "Binarne opakowanie biblioteki wciąż przechodzi zmiany. Nie przesyłaj bibliotek do maven central (lub innych podobnych repozytoriów) jeszcze". – antonyt

+17

aar jest podobny do apklib, ponieważ jest to plik zip zawierający plik jar + inne pliki. Obsługa apklib nie jest tak naprawdę planowana, ale mógłbym się jej przyjrzeć. –

-1

Używasz starszej wersji wtyczki gradle Android.
W najnowszej wersji 0.3 wiele poprawiono w tej dziedzinie.

Zaleca się przechodzenie do wersji 0.3 tej wtyczki. Pamiętaj też, że musisz użyć nowszej wersji gradle (1.3 lub 1.4).

Więcej informacji o tym, jak można używać external libraries w tej wtyczce.

14

Możesz teraz zintegrować ActionBarSherlock jako aar.

Wystarczy dodać do swojej definicji uzależnienia w pliku build.gradle:

dependencies { 
    compile 'com.android.support:support-v4:18.0.+' 
    compile 'com.actionbarsherlock:actionbarsherlock:[email protected]' 

Jake Wharton opublikował example project, który pokazuje, jak korzystać z ActionBarSherlock Gradle

+0

Próbowałem to znaleźć przez chwilę! Dziękuję Ci –

Powiązane problemy