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.

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:

  1. Dodaj flagę -Pandroid.enableProfileJson=true podczas uruchamiania kompilacji Gradle. 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 otwórz folder <var>project-root</var>/build/android-profile , aby znaleźć plik. Plik ma nazwę profile-<var>timestamp</var>.json.gz.

Dane atrybucji w przypadku natywnych aplikacji mobilnych znajdziesz u góry widoku:

Śledzenie atrybucji w natywnym pakiecie w Chrome

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 instalacyjny 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 przynieść szybsze kompilacje, 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 zależne od biblioteki A 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, a 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 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 Lintu w Androidzie

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 niestandardowych uprawnień 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";
                  }
                }