Jak udostępnić Jedno źródło biblioteki w wielu projektach

Pytanie jak w tytule. Podobne pytanie zadano tutaj, a jedynym obejściem było opublikowanie projektu w lokalnym repozytorium Maven.

Czy ten problem został naprawiony (jak twierdzą niektórzy) w Android Studio 0.5.+? W notatce do wydania {[13] } znajduje się oświadczenie, które mówi "wsparcie dla folderów źródłowych spoza głównego katalogu zawartości modułu". Czy to oznacza, że możemy w końcu zaimportować bibliotekę spoza folderu projektu?

Próbowałem File - > Import Projekt.. ale to nie działa.

Edycja 2: Zobacz akceptowaną odpowiedź dla najnowszego rozwiązania (stan na 0.8.+)

EDIT:

Moja struktura katalogów projektu ma tylko jeden moduł {[5] } który wygląda tak

MyApp
    main
        build.gradle
        src
    build.gradle
    settings.gradle

Katalog projektu biblioteki ma tylko jeden moduł o nazwie lib (wszystkie są automatycznie generowane podczas tworzenia nowego projektu biblioteki)

MyLibrary
    lib
        build.gradle
        src
    build.gradle
    settings.gradle

W MyApp/settings.gradle dodaje się wiersz w brzmieniu:

include ':main', '..:MyLibrary'

Dodaje się, co następuje do MyApp/main/build.gradle:

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

Wynikiem jest następujący błąd:

FAILURE: Build failed with an exception.

* What went wrong:
A problem occurred configuring project ':main'.
> Configuration with name 'default' not found.

Na marginesie, sam projekt biblioteki MyLibrary może się skompilować bez błędów. Problem polega na tym, że settings.gradle nie jest w stanie rozpoznać struktury projektu biblioteki.

Author: Community, 2014-03-07

4 answers

(od wersji 2.1+):

Poniżej znajdują się kroki, które podjąłem, aby udostępnić źródło biblioteki poza katalogiem projektu. Zamiast zwykłej Biblioteki Javy, moje kody są kompilowane jako moduł Android, ale ten moduł biblioteki nie jest zawarty w głównym projekcie. Jest mi to w porządku tak długo, jak nie ma duplikacji kodu i muszę tylko zachować jeden zestaw kodu biblioteki dla wszystkich projektów: {]}

1) Plik - > Nowy Projekt. Nadaj nazwę swojemu projektowi bibliotecznemu (tutaj używam LibraryProject). Kontynuuj pozostałe kroki, aby utworzyć normalny projekt (ponieważ jest to przeznaczona jako biblioteka, wybrałem "dodaj bez aktywności") {]}

2) domyślnie Android studio tworzy moduł o nazwie " app " wewnątrz folderu projektu. Aby zapobiec kolizji nazw z rzeczywistym modułem aplikacji, Zmień nazwę modułu na inną (kliknij prawym przyciskiem myszy moduł "app" w lewym panelu->Refactor->Zmień nazwę).

[[17]}3) W build.gradle w folderze modułu biblioteki Zmień górny linia
apply plugin: 'com.android.application'

Do

apply plugin: 'com.android.library'

, a następnie usuń linię "applicationId" pod "defaultConfig". Ponadto, ponieważ jest to biblioteka, Usuń przestrzeń nazw xlmns:... i ciało <application ..> z manifestu.xml również. To wszystko dla biblioteki. Teraz, aby utworzyć / zmodyfikować główną aplikację:

4) jeśli jest to nowy projekt, najpierw Utwórz nowy plik projektu- > Nowy Projekt - > Nazwa aplikacji.

5) Otwórz settings.gradle (w każdym projekcie powinien być tylko jeden taki plik) i dołącz następująca linia (zwróć uwagę na brak dwukropka wiodącego w module biblioteki):

include ':app', '..:LibraryProject:yourLibraryModule'

6) Następnie przejdź do File - >Project Structure.

7) w zakładce "zależności" kliknij zielony przycisk " + " po prawej stronie. Wybierz "zależność modułu". Wybierz moduł biblioteki, a następnie kliknij OK.

Powinieneś teraz móc korzystać z klas biblioteki w swojej aplikacji.


METODA ALTERNATYWNA Jeśli z jakiegoś powodu nadal występują problemy z powyższą metodą, możesz wypróbuj następujące (sugerowane w tutaj):

1) powtórz kroki od 1 do 4 powyżej. Domyślnie główny i zewnętrzny projekt (biblioteka) wyglądają mniej więcej tak:

  /MainProject
    + build.gradle
    + settings.gradle
    + app/
      + build.gradle
      + src/

  /LibraryProject
    + build.gradle
    + settings.gradle
    + app/
      + build.gradle
      + src/

