Wtyczka Androida do obsługi Gradle 3.6.0 (luty 2020 r.)
Ta wersja wtyczki na Androida wymaga:
Minimalna wersja | Wersja domyślna | Uwagi | |
---|---|---|---|
Gradle | 5.6.4 | 5.6.4 | Więcej informacji znajdziesz w artykule Aktualizowanie Gradle. |
Narzędzia do kompilowania pakietu SDK | 28.0.3 | 28.0.3 | Zainstaluj lub skonfiguruj narzędzia do kompilowania pakietu SDK. |
Ta niewielka aktualizacja zapewnia zgodność z nowymi ustawieniami domyślnymi i funkcjami dotyczącymi widoczności pakietów w Androidzie 11.
Szczegółowe informacje znajdziesz w informacjach o wersji 4.0.1.
Nowe funkcje
Ta wersja wtyczki Gradle na Androida zawiera te nowe funkcje:
Wyświetlanie powiązania
Wiązanie widoku zapewnia bezpieczeństwo w czasie kompilacji podczas odwoływania się do widoków w kodzie. Możesz teraz zastąpić findViewById()
automatycznie wygenerowanym odwołaniem do klasy wiążącej. Aby zacząć używać łączenia widoku,
dodaj do pliku build.gradle
każdego modułu:
android { viewBinding.enabled = true }
android { viewBinding.enabled = true }
Aby dowiedzieć się więcej, zapoznaj się z dokumentacją.
Obsługa wtyczki Maven Publish
Wtyczka Androida do obsługi Gradle obsługuje wtyczkę Maven Publish Gradle, która umożliwia publikowanie artefaktów kompilacji w repozytorium Apache Maven. Wtyczka Gradle na Androida tworzy komponent dla każdego artefaktu wariantu kompilacji w aplikacji lub module biblioteki, którego możesz użyć do dostosowania publikacji w repozytorium Maven.
Więcej informacji znajdziesz na stronie poświęconej korzystaniu z wtyczki Maven Publish.
Nowe domyślne narzędzie do pakowania
Podczas kompilowania wersji debugowej aplikacji wtyczka używa nowego narzędzia do pakowania o nazwie zipflinger, aby utworzyć plik APK. To nowe narzędzie powinno przyspieszyć kompilację. Jeśli nowe narzędzie do pakowania nie działa zgodnie z oczekiwaniami, zgłoś błąd. Możesz wrócić do korzystania ze starego narzędzia do pakowania, dodając do pliku gradle.properties
:
android.useNewApkCreator=false
Atrybucja natywnych wersji aplikacji
Możesz teraz określić, ile czasu zajmie Clangowi kompilowanie i linkowanie każdego pliku C/C++ w Twoim projekcie. Gradle może wygenerować ślad Chrome zawierający sygnatury czasowe tych zdarzeń kompilatora, aby umożliwić Ci lepsze zrozumienie czasu potrzebnego na kompilację projektu. Aby wygenerować ten plik atrybucji kompilacji:
-
Dodaj flagę
-Pandroid.enableProfileJson=true
podczas uruchamiania kompilacji Gradle. Może to obejmować np. te funkcje:gradlew assembleDebug -Pandroid.enableProfileJson=true
-
Otwórz przeglądarkę Chrome i na pasku wyszukiwania wpisz
chrome://tracing
. -
Kliknij przycisk Wczytaj i znajdź plik w folderze
<var>project-root</var>/build/android-profile
. Plik ma nazwęprofile-<var>timestamp</var>.json.gz
.
Dane atrybucji w przypadku natywnych aplikacji mobilnych znajdziesz u góry widoku:
Zmiany w zachowaniu
Podczas korzystania z tej wersji wtyczki możesz zauważyć te zmiany w zachowaniu.
Biblioteki natywne pakowane bez kompresji domyślnie
Podczas kompilowania aplikacji wtyczka ustawia teraz parametr extractNativeLibs
na "false"
. Oznacza to, że biblioteki natywne są wyrównane do strony i zapakowane w nieskompresowany sposób. Wprawdzie zwiększa to rozmiar przesyłanych danych, ale użytkownicy zyskują:
- Mniejszy rozmiar instalowanej aplikacji, ponieważ platforma może uzyskać dostęp do natywnych bibliotek bezpośrednio z zainstalowanego pliku APK bez tworzenia kopii tych bibliotek.
- Mniejszy rozmiar pliku do pobrania, ponieważ kompresja w Google Play jest zazwyczaj lepsza, gdy w pliku APK lub pakiecie Android App Bundle są nieskompresowane biblioteki natywne.
Jeśli chcesz, aby wtyczka Androida do obsługi Gradle skompresowała biblioteki natywne, dodaj do pliku manifestu aplikacji te informacje:
<application
android:extractNativeLibs="true"
... >
</application>
Uwaga: atrybut manifestu extractNativeLibs
został zastąpiony opcją DSL useLegacyPackaging
. Więcej informacji znajdziesz w informacjach o wersji Używanie DSL do pakowania skompresowanych bibliotek natywnych.
Domyślna wersja NDK
Jeśli pobierzesz kilka wersji NDK, wtyczka Gradle dla Androida wybierze teraz domyślną wersję do użycia podczas kompilowania plików kodu źródłowego.
Wcześniej wtyczka wybierała najnowszą pobraną wersję NDK.
Aby zastąpić domyślne ustawienie wybrane przez wtyczkę, użyj właściwości android.ndkVersion
w pliku build.gradle
modułu.
Uproszczona generacja klasy R
Wtyczka Gradle dla Androida upraszcza ścieżkę kompilacji, generując tylko jedną klasę R dla każdego modułu biblioteki w projekcie i udostępniając te klasy R innym zależnym modułom. Ta optymalizacja powinna skutkować szybszym tworzeniem, ale wymaga uwzględnienia tych kwestii:
- Kompilator udostępnia klasy R z zależnościami modułów źródłowych, dlatego ważne jest, aby każdy moduł w projekcie używał unikalnej nazwy pakietu.
- Widoczność klasy R biblioteki dla innych zależności projektu jest określana przez konfigurację używaną do uwzględnienia biblioteki jako zależności. Jeśli na przykład biblioteka A zawiera bibliotekę B jako zależność „api”, biblioteka A i inne biblioteki, które są od niej zależne, mają dostęp do klasy R biblioteki B. Inne biblioteki mogą jednak nie mieć dostępu do klasy R biblioteki B. Jeśli biblioteka A używa konfiguracji zależności
implementation
. Aby dowiedzieć się więcej, przeczytaj artykuł o konfiguracjach zależności.
Usuwanie zasobów, których brakuje w domyślnej konfiguracji
W przypadku modułów bibliotek, jeśli uwzględnisz zasób dla języka, którego nie uwzględniasz w domyślnym zestawie zasobów (np. uwzględnisz zasób hello_world
jako zasób ciągu tekstowego w pliku /values-es/strings.xml
, ale nie zdefiniujesz go w pliku /values/strings.xml
), wtyczka Android Gradle nie uwzględnia już tego zasobu podczas kompilowania projektu. Ta zmiana zachowania powinna skutkować mniejszą liczbą wyjątków Resource Not Found
w czasie wykonywania oraz większą szybkością kompilacji.
D8 przestrzega teraz zasad dotyczących przechowywania CLASS w przypadku adnotacji
Podczas kompilowania aplikacji D8 uwzględnia teraz, kiedy adnotacje stosują zasadę CLASS dotyczącą przechowywania, i te adnotacje nie są już dostępne w czasie wykonywania. To zachowanie występuje również wtedy, gdy ustawisz docelowy pakiet SDK aplikacji na poziom API 23, który wcześniej umożliwiał dostęp do tych adnotacji w czasie działania podczas kompilowania aplikacji za pomocą starszych wersji wtyczki Android Gradle i D8.
Inne zmiany w działaniu
-
aaptOptions.noCompress
nie jest już zależne od wielkości liter na wszystkich platformach (zarówno w przypadku plików APK, jak i pakietów) i uwzględnia ścieżki z użyciem wielkich liter. -
Połączenie danych jest teraz domyślnie stosowane stopniowo. Więcej informacji znajdziesz w problemie #110061530.
-
Wszystkie testy jednostkowe, w tym testy jednostkowe Roboelectric, są teraz w pełni dostępne w pamięci podręcznej. Więcej informacji znajdziesz w problemie 115873047.
Poprawki błędów
Ta wersja wtyczki Androida do obsługi Gradle zawiera te poprawki błędów:
- Testy jednostkowe Robolectric są teraz obsługiwane w modułach biblioteki, które korzystają z wiązania danych. Więcej informacji znajdziesz w problemie 126775542.
- Gdy włączony jest tryb wykonywania zadań równolegle w Gradle, możesz teraz wykonywać zadania
connectedAndroidTest
w wielu modułach.
Znane problemy
W tej sekcji opisano znane problemy występujące w wersji 3.6.0 wtyczki Androida do obsługi Gradle.
Powolny proces sprawdzania Androida Lint
W przypadku niektórych projektów wykonanie Android Lint może potrwać znacznie dłużej z powodu regresji w infrastrukturze analizowania, co powoduje wolniejsze obliczanie typów inferowanych dla funkcji lambda w niektórych konstrukcjach kodu.
Problem został zgłoszony jako błąd w IDE i zostanie rozwiązany w wersji 4.0 wtyczki Androida do obsługi Gradle.
Brak klasy manifestu {:#agp-missing-manifest}
Jeśli aplikacja definiuje niestandardowe uprawnienia w manifeście, wtyczka Gradle dla Androida zwykle generuje klasę Manifest.java
, która zawiera niestandardowe uprawnienia jako stałe ciągi znaków. Wtyczka pakuje tę klasę w aplikacji, aby ułatwić Ci odwoływanie się do tych uprawnień w czasie działania.
Generowanie klasy manifestu jest uszkodzone w wersji 3.6.0 wtyczki Androida do obsługi Gradle.
Jeśli skompilujesz aplikację z tą wersją wtyczki i odwołuje się ona do klasy manifestu, możesz zobaczyć wyjątek ClassNotFoundException
. Aby rozwiązać ten problem, wykonaj jedną z tych czynności:
-
Odwołuj się do uprawnień niestandardowych według pełnej nazwy. Na przykład:
"com.example.myapp.permission.DEADLY_ACTIVITY"
. -
Zdefiniuj własne stałe, jak pokazano poniżej:
public final class CustomPermissions { public static final class permission { public static final String DEADLY_ACTIVITY="com.example.myapp.permission.DEADLY_ACTIVITY"; } }