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

Ta wersja wtyczki na Androida wymaga:

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 kompilowania podczas odwoływania się do widoków w kodzie. Możesz teraz zastąpić findViewById() wygenerowanym automatycznie odwołaniem do klasy wiązania. Aby zacząć korzystać z powiązania widoku danych, w pliku build.gradle każdego modułu umieść te elementy:

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

Więcej informacji znajdziesz w dokumentacji powiązań.

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 Androida do obsługi Gradle tworzy komponent dla każdego artefaktu wersji kompilacji w aplikacji lub module biblioteki, którego możesz użyć, aby dostosować publikację do repozytorium Maven.

Aby dowiedzieć się więcej, wejdź na stronę o tym, jak korzystać z wtyczki Maven Publish.

Nowe domyślne narzędzie do tworzenia pakietów

Gdy tworzysz wersję aplikacji do debugowania, korzysta ona z nowego narzędzia do tworzenia pakietów o nazwie zipflinger, aby utworzyć plik APK. To nowe narzędzie powinno zapewnić szybsze kompilacje. Jeśli nowe narzędzie do tworzenia pakietów nie działa zgodnie z oczekiwaniami, zgłoś błąd. Aby wrócić do starego narzędzia do tworzenia pakietów, umieść w pliku gradle.properties te informacje:

        android.useNewApkCreator=false
      

Atrybucja tworzenia kreacji natywnych

Możesz teraz określić czas potrzebny Clang na skompilowanie i połączenie poszczególnych plików C/C++ w projekcie. Gradle może wyświetlić log czasu Chrome zawierający sygnatury czasowe zdarzeń kompilatora, aby umożliwić Ci lepsze poznanie czasu potrzebnego na utworzenie projektu. Aby wyświetlić wyjściowy plik atrybucji kompilacji, wykonaj te czynności:

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

    gradlew assembleDebug -Pandroid.enableProfileJson=true

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

  3. Kliknij przycisk Wczytaj i przejdź do <var>project-root</var>/build/android-profile, aby znaleźć plik. Plik będzie miał nazwę profile-<var>timestamp</var>.json.gz.

Dane o atrybucji kompilacji natywnych możesz zobaczyć u góry okna użytkownika:

Śledzenie atrybucji kompilacji natywnej w Chrome

Zmiany w działaniu

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

Biblioteki natywne w pakietach domyślnie nieskompresowanych

Gdy tworzysz aplikację, wtyczka domyślnie ustawia dla parametru extractNativeLibs wartość "false". Oznacza to, że Twoje biblioteki natywne są wyrównane do strony i spakowane bez kompresji. Powoduje to wzrost rozmiaru przesyłanych plików, ale zapewniają użytkownikom następujące korzyści:

  • Mniejszy rozmiar instalacji aplikacji, ponieważ platforma może uzyskiwać dostęp do bibliotek natywnych bezpośrednio z zainstalowanego pliku APK, bez konieczności tworzenia kopii bibliotek.
  • Mniejszy rozmiar pobieranego pliku, ponieważ kompresja Sklepu Play jest zwykle lepsza, gdy do pliku APK lub pakietu Android App Bundle dołączysz nieskompresowane biblioteki natywne.

Jeśli chcesz, aby wtyczka Androida do obsługi Gradle zamiast skompresowanych bibliotek natywnych umieścić w pliku manifestu aplikacji ten kod:

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

Uwaga: atrybut pliku 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 pakietu NDK, wtyczka Androida do obsługi Gradle wybiera teraz wersję domyślną używaną podczas kompilowania plików z kodem źródłowym. Wcześniej wtyczka wybierała ostatnio pobraną wersję pakietu NDK. Użyj właściwości android.ndkVersion w pliku build.gradle modułu, aby zastąpić ustawienie domyślne wybrane przez wtyczkę.

Uproszczone generowanie klasy R

