Jak utworzyć projekt biblioteki w Android Studio i projekt aplikacji korzystający z projektu biblioteki

164

Jestem nowy w systemie kompilacji Gradle i IntelliJ.

Jak więc utworzyć projekt biblioteki systemu Android (np. Com.myapp.lib1) i projekt aplikacji (np. Com.myapp.app) i sprawić, by system kompilacji obejmował com.myapp.lib1 w projekcie aplikacji?

Poszedłem do projektu Struktura projektu -> Moduły -> Moja aplikacja i dodałem zależność do projektu lib. IntelliJ może teraz rozpoznawać klasy z projektu lib, gdy są używane w projekcie aplikacji, ale kiedy uruchamiam projekt aplikacji, pojawiają się błędy, takie jak:

Gradle: error: package com.myapp.lib1 does not exist
Randy Sugianto „Yuku”
źródło
1
Używałem bibliotek Androida do tworzenia bezpłatnych / płatnych wersji mojej aplikacji. Nowy system kompilacji Gradle sprawia, że ​​to podejście jest przestarzałe w przypadku koncepcji wariantów budowania. Możesz teraz automatycznie tworzyć różne podpisane pakiety APK z tego samego kodu. Żałuję, że nie wiedziałem o tym wcześniej.
theczechsensation
1
@ theczechsensation - czy możesz to rozwinąć? Po przesłaniu pliku APK do pełnej wersji próbowałem przesłać plik APK w wersji bezpłatnej, ale używając tej samej nazwy pakietu. Sklep Google Play (GPS) dał mi wiadomość, że użyłem już tej nazwy pakietu. Czy to, co mówisz o gradle, oznacza, że ​​nie potrzebuję dwóch oddzielnych aplikacji w dwóch osobnych pakietach?
DSlomer64
Oto idealna odpowiedź stackoverflow.com/a/31366602/1118772 . Aqib Mumtaz wspomniał w odpowiedziach, ale w końcu tak jest. Zamiast tracić czas na inne sposoby, możesz to zrobić. filozoficalhacker.com/2014/10/02/…
Noundla Sandeep
Ciekawy wątek dodający Biblioteki. Z obrazkowym wyjaśnieniem.
Harish

Odpowiedzi:

111

Aby utworzyć bibliotekę:

Plik> Nowy moduł

wybierz Android Library

Lib

Aby skorzystać z biblioteki, dodaj ją jako zależność:

Plik> Struktura projektu> Moduły> Zależności

dep

Następnie dodaj moduł (bibliotekę systemu Android) jako zależność modułu.

dodaj moduł

Uruchom swój projekt. To będzie działać.

Blundell
źródło
194
Spowoduje to utworzenie plików modułu w projekcie. Co jeśli chcesz, aby moduł był zewnętrzny w stosunku do projektu, aby można go było używać z inną aplikacją?
rrbrambley
2
@rrbrambley: Znalazłem sposób na ponowne wykorzystanie modułu w wielu projektach. Utworzyłem łącza do folderów (węzeł NTFS) za pomocą aplikacji o nazwie winbolic link dla systemu Windows. Kiedy mam moduł, który chciałbym ponownie wykorzystać w wielu projektach, tworzę łącze folderu do projektu, który ma być ponownie wykorzystany, w katalogu każdego projektu, w którym go używam. Następnie dodaję zależność modułu (w Andr. Studio). Teraz mogę używać / edytować moduł w każdym projekcie, zachowując synchronizację. Nie jestem pewien, czy to właściwa droga, ale na razie wydaje się, że działa całkiem dobrze! Działa to lepiej niż lokalne repozytorium Maven.
Peter
1
Niestety, od lipca 2014 r. Nie ma już takich ustawień projektu, jak te pokazane na ekranie. Musiałem przejść do edycji plików .grade, jak w odpowiedzi GrkEngineer poniżej.
Tim Bray,
24
To powinno zostać poddane głosowaniu w dół, ponieważ tworzy to moduł z istniejącego projektu
Jonathan
2
Jeśli chcesz używać tej samej biblioteki w innych projektach, musisz skopiować moduł biblioteki do tego projektu i ręcznie skonfigurować settings.gradle i build.gradle modułu głównego.
hanoo
114

