Pytanie Gradle: plusy / minusy dodające zależności


Jakie są plusy / minusy dodające zależności w build.gradlezamiast dodawać je jako biblioteki zależne?

dependencies {
    compile project(':library')
    ...
    compile 'com.stackoverflow.android:some-great-library:1.0'
    ...
}

Pracując nad projektami Android, często natknąłem się na wspaniałe biblioteki z dokładnie takim rozwiązaniem, jakiego szukałem. Jednak, ponieważ potrzebuję tylko ułamka tego, co te biblioteki mają do zaoferowania, martwię się, jeśli dodam je jako Gradle dependencies to jest przesada.


Komentarz Per @ CommonsWare, mam bardziej szczegółowe pytania.

Czy dodanie zależności:

  1. spowolnić czas kompilacji w zauważalnym tempie?

  2. zwiększyć rozmiar release-apk i debug-apk, tak samo jak rozmiar dodanej zależności?


18
2018-05-31 21:42


pochodzenie


Pobieranie biblioteki, modyfikowanie jej jako części twojego projektu i używanie jej lokalnie byłoby przesadą, IMHO. Dlaczego wpis jednoliniowy w build.gradle plik można uznać za "przesadę"? - CommonsWare
Nie powinno być znaczących różnic między modułem lokalnym a zależnością zdalną w obszarach zainteresowania. Jest to ten sam kod, te same zasoby, te same zasoby, te same pozycje manifestu. Chodzi głównie o to, w jaki sposób docierają one do dysku twardego. Jeśli już, to oczekuję, że zdalna zależność będzie szybsza do zbudowania, po prostu dlatego, że kod źródłowy Java byłby już skompilowany do kodu bajtowego Java. Biorąc to pod uwagę, nie przeprowadziłem analizy wydajności porównującej te dwa. - CommonsWare


Odpowiedzi:


W zależnościach Gradle są zgrupowane w konfiguracje jako konfiguracje zależności. Zewnętrzna zależność jest zależna od niektórych plików zbudowanych poza bieżącą kompilacją i przechowywana w jakimś repozytorium, takim jak centralny Maven lub korporacyjny repozytorium Maven lub Ivy, lub katalog w lokalnym systemie plików.

Rodzaje zależności:

Zależność od modułu zewnętrznego:

Zależność od modułu zewnętrznego w niektórych repozytoriach.

Zależność projektu:

Zależność od innego projektu w tej samej wersji.

Zależność od pliku:

Zależność od zestawu plików w lokalnym systemie plików.

Zależność od modułu klienta:

Zależność od modułu zewnętrznego, w którym znajdują się artefakty   w niektórych repozytoriach, ale meta-dane modułu są określone przez lokalny   budować. Używasz tego rodzaju zależności, kiedy chcesz zastąpić   meta-dane dla modułu.

Zależność API Gradle:

Zależność od API obecnej wersji Gradle. Używasz tego   rodzaj zależności podczas rozwijania niestandardowych wtyczek Gradle i   typy zadań.

Lokalna zależność Groovy:

Zależność od wersji Groovy używanej przez obecną wersję Gradle.   Korzystasz z tego rodzaju zależności, gdy tworzysz niestandardowy Gradle   wtyczki i typy zadań.

Plusy dodające zależności:

  • W Gradle po prostu deklarujesz "nazwy" swoich zależności, i inne warstwy określają, skąd wziąć te zależności.

  • Zmiana kodu możliwa w podprojekcie.

  • Wyczyść bezpośrednią zależność obejmującą wersję używanej biblioteki
    Wyczyść pośrednie zależności zarządzane (tzn. Używana biblioteka korzysta z innej Biblioteka - pliki POM) od Roberta Haltera.

  • dostępność online zależna

  • Wymagana biblioteka sdk jest już zsynchronizowana z projektem dla kompilacje.

Cons:

Jako taki nie ma wad, ale na początkowym etapie podczas dodawania   zależności musimy zsynchronizować, co zajmuje trochę czasu niż po prostu   przeciąganie i upuszczanie pliku jar.

Zmniejszać czas kompilacji w zauważalnym tempie?

Nie, ponieważ biblioteki są kompilowane tylko w czasie synchronizacji.

Zwiększ rozmiar release-apk i debug-apk, tak samo jak rozmiar dodanej zależności?

Nie, ale praktycznie tak, ponieważ zajmuje tylko rozmiar kompilacji   plik (rozmiar binarny), który prawie nie zwiększa rozmiaru w bajtach lub kb, który   trudno jest zidentyfikować.

