Wtyczka Androida do obsługi Gradle w wersji 3.6.0 (luty 2020)

Ta wersja wtyczki Androida wymaga:

Wersja minimalna Wersja domyślna Uwagi
Gradle 5.6.4 5.6.4 Więcej informacji znajdziesz w artykule o aktualizowaniu Gradle.
Narzędzia do kompilacji pakietu SDK 28.0.3 28.0.3 Zainstaluj lub skonfiguruj narzędzia SDK do kompilacji.

Nowe funkcje

Ta wersja wtyczki Androida do obsługi Gradle zawiera te nowe funkcje.

Wyświetl powiązanie

Wyświetl powiązanie zapewnia bezpieczeństwo w czasie kompilacji podczas odwoływania się do widoków w kodzie. Teraz możesz zastąpić findViewById() automatycznie wygenerowanym odwołaniem do klasy powiązania. Aby zacząć korzystać z wyświetlania powiązania, dodaj ten kod do pliku build.gradle każdego modułu:

      android {
          viewBinding.enabled = true
      }
      
      android {
          viewBinding.enabled = true
      }
      

Więcej informacji znajdziesz w dokumentacji powiązania widoku.

Obsługa wtyczki Maven Publish

Wtyczka Androida do obsługi Gradle obsługuje wtyczkę Gradle Maven Publish, która umożliwia publikowanie artefaktów kompilacji w repozytorium Apache Maven. Wtyczka Androida do obsługi Gradle tworzy a komponent dla każdego artefaktu wariantu kompilacji w module aplikacji lub biblioteki, którego możesz użyć do dostosowania a publikacji w repozytorium Maven.

Więcej informacji znajdziesz na stronie dotyczącej korzystania 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. Aby wrócić do starego narzędzia do pakowania, dodaj ten kod do pliku gradle.properties:

        android.useNewApkCreator=false
      

Atrybucja kompilacji natywnej

Możesz teraz określić, ile czasu zajmuje Clangowi kompilacja i łączenie każdego pliku C/C++ w projekcie. Gradle może wygenerować ślad Chrome’a 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:

  1. Podczas uruchamiania kompilacji Gradle dodaj flagę -Pandroid.enableProfileJson=true gdy. Na przykład:

    gradlew assembleDebug -Pandroid.enableProfileJson=true

  2. Otwórz przeglądarkę Chrome i w pasku wyszukiwania wpisz chrome://tracing w.

  3. Kliknij przyc0}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:

Śledzenie atrybucji w natywnej wersji Chrome

Zmiany w zachowaniu

Podczas korzystania z tej wersji wtyczki możesz zauważyć te zmiany w działaniu.

Domyślnie pakowane nieskompresowane biblioteki natywne

Podczas kompilowania aplikacji wtyczka domyślnie ustawia wartość extractNativeLibs na "false". Oznacza to, że biblioteki natywne są wyrównane do strony i pakowane bez kompresji. Chociaż powoduje to zwiększenie rozmiaru przesyłanego pliku, użytkownicy mogą korzystać z tych zalet:

  • 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 znajdują się nieskompresowane biblioteki natywne.

Jeśli chcesz, aby wtyczka Androida do obsługi Gradle pakowała skompresowane biblioteki natywne, dodaj ten kod do manifestu aplikacji:

        <application
          android:extractNativeLibs="true"
          ... >
        </application>
        
      

Uwaga: atrybut manifestu extractNativeLibs został zastąpiony opcją DSL useLegacyPackaging. Więcej informacji znajdziesz w informacjach o wersji Korzystanie z DSL do pakowania skompresowanych bibliotek natywnych.

Domyślna wersja NDK

Jeśli pobierzesz kilka wersji NDK, wtyczka Androida do obsługi Gradle teraz wybierze 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ślną wersję wybraną przez wtyczkę, użyj właściwości android.ndkVersion w pliku modułu build.gradle.

Uproszczone generowanie klasy R

Wtyczka Androida do obsługi Gradle upraszcza ścieżkę kompilacji, generując tylko 1 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 wymaga, aby pamiętać o tych kwestiach:

  • Ponieważ kompilator udostępnia klasy R zależnościom modułu nadrzędnego , 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 zależne od biblioteki A 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 tekstowy w /values-es/strings.xml, ale nie zdefiniujesz tego zasobu w /values/strings.xml), wtyczka Androida do obsługi Gradle nie będzie już uwzględniać tego zasobu podczas kompilowania projektu. Ta zmiana w działaniu powinna zmniejszyć liczbę wyjątków środowiska wykonawczego Resource Not Found i przyspieszyć kompilację.

D8 uwzględnia teraz zasadę przechowywania CLASS w przypadku adnotacji

Podczas kompilowania aplikacji D8 uwzględnia teraz, kiedy adnotacje stosują zasadę przechowywania CLASS, a te adnotacje nie są już dostępne w czasie wykonywania. To zachowanie występuje też 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 wykonywania podczas kompilowania aplikacji za pomocą starszych wersji wtyczki Androida do obsługi Gradle i D8.

Inne zmiany w działaniu

  • aaptOptions.noCompress nie uwzględnia już wielkości liter na wszystkich platformach (zarówno w przypadku plików APK, jak i pakietów) i uwzględnia ścieżki, które używają wielkich liter.
  • Wiązanie danych jest teraz domyślnie przyrostowe. Więcej informacji znajdziesz w artykule #110061530.

  • Wszystkie testy jednostkowe, w tym testy jednostkowe Robolectric, można teraz w pełni buforować. Więcej informacji znajdziesz w artykule #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 używają wiązania danych. Więcej informacji znajdziesz w artykule #126775542.
  • Możesz teraz uruchamiać connectedAndroidTest zadania w wielu modułach, gdy jest włączony tryb równoległego wykonywania Gradle.

Znane problemy

W tej sekcji opisujemy znane problemy, które występują w wtyczce Androida do obsługi Gradle w wersji 3.6.0.

Powolne działanie zadania Android Lint

W przypadku niektórych projektów wykonanie zadania Android Lint może trwać znacznie dłużej ze względu na a regresję w infrastrukturze analizy, co powoduje wolniejsze obliczanie typów wnioskowanych dla lambd w niektórych konstrukcjach kodu.

Problem został zgłoszony jako błąd w IDEA i zostanie rozwiązany w wtyczce Androida do obsługi Gradle w wersji 4.0.

Brakująca klasa manifestu {:#agp-missing-manifest}

Jeśli aplikacja definiuje w pliku manifestu uprawnienia niestandardowe, wtyczka Androida do obsługi Gradle zwykle generuje klasę Manifest.java, która zawiera uprawnienia niestandardowe jako stałe ciągi tekstowe. Wtyczka pakuje tę klasę z aplikacją, dzięki czemu możesz łatwiej odwoływać się do tych uprawnień w czasie wykonywania.

Generowanie klasy manifestu jest uszkodzone w wtyczce Androida do obsługi Gradle w wersji 3.6.0. Jeśli skompilujesz 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 w pełni kwalifikowanej 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";
                  }
                }