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 poniższe nowe funkcje.

Wyświetl powiązanie

Powiązanie widoku zapewnia bezpieczeństwo podczas kompilacji podczas odwoływania się do widoków w kodzie. Możesz teraz zastąpić findViewById() automatycznie wygenerowanym odwołaniem do klasy powiązania. Aby zacząć korzystać z wiązania widoku, 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 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 wariantu kompilacji w aplikacji lub module biblioteki, którego możesz użyć do dostosowania publikacji do repozytorium Maven.

Więcej informacji znajdziesz w artykule o korzystaniu z wtyczki Maven Publish.

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

Podczas tworzenia wersji aplikacji do debugowania wtyczka korzysta z nowego narzędzia do tworzenia pakietów o nazwie zipflinger. To nowe narzędzie powinno poprawić szybkość kompilacji. 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 elementy:

        android.useNewApkCreator=false
      

Atrybucja kompilacji natywnej

Możesz teraz określić czas potrzebny Clang na kompilację i połączenie każdego pliku C/C++ w projekcie. Gradle może wyświetlić log czasu Chrome zawierający sygnatury czasowe zdarzeń tego kompilatora, dzięki czemu możesz lepiej poznać czas potrzebny na kompilację projektu. Aby wyświetlić ten 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 folderu <var>project-root</var>/build/android-profile, aby znaleźć plik. Nazwa pliku to profile-<var>timestamp</var>.json.gz.

U góry przeglądarki zobaczysz dane atrybucji kompilacji natywnych:

Natywny log czasu atrybucji kompilacji 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 nieskompresowane domyślnie

Gdy tworzysz aplikację, wtyczka teraz domyślnie ustawia extractNativeLibs na "false". Oznacza to, że biblioteki natywne są wyrównane do strony i spakowane bez kompresji. Chociaż powoduje to większy rozmiar przesyłanych plików, użytkownicy mają następujące korzyści:

  • Mniejszy rozmiar instalacji aplikacji, ponieważ platforma ma dostęp do bibliotek natywnych bezpośrednio z zainstalowanego pliku APK bez tworzenia kopii bibliotek.
  • Mniejszy rozmiar pliku do pobrania, ponieważ kompresja Sklepu Play jest zwykle lepsza, gdy do pliku APK lub pakietu 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 manifestu extractNativeLibs został zastąpiony opcją DSL useLegacyPackaging. Więcej informacji znajdziesz w informacjach o wersji: Tworzenie pakietów skompresowanych bibliotek natywnych za pomocą DSL.

Domyślna wersja NDK

Jeśli pobierasz wiele wersji pakietu NDK, wtyczka Androida do obsługi Gradle wybiera teraz wersję domyślną do użycia przy kompilowaniu plików z kodem źródłowym. 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.

Uproszczone generowanie klasy R

Wtyczka Androida do obsługi Gradle upraszcza kompilację ścieżki klasy, ponieważ generuje tylko 1 klasę R dla każdego modułu biblioteki w projekcie i udostępnia te klasy innym zależnościom modułów. Ta optymalizacja powinna przyspieszyć kompilacje, ale musisz pamiętać o tych kwestiach:

  • Ponieważ kompilator udostępnia klasy R z zależnościami modułu nadrzędnego, każdy moduł w projekcie powinien 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 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. Więcej informacji znajdziesz w artykule 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 ma w domyślnym zestawie zasobów (np. dodasz 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 działania powinna zmniejszyć liczbę wyjątków środowiska wykonawczego Resource Not Found i przyspieszyć kompilację.

D8 respektuje teraz zasady przechowywania klasy Classes w przypadku adnotacji

Podczas kompilowania aplikacji D8 uwzględnia teraz sytuacje, gdy adnotacje stosują zasadę przechowywania CLASS i te adnotacje nie są już dostępne w czasie działania. Dzieje się tak również wtedy, gdy docelowy pakiet SDK aplikacji jest ustawiany na poziom API 23, co wcześniej zezwalało na dostęp do tych adnotacji w czasie działania w przypadku kompilowania aplikacji przy użyciu starszych wersji wtyczki Android do obsługi Gradle i wersji D8.

Inne zmiany w działaniu

  • Wielkość liter w zasadzie aaptOptions.noCompress nie jest już rozróżniana na wszystkich platformach (zarówno w przypadku plików APK, jak i pakietów) i respektuje ścieżki, w których występują wielkie litery.
  • Wiązanie danych domyślnie odbywa się przyrostowo. Więcej informacji znajdziesz w artykule nr 110061530.

  • Wszystkie testy jednostkowe, w tym testy jednostkowe Roboelectric, są teraz w pełni buforowane. Więcej informacji znajdziesz w artykule o problemie nr 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. Aby dowiedzieć się więcej, zapoznaj się z problemem nr 126775542.
  • Możesz teraz uruchamiać zadania connectedAndroidTest w wielu modułach, gdy włączony jest tryb równoległego wykonywania Gradle.

Znane problemy

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

Powolne działanie zadania Android Lint

W niektórych projektach zakończenie Android Lint może trwać znacznie dłużej ze względu na regresję w infrastrukturze analizy, co spowalnia obliczanie wywnioskowanych typów obiektów lambda w niektórych konstrukcjach kodu.

Ten problem został zgłoszony jako błąd w IDEA i zostanie naprawiony we wtyczce Androida do obsługi Gradle w wersji 4.0.

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

Jeśli w pliku manifestu aplikacji zdefiniowane są niestandardowe uprawnienia, wtyczka Androida do obsługi Gradle zwykle generuje klasę Manifest.java, która zawiera niestandardowe uprawnienia w postaci stałych ciągów znaków. Wtyczka pakuje 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 tworzysz aplikację przy użyciu tej wersji 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ływać się do niestandardowych uprawnień, używając 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";
                  }
                }