2) Jak zwykle, refaktor nazwy modułów (w android studio kliknij prawym przyciskiem myszy moduł - > refaktor - > Zmień nazwę) na coś mniej mylącego, na przykład

  /MainProject
    + build.gradle
    + settings.gradle
    + MainModule/
      + build.gradle
      + src/

  /LibraryProject
    + build.gradle
    + settings.gradle
    + LibraryModule/
      + build.gradle
      + src/

3) zmodyfikuj settings.gradle W MainProject:

include ':LibraryModule', ':app'
project(':LibraryModule').projectDir = new File(settingsDir, '../LibraryProject/LibraryModule')
Zsynchronizuj projekt i gotowe.

Uwaga na Proguard

Obecnie nie należy używać proguard na zewnętrznych projektach/modułach bibliotecznych. Zamiast tego zastąp następującą (oryginalna odpowiedź tutaj )

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'
    }
    debug {
        minifyEnabled false
    }
}

Z następującym (w build.gradle biblioteki):

buildTypes {
    release {
        consumerProguardFiles 'proguard-project.txt'
    }
}

Gdzie proguard-project.txt jest plikiem zawierającym reguły proguard dla Twojego projektu bibliotecznego.

 78
Author: Neoh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:37

Tak, działa teraz w 0.5.0. Nie ma przyjaznego interfejsu użytkownika (Import projektu nie jest tym, czego chcesz, ponieważ tworzy zupełnie nowy projekt; moduł importu jest nadal uszkodzony; zobacz https://code.google.com/p/android/issues/detail?id=62122 ), ale możesz skonfigurować pliki kompilacji, aby działały.

Załóżmy, że masz strukturę katalogów, która wygląda tak:

MyApp
    appmodule
        build.gradle
            src
                main
                    java
    build.gradle
    settings.gradle
MyPlainJavaLibrary
    build.gradle
    src
        java

Zauważ, że MyPlainJavaLibrary nie znajduje się pod katalogiem MyApp w system plików.

Ustaw swoje ustawienia.gradle plik jak tak:

include ':appmodule', '..:MyPlainJavaLibrary'

I dołącz do niego zależność w build.gradle w ten sposób (nie zapomnij o dwukropku wiodącym):

dependencies {
    ...
    compile project(':..:MyPlainJavaLibrary')
}
To mi pasuje. W mojej przeglądarce projektów widzę teraz MyApp i MyPlainJavaLibrary jako dwa główne katalogi modułów w widoku i mogę sprawić, że instrukcje java import będą działać ponad granicami modułów i tym podobne.

Zauważ, że w tej domyślnej konfiguracji, ten współdzielony moduł będzie tylko mieć jeden folder wyjściowy kompilacji, który będzie współdzielony pomiędzy wszystkimi używającymi go projektami. To może być to, czego chcesz. Jeśli chcesz mieć inny katalog wyjściowy dla każdego projektu za pomocą współdzielonego modułu, prawdopodobnie możesz zrobić trochę magii z katalogiem wyjściowym w sourceSet; Jeśli chcesz pomóc w tym, polecam wypróbowanie go na własną rękę i opublikowanie pytania ze szczegółami na temat swojej pracy, jeśli utkniesz.

Możesz mieć tylko jedno ustawienia.gradle plik na projekt, więc nie będzie to wymagało zupełnie innego projektu multimodule Gradle i sprowadzenia wszystkich modułów za jednym zamachem; będziesz musiał przynieść je indywidualnie. Powinien jednak spełniać przypadek użycia modułu w wielu projektach.

 9
Author: Scott Barta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-08 00:05:07

Chciałem zrobić coś podobnego dla mojego projektu Android Wear, gdzie masz mobile i wear moduły. W Android Studio 1.5.1 możesz zrobić Plik - > Nowy - > Moduł i wybrać bibliotekę Androida jako moduł. To zajmie się wieloma ustawieniami opisanymi powyżej i umieści Twoją bibliotekę wewnątrz Twojego istniejącego projektu Android Wear.

 1
Author: Opus1217,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-22 00:51:00

Aby w pełni wykorzystać Android Studio , polecam początkowo stworzenie normalnego projektu Androida. Następnie, w ramach tego projektu, Dodaj moduł typu "android library "i (opcjonalnie)" java library "(Jeśli masz kod, którego chcesz użyć, który może być wspólny dla aplikacji na Androida i kodu po stronie serwera).

Używając tego mechanizmu, nie musisz manipulować ani modyfikować plików gradle i manifest.

 1
Author: ErstwhileIII,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-22 23:01:55