Zastanawiam się, dlaczego nie ma przykładu samodzielnego projektu słoika.

W eclipse po prostu zaznaczamy pole „Is Library” w oknie dialogowym ustawień projektu.
W Android Studio wykonałem te kroki i otrzymałem plik jar.

  1. Utwórz projekt.

  2. otwórz plik w lewym menu projektu. (app / build.gradle): Gradle Scripts> build.gradle (Moduł: XXX)

  3. zmień jedną linię: apply plugin: 'com.android.application' ->'apply plugin: com.android.library'

  4. usuń applicationId w pliku: applicationId "com.mycompany.testproject"

  5. projekt budowy: Kompiluj> Przebuduj projekt

  6. wtedy możesz pobrać plik aar: app> build> output> aar folder

  7. zmiana aar nazwę rozszerzenia pliku nazip

  8. rozpakuj i możesz zobaczyć classes.jar w folderze. zmień nazwę i użyj go!

W każdym razie nie wiem, dlaczego Google sprawia, że ​​tworzenie słoików jest tak kłopotliwe w Android Studio.

Jinbom Heo
źródło
1
U mnie działa na Android Studio 2.2.2 dec. 2016.
Herman
95

Google Gradle Plugin zalecany sposób konfigurowania plików gradle do budowania wielu projektów ma pewne wady Jeśli masz wiele projektów zależnych od jednego projektu biblioteki, ten post pokrótce wyjaśnia zalecaną konfigurację Google, jej niedociągnięcia i zaleca inny sposób konfiguracji plików gradle, aby obsługuje konfiguracje wielu projektów w Android Studio:

Alternatywna konfiguracja wielu projektów dla studia Android

Inny sposób:

Okazuje się, że istnieje lepszy sposób zarządzania wieloma projektami w Android Studio. Sztuczka polega na utworzeniu oddzielnych projektów Android Studio dla swoich bibliotek i poinformowaniu gradle, że moduł biblioteki, od której zależy Twoja aplikacja, znajduje się w katalogu projektu biblioteki. Jeśli chcesz użyć tej metody z opisaną powyżej strukturą projektu, wykonaj następujące czynności:

  1. Utwórz projekt Android Studio dla biblioteki StickyListHeaders
  2. Utwórz projekt Android Studio dla App2
  3. Utwórz projekt Android Studio dla App1
  4. Skonfiguruj App1 i App2, aby skompilować moduły w projekcie StickyListHeaders.

Czwarty krok to najtrudniejsza część, więc to jedyny krok, który opiszę szczegółowo. Możesz odwoływać się do modułów, które są zewnętrzne w stosunku do katalogu projektu, dodając instrukcję projektu w pliku settings.gradle i ustawiając właściwość projectDir w obiekcie ProjectDescriptor, który jest zwracany przez tę instrukcję projektu:

wprowadź opis obrazu tutaj

Kod, który trzeba wpisać settings.gradle:

include ':library1'
project(':library1').projectDir = new File('../StickyListHeader/library1')

Jeśli zrobiłeś to poprawnie, zauważysz, że moduły, do których odwołuje się Twój projekt, pojawią się w nawigatorze projektu, nawet jeśli te moduły są zewnętrzne w stosunku do katalogu projektu:

wprowadź opis obrazu tutaj

Umożliwia to jednoczesną pracę nad kodem biblioteki i kodem aplikacji. Integracja kontroli wersji działa również dobrze, gdy w ten sposób odwołujesz się do modułów zewnętrznie. Możesz zatwierdzać i wypychać modyfikacje do kodu biblioteki, tak jak możesz zatwierdzać i wypychać modyfikacje do kodu aplikacji.

Ten sposób tworzenia wielu projektów pozwala uniknąć trudności, które są plagą zalecanej przez Google konfiguracji. Ponieważ odwołujemy się do modułu, który znajduje się poza katalogiem projektu, nie musimy tworzyć dodatkowych kopii modułu biblioteki dla każdej aplikacji, która jest od niego zależna, i możemy wersjonować nasze biblioteki bez żadnych bzdur podrzędnych git.

