Wtyczka Androida do obsługi Gradle w wersji 3.6.0 (luty 2020 r.)
Ta wersja wtyczki Androida wymaga:
Wersja minimalna | Wersja domyślna | Uwagi | |
---|---|---|---|
Gradle | 5.6.4 | 5.6.4 | Więcej informacji znajdziesz w sekcji Aktualizowanie Gradle. |
SDK Build Tools | 28.0.3 | 28.0.3 | Zainstaluj lub skonfiguruj narzędzia do kompilacji pakietu SDK. |
Ta niewielka aktualizacja zapewnia zgodność z nowymi ustawieniami domyślnymi i funkcjami widoczności pakietu w Androidzie 11.
Szczegółowe informacje znajdziesz w informacjach o wersji 4.0.1.
Nowe funkcje
Ta wersja wtyczki Androida do obsługi Gradle zawiera te nowe funkcje:
Wyświetl powiązanie
Powiązanie widoku zapewnia bezpieczeństwo w czasie kompilacji podczas odwoływania się do widoków w kodzie. Możesz teraz zastąpić findViewById()
odwołaniem do wygenerowanej automatycznie klasy powiązań. Aby zacząć korzystać z powiązania widoków, w pliku build.gradle
każdego modułu umieść ten kod:
android { viewBinding.enabled = true }
android { viewBinding.enabled = true }
Więcej informacji znajdziesz w dokumentacji dotyczącej powiązania widoku.
Obsługa wtyczki Maven Publish
Wtyczka Androida do obsługi Gradle obsługuje wtyczkę Gradle do publikowania w Mavenie, która umożliwia publikowanie artefaktów kompilacji w repozytorium Apache Maven. Wtyczka Androida do Gradle 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 tworzenia wersji debugowania 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 starego narzędzia do pakowania, dodając do pliku gradle.properties
ten kod:
android.useNewApkCreator=false
Atrybucja kompilacji natywnej
Możesz teraz określić, ile czasu zajmuje Clangowi kompilacja i linkowanie każdego pliku C/C++ w projekcie. Gradle może wygenerować ślad Chrome zawierający sygnatury czasowe tych zdarzeń kompilatora, dzięki czemu możesz lepiej zrozumieć, ile czasu zajmuje kompilacja projektu. Aby wygenerować ten plik atrybucji kompilacji, wykonaj te czynności:
-
Dodaj flagę
-Pandroid.enableProfileJson=true
podczas uruchamiania kompilacji Gradle. Na przykład:gradlew assembleDebug -Pandroid.enableProfileJson=true
-
Otwórz przeglądarkę Chrome i na pasku wyszukiwania wpisz
chrome://tracing
. -
Kliknij przycisk Wczytaj i przejdź do
<var>project-root</var>/build/android-profile
, aby znaleźć plik. Plik ma nazwęprofile-<var>timestamp</var>.json.gz
.
Dane atrybucji kompilacji natywnej znajdziesz u góry przeglądarki:
Zmiany w działaniu
Podczas korzystania z tej wersji wtyczki możesz zauważyć następujące zmiany w jej działaniu:
Domyślnie biblioteki natywne są pakowane bez kompresji
Podczas tworzenia aplikacji wtyczka domyślnie ustawia wartość extractNativeLibs
na "false"
. Oznacza to, że biblioteki natywne są wyrównane do stron i spakowane bez kompresji. Chociaż powoduje to większy rozmiar przesyłanego pliku, użytkownicy zyskują:
- Mniejszy rozmiar instalacji aplikacji, ponieważ platforma może uzyskiwać dostęp do bibliotek natywnych bezpośrednio z zainstalowanego pliku APK bez tworzenia kopii bibliotek.
- Mniejszy rozmiar pobierania, ponieważ kompresja w Sklepie Play jest zwykle lepsza, gdy w pliku APK lub pakiecie Android App Bundle uwzględnisz nieskompresowane biblioteki natywne.
Jeśli chcesz, aby wtyczka Androida do obsługi Gradle pakowała skompresowane biblioteki natywne, w pliku manifestu aplikacji umieść ten kod:
<application
android:extractNativeLibs="true"
... >
</application>
Uwaga: atrybut extractNativeLibs
manifest
został zastąpiony opcją useLegacyPackaging
DSL. 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 Androida do Gradle wybierze domyślną wersję do kompilowania plików kodu źródłowego.
Wcześniej wtyczka wybierała najnowszą pobraną wersję NDK.
Użyj właściwości android.ndkVersion
w pliku build.gradle
modułu, aby zastąpić domyślne ustawienie wybrane przez wtyczkę.
Uproszczone generowanie klasy R
Wtyczka Androida do Gradle 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żnościom modułu. Ta optymalizacja powinna przyspieszyć kompilację, ale musisz pamiętać o tych kwestiach:
- Kompilator udostępnia klasy R zależnościom modułu nadrzędnego, 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ędniania 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. Jednak inne biblioteki mogą nie mieć dostępu do klasy R biblioteki B. Jeśli biblioteka A używa konfiguracji zależności
implementation
. Więcej informacji znajdziesz w artykule o konfiguracjach zależności.
Usuwanie zasobów, których brakuje w konfiguracji domyślnej
W przypadku modułów biblioteki, jeśli uwzględnisz zasób dla języka, którego nie ma w domyślnym zestawie zasobów (np. jeśli uwzględnisz hello_world
jako zasób ciągu tekstowego w /values-es/strings.xml
, ale nie zdefiniujesz tego zasobu w /values/strings.xml
), wtyczka Androida do Gradle nie będzie już uwzględniać tego zasobu podczas kompilowania projektu. Ta zmiana w działaniu powinna zmniejszyć liczbę Resource Not Found
wyjątków w czasie działaniaResource Not Found
i przyspieszyć kompilację.
D8 uwzględnia teraz zasady przechowywania CLASS w przypadku adnotacji
Podczas kompilowania aplikacji kompilator D8 uwzględnia teraz, kiedy adnotacje stosują zasadę zachowywania CLASS, a te adnotacje nie są już dostępne w czasie działania. To zachowanie występuje również w przypadku ustawienia docelowego pakietu SDK aplikacji na poziom interfejsu API 23, który wcześniej umożliwiał dostęp do tych adnotacji w czasie działania podczas kompilowania aplikacji przy użyciu starszych wersji wtyczki Androida do obsługi Gradle i D8.
Inne zmiany w działaniu
-
aaptOptions.noCompress
nie rozróżnia już wielkości liter na wszystkich platformach (w przypadku plików APK i pakietów) i uwzględnia ścieżki, w których użyto wielkich liter. -
Wiązanie danych jest teraz domyślnie przyrostowe. Więcej informacji znajdziesz w problemie nr 110061530.
-
Wszystkie testy jednostkowe, w tym testy jednostkowe Roboelectric, można teraz w pełni buforować. Więcej informacji znajdziesz w tym artykule.
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 nr 126775542.
- Możesz teraz uruchamiać
connectedAndroidTest
zadania w wielu modułach, gdy włączony jest tryb równoległego wykonywania Gradle.
Znane problemy
W tej sekcji opisujemy znane problemy występujące we wtyczce Androida do obsługi Gradle w wersji 3.6.0.
Powolne działanie zadania Android Lint
W przypadku niektórych projektów narzędzie Android Lint może działać znacznie dłużej z powodu regresji w infrastrukturze analizowania, co powoduje wolniejsze obliczanie wnioskowanych typów dla wyrażeń lambda w określonych konstrukcjach kodu.
Problem jest zgłaszany jako błąd w IDEA i zostanie rozwiązany w wtyczce Androida do obsługi Gradle w wersji 4.0.
Brak klasy manifestu {:#agp-missing-manifest}
Jeśli aplikacja definiuje w manifeście uprawnienia niestandardowe, wtyczka Androida Gradle zwykle generuje klasę Manifest.java
, która zawiera uprawnienia niestandardowe jako stałe ciągi znaków. Wtyczka pakuje tę klasę z aplikacją, dzięki czemu możesz łatwiej odwoływać się do tych uprawnień w czasie działania.
Generowanie klasy manifestu nie działa w wtyczce Androida do obsługi Gradle w wersji 3.6.0.
Jeśli tworzysz aplikację za pomocą tej wersji wtyczki i odwołuje się ona do klasy manifestu, może pojawić się wyjątek ClassNotFoundException
. Aby rozwiązać ten problem, wykonaj jedną z tych czynności:
-
Odwołuj się do uprawnień niestandardowych za pomocą ich 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"; } }