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.

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:

  1. Dodaj flagę -Pandroid.enableProfileJson=true podczas uruchamiania kompilacji Gradle. Na przykład:

    gradlew assembleDebug -Pandroid.enableProfileJson=true

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

  3. 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:

Śledzenie atrybucji w natywnej wersji Chrome

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 Foundwyją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";
                  }
                }