Wtyczka Androida do obsługi Gradle w wersji 4.1.0 (sierpień 2020 r.)

Zgodność

Wersja minimalna Wersja domyślna Uwagi
Gradle 6.5 Nie dotyczy Więcej informacji znajdziesz w sekcji Aktualizowanie Gradle.
SDK Build Tools 29.0.2 29.0.2 Zainstaluj lub skonfiguruj narzędzia do kompilacji pakietu SDK.
NDK Nie dotyczy 21.1.6352462 Zainstaluj lub skonfiguruj inną wersję NDK.

<p>This version of the Android plugin requires the following:</p>
<ul>
  <li>
    <p><a href="https://docs.gradle.org/6.5.1/release-notes.html">Gradle 6.5</a>.
    To learn more, read the section about <a href="#updating-gradle">updating
    Gradle</a>.</p>
  </li>
  <li>
    <p><a href="/studio/releases/build-tools.html#notes">SDK Build Tools
    29.0.2</a> or higher.</p>
  </li>
</ul>
<p>The default NDK version in this release is 21.1.6352462. To install a
different NDK version, see <a href="/studio/projects/install-ndk#specific-version">Install a specific version of the NDK</a>.</p>

Nowe funkcje

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

Obsługa Kotlin Script DSL

Aby ułatwić użytkownikom skryptów kompilacji w Kotlinie edytowanie, interfejs DSL i interfejsy API wtyczki Androida do Gradle w wersji 4.1 są teraz zdefiniowane w zestawie interfejsów Kotlin oddzielnie od klas implementacji. Oznacza to, że:

  • W przypadku typów w Kotlinie można teraz jawnie zadeklarować, czy dopuszczają one wartość null i czy są modyfikowalne.
  • Dokumentacja wygenerowana na podstawie tych interfejsów jest publikowana w dokumentacji interfejsu API języka Kotlin.
  • Powierzchnia interfejsu API wtyczki Androida do obsługi Gradle jest jasno zdefiniowana, aby w przyszłości rozszerzanie kompilacji Androida było mniej podatne na błędy.

Ważne: jeśli masz już skrypty kompilacji KTS lub używasz języka Kotlin w buildSrc, może to spowodować przerwanie zgodności kodu źródłowego w przypadku niektórych błędów, które w poprzednich wersjach objawiały się jako błędy czasu działania.

Typy kolekcji, które mają być modyfikowane w DSL, są teraz jednolicie zdefiniowane jako:

val collection: MutableCollectionType

Oznacza to, że w przypadku niektórych kolekcji, które wcześniej to obsługiwały, nie można już pisać w skryptach w języku Kotlin:

collection = collectionTypeOf(...)

Modyfikowanie kolekcji jest jednak obsługiwane jednolicie, więc collection += …collection.add(...) powinny teraz działać wszędzie.

Jeśli podczas uaktualniania projektu, który korzysta z interfejsów API i DSL Kotlin wtyczki Android Gradle, napotkasz problemy, zgłoś błąd.

Eksportowanie zależności C/C++ z plików AAR

Wtyczka Androida do obsługi Gradle w wersji 4.0 umożliwia importowanie pakietów Prefab w zależnościach AAR. W AGP 4.1 można teraz eksportować biblioteki z zewnętrznej kompilacji natywnej w formacie AAR do projektu biblioteki Androida.

Aby wyeksportować biblioteki natywne, dodaj ten kod do bloku android w pliku build.gradle projektu biblioteki:

buildFeatures {
    prefabPublishing true
}

prefab { <var>mylibrary</var&;gt { headers "src/main/cpp/<var>mylibrary</var>/include" }

<var>myotherlibrary</var> {
    headers "src/main/cpp/<var>myotherlibrary</var>/include"
}

}

buildFeatures {
    prefabPublishing = true
}

prefab { create("<var>mylibrary</var>") { headers = "src/main/cpp/<var>mylibrary</var>/include" }

create("<var>myotherlibrary</var>") {
    headers = "src/main/cpp/<var>myotherlibrary</var>/include"
}

}

W tym przykładzie biblioteki mylibrarymyotherlibrary z zewnętrznej kompilacji natywnej ndk-build lub CMake zostaną spakowane w pliku AAR wygenerowanym przez kompilację, a każda z nich wyeksportuje nagłówki z określonego katalogu do swoich zależności.

Uwaga: w przypadku użytkowników wtyczki Androida do obsługi Gradle w wersji 4.0 lub nowszej ustawienia konfiguracji importowania wstępnie skompilowanych bibliotek natywnych uległy zmianie. Więcej informacji znajdziesz w informacjach o wersji 4.0.

Obsługa metadanych Kotlin w R8

Kotlin używa niestandardowych metadanych w plikach klas Java do identyfikowania konstrukcji języka Kotlin. R8 obsługuje teraz zachowywanie i przepisywanie metadanych Kotlin, aby w pełni obsługiwać zmniejszanie bibliotek i aplikacji Kotlin za pomocą kotlin-reflect.

Aby zachować metadane Kotlin, dodaj te reguły zachowywania:

-keep class kotlin.Metadata { *; }

-keepattributes RuntimeVisibleAnnotations

Spowoduje to, że R8 będzie przechowywać metadane Kotlin dla wszystkich klas, które są bezpośrednio zachowywane.

Więcej informacji znajdziesz w artykule Shrinking Kotlin libraries and applications using Kotlin reflection with R8{:.external} na Medium.

Asercje w kompilacjach do debugowania