Niestety, ten inny sposób tworzenia wielu projektów jest bardzo trudny do znalezienia. Oczywiście nie jest to coś, czego się dowiesz, patrząc na przewodnik Google, iw tym momencie nie ma sposobu, aby skonfigurować swoje projekty w ten sposób za pomocą interfejsu użytkownika Android Studio.

Aqib Mumtaz
źródło
4
To jest doskonała odpowiedź. Dzięki.
Noundla Sandeep
1
Dobra odpowiedź, ale powinieneś kopiować odpowiednie fragmenty z posta do swojej odpowiedzi na wypadek zerwania linku.
Greyson Parrelli
2
UWAGA: do oceny ciągów znaków w gradle należy użyć podwójnego cudzysłowu („). To„ oszczędzam dzień ”. Powiązane z tym
Solata
1
W jaki sposób odwołujemy się do kodu biblioteki z kodu aplikacji? Po wykonaniu instrukcji konfiguracji kod aplikacji nadal nie może odwoływać się do pakietu w kodzie biblioteki. Czy trzeba wykonać dodatkowy krok?
CEGRD
2
@CEGRD Musisz przejść do Plik> Struktura projektu i kliknąć nazwę modułu, nad którym pracujesz. Następnie przejdź do zakładki zależności> w rozwijanym menu kliknij „+”, a następnie „Zależności modułów”. Powinieneś wtedy móc dodać moduł library1 do bieżącego projektu.
OliasailO
45

Sprawdź ten link o konfiguracjach wielu projektów .

Warto zwrócić uwagę, upewnij się, że plik settings.gradle został zaktualizowany, aby odnosił się zarówno do modułów aplikacji, jak i biblioteki.

settings.gradle: include ':app', ':libraries:lib1', ':libraries:lib2'

Upewnij się również, że plik build.gradle aplikacji zawiera następujący tekst:

dependencies {
     compile project(':libraries:lib1')
}

Powinieneś mieć następującą strukturę:

 MyProject/
  | settings.gradle
  + app/
    | build.gradle
  + libraries/
    + lib1/
       | build.gradle
    + lib2/
       | build.gradle

Plik build.gradle aplikacji powinien używać rozszerzenia com.android.application wtyczki, a plik build.gradle wszystkich bibliotek powinien korzystać z com.android.librarywtyczki.

IDE Android Studio powinno zostać zaktualizowane, jeśli możesz budować z wiersza poleceń z tą konfiguracją.

GrkEngineer
źródło
Czy wtyczka zdefiniowana w build.gradle to jedyna różnica? tj. czy możesz zmienić istniejący moduł w bibliotekę Androida, zmieniając ten jeden wiersz?
Enrico
22
Pewnego dnia klikniemy przycisk importu i biblioteka po prostu będzie działać, a następnie zaczniemy wpisywać kod w edytorze.
Steve M
6
Wydaje się, że takie podejście obejmuje biblioteki w ramach rzeczywistego projektu. To, czego chciał OP, to wiedzieć, jak stworzyć osobny projekt biblioteki dla Androida, który będzie żył w swoim własnym projekcie / przestrzeni i zawarty w głównym projekcie aplikacji jako biblioteka
Jonathan
@SteveM To był mój problem przez całą moją karierę. Po prostu zaczynam kodować bez żadnego projektu. A potem spędzaj godziny na debugowaniu i refaktoryzacji.
Rajkiran
13

W przypadku Intellij IDEA (i Android Studio) każda biblioteka jest modułem. Pomyśl o module w Android Studio jako o ekwiwalencie projektu w Eclipse. Projekt w Android Studio to zbiór modułów. Moduły mogą być uruchamianymi aplikacjami lub modułami bibliotek.

Tak więc, aby dodać nowy projekt biblioteki dla systemu Android, musisz utworzyć moduł typu „biblioteka Androida”. Następnie dodaj ten moduł biblioteki do listy zależności modułu głównego (moduł aplikacji).