W końcu dodanie ich jako zależności Gradle'a jest przesadą, gdy potrzebujemy tylko ułamka konkretnej biblioteki?

Zdecydowanie może się zdarzyć, że w twoim przypadku użyjesz tylko a   podzbiór biblioteki. W takim przypadku umożliwiając ProGuard optymalizację   przeprowadzić analizę na poziomie bajtowym, wewnątrz i między metodami   Pomóż zmniejszyć swoją aplikację i biegnij szybciej bez przesady.


7
2018-06-15 12:47





Obawy dotyczą głównie rozmiaru Twojej aplikacji na Androida. Wiele metod lub klas może podnieść limit 64 KB dla pliku dex i zazwyczaj wymaga trybu wielorakiego lub trybu bigowania. Może to powodować problemy ze zgodnością, jeśli masz bardzo starych klientów.

Kiedyś możesz chcieć obejść ten problem, wydobywając tylko te zajęcia, które są ci potrzebne, ale czasami nie jest to łatwa praca.

Jeśli masz włączone proguard, klasy, które nie są używane, mogą być systematycznie usuwane.


4
2018-05-31 22:03





Kopiowanie kodu biblioteki innej firmy do projektu powoduje pewne problemy z obsługą tego projektu Co się stanie, jeśli będziesz musiał użyć tej biblioteki nowszej wersji? Jeśli dodasz go jako zależność, wszystko, czego potrzebujesz, to zmienić numer wersji w konfiguracji systemu kompilacji


3
2018-06-10 12:00





Jakie są plusy / minusy dodające zależności od podprojektu w projekcie budowy Gradle?

dependencies {
    compile project(':library')
}

Plusy

  • Zmiana kodu w: library Podprojekt jest możliwy

Cons

  • Zarządzaj samodzielnie wersją podprojektu Biblioteka

Jakie są plusy / minusy dodające zależności z wersjonowanej biblioteki zależnej a w projekcie Gradle Build?

dependencies {
    compile 'com.stackoverflow.android:some-great-library:1.0'
}

Plusy

  • Wyczyść bezpośrednią zależność obejmującą wersję używanej biblioteki
  • Wyczyść pośrednie zależności zarządzane (tzn. Używana biblioteka korzysta z innej biblioteki - pliki POM)
  • Inny Person / Group zarządza Funkcjonalnością Biblioteki - możesz skupić się na swoim własnym Kodzie.

Cons

  • Żaden

Czy dodawanie zależności to: biblioteka Podprojekt spowalnia czas kompilacji z zauważalną szybkością?

  • Tak, muszą też zostać skompilowane, ponieważ są w kodzie źródłowym w podprojekcie
  • Gradle optimze builtime z definicją wejścia / wyjścia zadania. Zobacz znaczniki UP-TO-DATE podczas budowania.

Czy dodanie zależności w wersji zależnej biblioteki spowalnia czas kompilacji z zauważalną szybkością?

  • Nie, ponieważ biblioteki (.jar) są już skompilowane.

Czy dodanie zależności zwiększa rozmiar release-apk i debug-apk, tak samo jak rozmiar dodanej zależności?

  • Rozmiar apk zwiększa rozmiar binarny (.jar = Zipped .class Files) dodanej zależności.
  • (Jeśli masz włączony program proguard, klasy, które nie są używane, mogą być systematycznie usuwane - z User phdfong)

3
2018-06-13 09:43



kompilacja 'com.stackoverflow.android:some-great-library:1.0' jest tutaj, jak powiedział OP, większość części biblioteki pozostaje nieużywana, jeśli potrzebujesz tylko jej funkcji, Dodaje zależności w postaci zależnej od biblioteki biblioteki starają się ponownie pobrać aktualizacje? - Rachit Mishra
Jeśli wersja nie jest migawką (tj. 1.0-SNAPSHOT), to zwykle nie ma potrzeby ponownego buforowania ostatecznej wersji. W przeciwnym razie użyj ./gradlew ... --refresh-dependencies ... Zobacz docs.gradle.org/current/userguide/gradle_command_line.html - Robert Halter


Myślę, że to pytanie nie jest bardzo zależne od Gradle'a, ale bardziej ogólnie poprzez użycie "narzędzi zarządzania zależnościami".

Z pewnością są sytuacje, w których potrzebujemy tylko podzbioru biblioteki. W takich sytuacjach konieczność zaimportowania całej zależności może nie być najlepszym rozwiązaniem.