Gdy tworzysz wersję debugowania aplikacji za pomocą wtyczki Androida do obsługi Gradle w wersji 4.1.0 lub nowszej, wbudowany kompilator (D8) przepisuje kod aplikacji, aby włączyć asercje w czasie kompilacji. Dzięki temu zawsze masz aktywne sprawdzanie asercji.

Zmiany w działaniu

Usunięto pamięć podręczną kompilacji wtyczki Androida do obsługi Gradle

Pamięć podręczna kompilacji AGP została usunięta w AGP 4.1. Wprowadzona wcześniej w AGP 2.3 jako uzupełnienie pamięci podręcznej kompilacji Gradle, pamięć podręczna kompilacji AGP została całkowicie zastąpiona przez pamięć podręczną kompilacji Gradle w AGP 4.1. Ta zmiana nie ma wpływu na czas kompilacji.

Zadanie cleanBuildCache oraz właściwości android.enableBuildCacheandroid.buildCacheDir zostały wycofane i zostaną usunięte w AGP 7.0. Właściwość android.enableBuildCache nie ma obecnie żadnego wpływu, natomiast właściwość android.buildCacheDir i zadanie cleanBuildCache będą działać do wersji AGP 7.0, aby usuwać zawartość istniejącej pamięci podręcznej kompilacji AGP.

Znaczne zmniejszenie rozmiaru aplikacji korzystających ze zmniejszania kodu

Począwszy od tej wersji pola z klas R nie są już domyślnie zachowywane, co może znacznie zmniejszyć rozmiar pliku APK w przypadku aplikacji, które umożliwiają zmniejszanie kodu. Nie powinno to spowodować zmiany w działaniu, chyba że uzyskujesz dostęp do klas R za pomocą odbicia. W takim przypadku konieczne jest dodanie reguł zachowywania dla tych klas R.

Właściwość android.namespacedRClass została zmieniona na android.nonTransitiveRClass

Flaga eksperymentalna android.namespacedRClass nosi teraz nazwę android.nonTransitiveRClass.

Ustawiona w pliku gradle.properties flaga włącza przestrzenie nazw dla klasy R każdej biblioteki, dzięki czemu zawiera ona tylko zasoby zadeklarowane w samej bibliotece, a nie w jej zależnościach. Zmniejsza to rozmiar klasy R w tej bibliotece.

Kotlin DSL: zmiana nazwy coreLibraryDesugaringEnabled

Opcja kompilacji Kotlin DSL coreLibraryDesugaringEnabled została zmieniona na isCoreLibraryDesugaringEnabled. Więcej informacji o tym parametrze znajdziesz w artykule Obsługa usuwania cukru z interfejsów API Java 8+ (wtyczka Androida do Gradle w wersji 4.0.0 i nowszej).

Właściwości wersji usunięte z klasy BuildConfig w projektach bibliotek

W przypadku projektów biblioteki usunęliśmy właściwości BuildConfig.VERSION_NAMEBuildConfig.VERSION_CODE z wygenerowanej klasy BuildConfig, ponieważ te statyczne wartości nie odzwierciedlały ostatecznych wartości kodu i nazwy wersji aplikacji, a tym samym wprowadzały w błąd. Dodatkowo te wartości zostały odrzucone podczas scalania pliku manifestu.

W przyszłej wersji wtyczki Androida do obsługi Gradle właściwości versionNameversionCode zostaną też usunięte z DSL bibliotek. Obecnie nie ma możliwości automatycznego uzyskania dostępu do kodu lub nazwy wersji aplikacji z podprojektu biblioteki.

W przypadku modułów aplikacji nie ma zmian. Nadal możesz przypisywać wartości do parametrów versionCodeversionName w DSL. Te wartości będą propagowane do pliku manifestu aplikacji i pól BuildConfig.

Ustawianie ścieżki NDK

Ścieżkę do lokalnej instalacji NDK możesz ustawić za pomocą właściwości android.ndkPath w pliku build.gradle modułu.


android {
  ndkPath "your-custom-ndk-path"
}

android {
  ndkPath = "your-custom-ndk-path"
}

Jeśli używasz tej właściwości razem z android.ndkVersion, ścieżka musi zawierać wersję NDK zgodną z android.ndkVersion.

Zmiany w działaniu testów jednostkowych biblioteki

Zmieniliśmy sposób kompilowania i uruchamiania testów jednostkowych biblioteki. Testy jednostkowe biblioteki są teraz kompilowane i uruchamiane w odniesieniu do klas kompilacji/środowiska wykonawczego samej biblioteki, dzięki czemu test jednostkowy korzysta z biblioteki w taki sam sposób jak zewnętrzne podprojekty. Ta konfiguracja zwykle zapewnia lepsze testowanie.

W niektórych przypadkach testy jednostkowe biblioteki, które korzystają z powiązania danych, mogą napotkać brakujące klasy DataBindingComponent lub BR. Te testy należy przenieść do testu z instrumentacją w projekcie androidTest, ponieważ kompilowanie i uruchamianie ich w testach jednostkowych może dawać nieprawidłowe wyniki.

Wycofanie wtyczki Gradle io.fabric

Wtyczka Gradle io.fabric jest przestarzała i nie jest zgodna z wersją 4.1 wtyczki Androida do obsługi Gradle. Więcej informacji o wycofanym pakiecie SDK Fabric i przechodzeniu na pakiet SDK Firebase Crashlytics znajdziesz w artykule Przejście na pakiet SDK Firebase Crashlytics.