Simon-Droid
źródło
12

Najprostszy sposób, w jaki mogę utworzyć i ponownie wykorzystać projekt biblioteki:

  1. W otwartym projekcie file > new > new module(i odpowiedz na pytania dotyczące interfejsu użytkownika)

wprowadź opis obrazu tutaj

  1. sprawdź / lub dodaj if w pliku settings.gradle :include ':myLibrary'
  2. sprawdź / lub dodaj if w pliku build.gradle :

    dependencies { ... compile project(':myLibrary') }

  3. Aby ponownie użyć tego modułu biblioteki w innym projekcie, skopiuj jego folder w projekcie zamiast kroku 1 i wykonaj kroki 2 i 3.

Możesz także utworzyć nowy projekt aplikacji studyjnej. Możesz łatwo zmienić istniejący moduł aplikacji na moduł biblioteki, zmieniając przypisanie wtyczki w pliku build.gradle na com.android.library.

apply plugin: 'com.android.application'

android {...}

do

apply plugin: 'com.android.library'

android {...}

więcej tutaj

hanoo
źródło
Jeśli zmienisz istniejący moduł aplikacji na moduł biblioteki, zmieniając przypisanie wtyczki, będziesz musiał również usunąć wiersz `applicationId" com .... "z pliku oceny.
TDG
„OSTRZEŻENIE: 'Kompilacja' konfiguracji jest przestarzała i została zastąpiona przez 'implementację' i 'api'.”
slhck
9

Możesz dodać nowy moduł do dowolnej aplikacji, jak mówi Blundell w swojej odpowiedzi, a następnie odwołać się do niego z dowolnej innej aplikacji.

Jeśli chcesz przenieść moduł w dowolne miejsce na komputerze, po prostu przenieś folder modułów (moduły są całkowicie niezależne), wtedy będziesz musiał odwołać się do modułu.

Aby odwołać się do tego modułu, należy:

  • W pliku build.gradle aplikacji dodaj:

    dependencies {
    ...
    compile project(':myandroidlib')
    }
    
  • W pliku settings.gradle dodaj następujące informacje:

     include ':app', ':myandroidlib'
     project(':myandroidlib').projectDir = new File(PATH_TO_YOUR_MODULE)
    
juliański
źródło
na przykład project(':library').projectDir = new File('../library')gdzie libraryjest nazwą folderu równolegle z folderem projektu systemu Android.
Someone Somewhere
5

Nie zapomnij użyć apply plugin: 'com.android.library'w twojej build.gradlezamiast stosować wtyczki:'com.android.application'

Ryan R.
źródło
4

Sposób dokumentacji

Jest to zalecany sposób, zgodnie z poradami zawartymi w dokumentacji Android Studio.

Utwórz moduł biblioteki

Utwórz nowy projekt, w którym chcesz umieścić swoją bibliotekę. Kliknij opcję Plik> Nowy> Nowy moduł> Biblioteka systemu Android> Dalej> (wybierz nazwę)> Zakończ . Następnie dodaj wybrane klasy i zasoby do swojej biblioteki.

Podczas budowania modułu zostanie utworzony plik AAR. Możesz go znaleźć w project-name/module-name/build/outputs/aar/.

Dodaj swoją bibliotekę jako zależność

Możesz dodać swoją bibliotekę jako zależność do innego projektu w następujący sposób:

  1. Zaimportuj plik AAR biblioteki za pomocą opcji Plik> Nowy moduł> Importuj pakiet .JAR / .AAR> Dalej> (wybierz lokalizację pliku)> Zakończ . (Nie importuj kodu, w przeciwnym razie będzie można go edytować w zbyt wielu miejscach).
  2. Upewnij się, że w pliku settings.gradle znajduje się nazwa Twojej biblioteki.

    include ':app', ':my-library-module'
    
  3. W pliku build.gradle aplikacji dodaj wiersz kompilacji do sekcji zależności:

    dependencies {
        compile project(":my-library-module")
    }
    
  4. Zostaniesz poproszony o zsynchronizowanie projektu z Gradle. Zrób to.

Otóż ​​to. Teraz powinieneś móc korzystać ze swojej biblioteki.

Uwagi

Jeśli chcesz, aby Twoja biblioteka była łatwo dostępna dla większej liczby odbiorców, rozważ użycie JitPac lub JCenter .

Suragch
źródło
3

Miałem to samo pytanie i rozwiązałem je w następujący sposób:

Sytuacja początkowa :

FrigoShare (root)
|-Modules:    frigoshare,   frigoShare-backend

Cel : chcesz dodać moduł o nazwiedataformats

  1. Dodaj nowy moduł (np .: Java Library :)
  2. Upewnij się, że settings.gradlewyglądasz tak (zwykle automatycznie):

    include ':frigoshare', ':frigoShare-backend', ':dataformats'

  3. Upewnij się ( ręcznie ), że build.gradlepliki modułów, które muszą używać Twojej biblioteki, mają następującą zależność:

    dependencies { ... compile project(':dataformats') }

Matthias
źródło
2

Jako komentarz theczechsensation powyżej, próbuję poszukać informacji o Gradle Build Varians i znalazłem ten link: http://code.tutsplus.com/tutorials/using-gradle-build-variants--cms-25005 To bardzo proste rozwiązanie. Oto, co zrobiłem: - W build.gradle:

flavorDimensions "version"

productFlavors {
    trial{
        applicationId "org.de_studio.recentappswitcher.trial"
        flavorDimension "version"
    }
    pro{
        applicationId "org.de_studio.recentappswitcher.pro"
        flavorDimension "version"
    }

}

Następnie mam jeszcze 2 wersje mojej aplikacji: pro i trial z 2 różnymi nazwami pakietu, czyli 2 identyfikatorami applicationId w powyższym kodzie, więc mogę przesłać obie do Google Play. Nadal koduję w sekcji „main” i używam getpackageName do przełączania się między wersjami. Po prostu przejdź do linku, który podałem, aby uzyskać szczegółowe informacje.

Hai nguyen thanh
źródło
1

Są dwa najprostsze sposoby, jeśli jeden nie działa, spróbuj drugiego.

  1. Dodaj zależność biblioteki do zależności wewnątrz pliku build.gradle biblioteki, której używasz, i wklej bibliotekę ur do bibliotek zewnętrznych.

LUB

  1. Po prostu przejdź do folderu libs w folderze aplikacji i wklej wszystkie swoje pliki .jar, np. Pliki biblioteki. Teraz sztuczka polega na tym, że teraz przejdź do pliku settings.gradle i dodaj tę linię „include ': app: libs'" po "include": app '"To na pewno zadziała ........... :)
Sudhanshu Gaur
źródło
1

W moim przypadku używając MAC OS X 10.11 i Androida 2.0 i robiąc dokładnie to, co wyjaśnił Aqib Mumtaz.

Ale za każdym razem otrzymywałem ten komunikat: „ Wystąpił problem podczas konfigurowania projektu„: aplikacja ”.> Nie można ocenić modułu xxx: Nie znaleziono konfiguracji o nazwie„ domyślna ” .”

Odkryłem, że powodem tego komunikatu jest to, że Android 2.0 nie pozwala na bezpośrednie tworzenie biblioteki. Postanowiłem więc najpierw utworzyć projekt aplikacji, a następnie zmodyfikować plik build.gradle, aby przekształcić go w bibliotekę.

To rozwiązanie nie działa, ponieważ projekt biblioteki bardzo różni się od projektu aplikacji.

Więc rozwiązałem mój problem w następujący sposób:

  • Najpierw utwórz standardową aplikację (w razie potrzeby);
  • Następnie wybierz „Plik / Utwórz moduł”
  • Przejdź do wyszukiwarki i przenieś folder świeżo utworzonego modułu do katalogu frameworka

Następnie przejdź do rozwiązania zaproponowanego przez Aqib Mumtaz.

W rezultacie źródło Twojej biblioteki będzie udostępniane bez konieczności powielania plików źródłowych za każdym razem (była to dla mnie herezja!)

Mam nadzieję, że to ci pomoże.

Chrstph SLN
źródło