Wtyczka Androida do obsługi Gradle upraszcza kompilację ścieżki klasy, generując tylko 1 klasę R dla każdego modułu biblioteki w projekcie i udostępniając te klasy R różnym zależnościom modułów. Ta optymalizacja powinna przyspieszyć kompilacje, ale wymaga rozważenia tych kwestii:

  • Kompilator współużytkuje klasy R z zależnościami modułu nadrzędnego, dlatego każdy moduł w projekcie musi używać unikalnej nazwy pakietu.
  • Widoczność klasy R biblioteki w odniesieniu do innych zależności projektu zależy od konfiguracji użytej do uwzględnienia biblioteki jako zależności. Jeśli na przykład biblioteka A uwzględnia 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 korzysta z konfiguracji zależności implementation. Aby dowiedzieć się więcej, poczytaj o konfiguracjach zależności.

Usuń zasoby, których brakuje w konfiguracji domyślnej

Jeśli w przypadku modułów biblioteki uwzględnisz zasób dla języka, którego nie uwzględnisz w domyślnym zbiorze zasobów – na przykład 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ż zawierać tego zasobu podczas kompilowania projektu. Ta zmiana działania powinna skutkować mniejszą liczbą wyjątków środowiska wykonawczego Resource Not Found i zwiększyć szybkość kompilacji.

D8 przestrzega teraz zasady przechowywania CLASS dla adnotacji

Podczas kompilacji aplikacji D8 respektuje teraz, kiedy adnotacje stosują zasady przechowywania CLASS, a adnotacje nie są już dostępne w czasie działania. Dzieje się tak również wtedy, gdy docelowy pakiet SDK aplikacji jest ustawiony na interfejs API na poziomie 23, co wcześniej umożliwiało dostęp do tych adnotacji w trakcie działania podczas kompilowania aplikacji przy użyciu starszych wersji wtyczki Androida do obsługi Gradle i wersji D8.

Inne zmiany w działaniu

  • Parametr 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, w których występują wielkie litery.
  • Powią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 zapisywać w pamięci podręcznej. Więcej informacji znajdziesz w problemie nr 115873047.

Poprawki błędów

Ta wersja wtyczki Androida do obsługi Gradle zawiera te poprawki:

  • Robolectryczne testy jednostkowe 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ć zadania connectedAndroidTest w wielu modułach, gdy włączony jest tryb wykonywania równoległego Gradle.

Znane problemy

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

Niska wydajność zadania Android Lint

W niektórych projektach narzędzie Android Lint może potrwać znacznie dłużej ze względu na regresję w infrastrukturze analizy, co skutkuje wolniejszym obliczaniem przewidywanych typów lambda w niektórych konstrukcjach kodu.

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

Brak klasy pliku manifestu {:#agp-missing-manifest}

Jeśli Twoja aplikacja określa w swoim pliku manifestu uprawnienia niestandardowe, wtyczka Androida do obsługi Gradle zwykle generuje klasę Manifest.java, która zawiera Twoje niestandardowe uprawnienia w postaci stałych ciągów znaków. Wtyczka spakuje tę klasę z Twoją aplikacją, dzięki czemu możesz łatwiej odwoływać się do tych uprawnień w czasie działania.

Generowanie klasy pliku manifestu nie działa we wtyczce Androida do obsługi Gradle w wersji 3.6.0. Jeśli kompilujesz aplikację przy użyciu tej wersji wtyczki, która odwołuje się do klasy pliku manifestu, możesz zauważyć wyjątek ClassNotFoundException. Aby rozwiązać ten problem, wykonaj jedną z tych czynności:

  • Wskaż uprawnienia niestandardowe, podając ich pełną i jednoznaczną nazwę. Przykład: "com.example.myapp.permission.DEADLY_ACTIVITY".

  • Zdefiniuj własne stałe, jak poniżej:

                public final class CustomPermissions {
                  public static final class permission {
                    public static final String DEADLY_ACTIVITY="com.example.myapp.permission.DEADLY_ACTIVITY";
                  }
                }