Ile to jest "przesada"? Oczywiście zależy to od wielkości twojego projektu. Do ciebie należy ocena, na ile zależność "overkill" może być zależna: na przykład, jeśli potrzebujesz tylko prostej funkcji i importujesz bibliotekę 3 MB, prawdopodobnie tak, to trochę "przesada!

Ponadto należy wziąć pod uwagę, że zwykle "duże" biblioteki są podzielone na moduły, a zatem można zaimportować tylko potrzebny moduł. W przypadku Androida, jak powiedział @phdfond, możesz użyć ProGuard do usunięcia nieużywanych klas w czasie kompilacji, lub możesz wykluczyć je ręcznie za pomocą Gradle:

//...      
sourceSets {
         main {
             java {
                 exclude '**/IDontWantThisClass.java'
             }
         }

Ale IMHO ta sytuacja nie jest bardzo powszechna i możesz mieć wiele zalet, używając Gradle lub innego "narzędzia zarządzania zależnościami" (zauważ, że w Gradle, Maven, ecc ... zarządzanie zależnościami jest tylko jedną z ich funkcjonalności).

Na przykład, jeśli korzystasz z Gradle w skrócie, znasz swoje zależności i możesz je łatwo dodawać / usuwać lub po prostu zmieniać numer, aby zaktualizować ich wersję. Czy kiedykolwiek myślałeś, że twój projekt może zależeć od bibliotek B i C, a oba B i C mogą zależeć od dwóch różnych wersji biblioteki D? Cóż Gradle może również pomóc w takich sytuacjach. Nie mogę kontynuować tutaj, bo nie mam tematów, ale możesz znaleźć wiele informacji na temat tych narzędzi.

Wreszcie myślę, że najważniejszym "CONS" z "narzędzi zarządzania zależnościami" jest początkowy czas nauki i konfiguracji. Jeśli nigdy nie używałeś takiego narzędzia, jak Gradle, pierwsze razy zajmie to więcej czasu niż przeciągnięcie i upuszczenie słoika, więc zdecydowanie zachęcam Cię do używania Gradle w swoich projektach, chyba że jest to "zabawkowy projekt".


2
2018-06-11 07:46





Określa, czy dodać bibliotekę innej firmy jako zależność

Użytkownik deklaruje zależność od biblioteki innej firmy, gdy program używa kodu w tej bibliotece w czasie kompilacji lub w czasie wykonywania. Oznacza to, że kod strony trzeciej musi być osiągalny, gdy program jest uruchomiony, więc jest on pełen twojego programu. Zwiększa się więc rozmiar aplikacji i jest to niepożądane, ponieważ wielu użytkowników nie lubi dużych aplikacji. To również jest śmieszne, kiedy twój program jest mały, a biblioteka innych firm jest ogromna.

Określa, czy dodać moduł innej firmy jako moduł

Nigdy tego nie robiłem, ale jeśli dobrze to zrozumiałem, jest to to samo, co kopiowanie biblioteki wewnątrz twojego projektu, więc możesz ją zmodyfikować. Jeśli używasz wydań, nie będzie różnicy czasu kompilacji z kompilacją zależności zdalnych. Wszystko jest takie samo jak w poprzednim akapicie, ale dodatkowo możesz modyfikować kod (jeśli zezwala na to licencja biblioteczna strony trzeciej).

Czy dodać ekstrakt tylko kod, czego potrzebujesz

Jest to najlepsze rozwiązanie, jeśli potrzebujesz tylko kilku metod z biblioteki i nie jest trudno je wyodrębnić (ponownie, zakładając, że licencja pozwala to zrobić). Z drugiej strony, jeśli użyjesz pewnej solidnej funkcji zewnętrznej i chcesz ją wyodrębnić i zmodyfikować w projekcie, możesz napotkać problemy z utrzymaniem w przyszłości (jeśli zdecydujesz się na migrację do nowej wersji).

Czy dodawanie zależności: spowalnia czas kompilacji z zauważalną szybkością?

Dzięki prawemu dostrojeniu Gradle (działając jako demon w tle, używając przetwarzania równoległego), nie zobaczysz żadnych dramatycznych zmian w typowym projekcie.

Dodaje zależności: zwiększ rozmiar release-apk i   debug-apk, tak samo jak rozmiar dodanej zależności?

Słoju zależności są wysyłane do dex w celu konwersji kodu bajtowego, a także kodu projektu. To nie jest konwersja 1: 1 pod względem rozmiaru, więc odpowiedź brzmi "nie". Również ProGuard ma kilka sztuczek do minimalizacji rozmiaru słoika, a Maven ma podłącz do pakowania wszystkich zależnych słoików w jednym, aby wszystkie mogły zostać zaciemnione.


2
2018-06-10 10:37





Powiedziałbym, że są to zasadniczo różne rzeczy.

1. Podprojekt Gradle

dependencies {
  compile project(':foobarlib')
}

W tym pierwszym przypadku jesteś zależny od podprojektu Android, części projektu gradle, nad którym pracujesz. Możesz także nazwać ten typ zależności module, tak jak Intellij robi.

Jeśli chcesz dokonać zmiany, możesz to zrobić i wszystko, czego potrzeba, aby ta zmiana była widoczna, to kompilacja gradacji projektu gradacji root.

2. Projekt biblioteki Androida

dependencies {
  compile 'com.example:foobarlib:2.1.0'
}

W tym drugim przypadku zależy to od Ciebie artefact (tj. archiwum w JAR lub AAR format), a nie projekt. Jest to zasadniczo czarna skrzynka do twojego projektu gradle. All gradle wie, że zawiera skompilowane klasy (i zasoby w przypadku AAR), których potrzebuje twój projekt.

Jeśli chcesz dokonać zmiany w bibliotece, najpierw musisz zlokalizować odpowiedni projekt, aby edytować jego źródła, skompilować projekt i opublikować nowy artefakt do lokalnego lub zdalnego maven repository. Na koniec, aby twój projekt mógł zobaczyć zmiany dokonane w tym innym projekcie, będziesz musiał zaktualizować numer wersji zadeklarowanej w zależności, aby gradle wiedział, że będzie musiał przynieść nowo opublikowany artefakt.

Który jest lepszy?

To oczywiście zależy. Wystarczy pomyśleć, czy biblioteka ma poczucie, że jest samodzielna, czy też w rzeczywistości jest tylko modułem aplikacji. Jak zauważyłeś, drugie podejście zwiększa obciążenie, jeśli pracujesz nad modułem aplikacji, a także nie ma sensu wprowadzać wersji i rozpowszechniać tych zmian bez reszty aplikacji.


1
2018-06-13 18:17





Zależność Gradle'a jest przesadą

Cóż, jeśli używasz stabilnej biblioteki lub jesteś zadowolony z aktualnych funkcji biblioteki. Również wtedy, gdy biblioteka ma zależności do wstecznego portowania lub ma zestaw funkcji lub klas, których po prostu nie potrzebujesz.

Rozwiązanie zostanie pobrane z biblioteki (tylko wtedy, gdy masz pewność, że wystarczą twoje wymagania)

I nie jest

Jeśli chcesz automatyczne aktualizacje i poprawki do biblioteki, łatwość integracji. Wiele bibliotek jest tworzonych i utrzymywanych codziennie. Tak więc rozmiar APK nie ma dla nas aż tak dużego znaczenia, podobnie jak aktualizacje biblioteki, więc importowanie stopni jest tam dobre.

Obawy dotyczące rozmiaru pliku APK

Zależność gradle może mieć wiele niezwiązanych ze sobą rzeczy, wsparcie zwrotne, którego twoja aplikacja nie wymaga, co ostatecznie zwiększa rozmiar aplikacji, również spowoduje powolną kompilację.

Tak więc, jeśli biblioteka ma jedną klasę lub mniej klas, możesz ją bezpośrednio dodać do swojej aplikacji w jakimś pakiecie. Dobrym przykładem będzie aplikacja Google IO, w której niektóre biblioteki znajdują się w innym pakiecie.

Możesz także kontrolować, co się dzieje z debugerem lub wydaniem apk, aby użyć zależności od debugowania debugCompile, dla zależności zależności testowych testCompile

Dodawanie biblioteki jako zależności modułu

Dodanie modułu bibliotecznego przyspieszy proces kompilacji o czas pobierania wymagany do pobrania zależności, który można łatwo uzyskać przez Włącz synchronizację offline dla Gradle w studiu Android.

Również moduły biblioteczne są sposobem, jeśli stworzyłeś jakąś prywatną bibliotekę i używasz jej w swoich własnych projektach, jeśli tak nie jest, będziesz miał bibliotekę opublikowaną i utrzymywaną na serwerze centralnym i łatwiej będzie ją zintegrować z własnym zestawem projektów przez gradle.


1
2018-06-15 13:59