Wtyczka Android do obsługi Gradle 3.0.0 (październik 2017 r.)

Wtyczka Androida do obsługi Gradle w wersji 3.0.0 zawiera różne zmiany, które mają na celu rozwiązanie problemów z wydajnością dużych projektów.

Na przykład w przykładowym projekcie szkieletowym obejmującym ok. 130 modułów i dużą liczbą zależności zewnętrznych (ale bez kodu ani zasobów) możesz zauważyć wzrost wydajności podobny do tych poniżej:

Wersja wtyczki na Androida + wersja Gradle Wtyczka do Androida 2.2.0 + Gradle 2.14.1 Wtyczka do Androida 2.3.0 + Gradle 3.3 Wtyczka do Androida 3.0.0 + Gradle 4.1
Konfiguracja (np. uruchomienie programu ./gradlew --help) ~2 min ~9 s ~2,5 s
Zmiana w Javie w jednym wierszu (zmiana implementacji) ~2 min 15 s ~29 s ~6,4 s

Niektóre z tych zmian zakłócają działanie istniejących kompilacji. Dlatego przed użyciem nowej wtyczki warto
przeanalizować projekt.

Jeśli nie widzisz ulepszeń w zakresie wydajności opisanych powyżej, zgłoś błąd i dołącz ślad kompilacji za pomocą programu profilującego Gradle.

Ta wersja wtyczki na Androida wymaga:

3.0.1 (listopad 2017 r.)

To jest drobna aktualizacja obsługi Androida Studio w wersji 3.0.1. Zawiera ona ogólne poprawki błędów i ulepszenia w zakresie wydajności.

Optymalizacje

  • Większa równoległość w przypadku projektów z wieloma modułami za pomocą szczegółowego grafu zadań.
  • Gdy wprowadzasz zmiany w zależności, Gradle szybciej wykonuje kompilacje, ponieważ nie kompiluje ponownie modułów, które nie mają dostępu do interfejsu API tej zależności. Aby określić, które zależności przekazują ich interfejsy API do innych modułów, użyj nowych konfiguracji zależności w Gradle: implementation, api, compileOnly i runtimeOnly.
  • Szybsza przyrostowa szybkość kompilacji dzięki odciąganiu od poszczególnych klas. Każda klasa jest teraz kompilowana w osobne pliki DEX i ponownie dedeksowana jest tylko zmodyfikowane klasy. Przyspieszenie kompilacji dotyczy też aplikacji, które mają w polu minSdkVersion wartość 20 lub mniej i używają starszej wersji multi-dex.
  • Przyspieszenie kompilacji przez optymalizację niektórych zadań pod kątem użycia uporządkowanych danych wyjściowych. Aby skorzystać z tej optymalizacji, musisz najpierw włączyć pamięć podręczną kompilacji Gradle.
  • Ulepszone przyrostowe przetwarzanie zasobów za pomocą AAPT2, które jest teraz domyślnie włączone. Jeśli podczas korzystania z AAPT2 wystąpią problemy, zgłoś błąd. Aby wyłączyć AAPT2, możesz też ustawić android.enableAapt2=false w pliku gradle.properties i ponownie uruchomić demona Gradle, uruchamiając polecenie ./gradlew --stop z poziomu wiersza poleceń.

Nowe funkcje

  • Zarządzanie zależnościami z uwzględnieniem wariantów. Podczas tworzenia określonego wariantu modułu wtyczka automatycznie dopasowuje teraz warianty zależności modułu biblioteki lokalnej do wybranego wariantu.
  • Zawiera nową wtyczkę modułu funkcji do obsługi aplikacji błyskawicznych na Androida oraz pakiet SDK aplikacji błyskawicznych na Androida (który można pobrać za pomocą menedżera pakietów SDK). Więcej informacji o tworzeniu modułów funkcji za pomocą nowej wtyczki znajdziesz w artykule Struktura aplikacji błyskawicznej z wieloma funkcjami.
  • Wbudowana obsługa niektórych funkcji języka Java 8 i bibliotek Java 8. Jack został wycofany i nie jest już wymagany. Wyłącz go, aby korzystać z ulepszonej obsługi języka Java 8 wbudowanej w domyślny łańcuch narzędzi. Więcej informacji znajdziesz w artykule o korzystaniu z funkcji języka Java 8.
  • Dodaliśmy obsługę uruchamiania testów za pomocą narzędzia Android Test Orchestrator, które pozwala uruchamiać każdy test aplikacji z użyciem własnego wywołania narzędzi. Każdy test działa we własnej instancji narzędzi, więc współdzielone stany między testami nie są gromadzone na procesorach ani w pamięci urządzenia. Nawet jeśli jeden test ulegnie awarii, usuwa tylko własną instancję narzędzi, więc pozostałe testy wciąż działają.

    • Dodano testOptions.execution, aby określić, czy należy korzystać z administracji testów na urządzeniu. Jeśli chcesz użyć Android Test Orchestrator, musisz określić ANDROID_TEST_ORCHESTRATOR, jak pokazano poniżej. Domyślnie ta właściwość jest ustawiona na HOST, co wyłącza administrację na urządzeniu i jest standardową metodą przeprowadzania testów.

    Odlotowy

            android {
              testOptions {
                execution 'ANDROID_TEST_ORCHESTRATOR'
              }
            }
            

    Kotlin

            android {
              testOptions {
                execution = "ANDROID_TEST_ORCHESTRATOR"
              }
            }
            
  • Nowa konfiguracja zależności androidTestUtil umożliwia zainstalowanie kolejnego pomocniczego pakietu APK przed uruchomieniem testów z instrumentacją, np. Android Test Orchestrator:

    Odlotowy

            dependencies {
              androidTestUtil 'com.android.support.test:orchestrator:1.0.0'
              ...
            }
            

    Kotlin

            dependencies {
              androidTestUtil("com.android.support.test:orchestrator:1.0.0")
              ...
            }
            
  • Dodano testOptions.unitTests.includeAndroidResources, aby umożliwić testy jednostkowe, które wymagają zasobów Androida, takich jak RoboElectric. Gdy ustawisz tę właściwość na true, wtyczka będzie scalać zasoby, zasoby i pliki manifestu przed uruchomieniem testów jednostkowych. Testy mogą następnie sprawdzić com/android/tools/test_config.properties w ścieżce klasy pod kątem tych kluczy:

    • android_merged_assets: ścieżka bezwzględna do katalogu scalonych zasobów.

      Uwaga: w przypadku modułów biblioteki scalone zasoby nie zawierają zasobów zależności (patrz numer problemu 65550419).

    • android_merged_manifest: ścieżka bezwzględna do scalonego pliku manifestu.

    • android_merged_resources: ścieżka bezwzględna do scalonego katalogu zasobów, który zawiera wszystkie zasoby z modułu i wszystkie jego zależności.

    • android_custom_package: nazwa pakietu ostatniej klasy R. Jeśli dynamicznie zmieniasz identyfikator aplikacji, ta nazwa pakietu może nie odpowiadać atrybutowi package w pliku manifestu aplikacji.

  • Obsługa czcionek jako zasobów (co jest nową funkcją wprowadzoną w Androidzie 8.0 (poziom interfejsu API 26)).
  • Obsługa plików APK w określonych językach dzięki pakietowi SDK do aplikacji błyskawicznych na Androida w wersji 1.1 lub nowszej.
  • Możesz teraz zmienić katalog wyjściowy zewnętrznego natywnego projektu kompilacji, jak pokazano poniżej:

    Odlotowy

            android {
                ...
                externalNativeBuild {
                    // For ndk-build, instead use the ndkBuild block.
                    cmake {
                        ...
                        // Specifies a relative path for outputs from external native
                        // builds. You can specify any path that's not a subdirectory
                        // of your project's temporary build/ directory.
                        buildStagingDirectory "./outputs/cmake"
                    }
                }
            }
            

    Kotlin

            android {
                ...
                externalNativeBuild {
                    // For ndk-build, instead use the ndkBuild block.
                    cmake {
                        ...
                        // Specifies a relative path for outputs from external native
                        // builds. You can specify any path that's not a subdirectory
                        // of your project's temporary build/ directory.
                        buildStagingDirectory = "./outputs/cmake"
                    }
                }
            }
            
  • Teraz podczas tworzenia projektów natywnych w Android Studio możesz używać CMake w wersji 3.7 lub nowszej.
  • Nowa konfiguracja zależności lintChecks umożliwia utworzenie pliku JAR, który definiuje niestandardowe reguły lintowania, i spakowanie go do projektów AAR i plików APK.

    Twoje niestandardowe reguły lintowania muszą należeć do osobnego projektu, który generuje jeden plik JAR i zawiera tylko zależności compileOnly. Inne moduły aplikacji i biblioteki mogą zależeć od Twojego projektu lintowego za pomocą konfiguracji lintChecks:

    Odlotowy

            dependencies {
                // This tells the Gradle plugin to build ':lint-checks' into a lint.jar file
                // and package it with your module. If the module is an Android library,
                // other projects that depend on it automatically use the lint checks.
                // If the module is an app, lint includes these rules when analyzing the app.
                lintChecks project(':lint-checks')
            }
            

    Kotlin

            dependencies {
                // This tells the Gradle plugin to build ':lint-checks' into a lint.jar file
                // and package it with your module. If the module is an Android library,
                // other projects that depend on it automatically use the lint checks.
                // If the module is an app, lint includes these rules when analyzing the app.
                lintChecks(project(":lint-checks"))
            }
            

Zmiany w działaniu

  • Wtyczka do Androida w wersji 3.0.0 usuwa niektóre interfejsy API, a jeśli ich użyjesz, kompilacja nie będzie działać. Na przykład nie możesz już korzystać z interfejsu Variants API, aby uzyskać dostęp do obiektów outputFile(), ani używać processManifest.manifestOutputFile() do pobierania pliku manifestu dla każdego wariantu. Więcej informacji znajdziesz w artykule o zmianach w interfejsie API.
  • Nie musisz już określać wersji narzędzi do kompilacji (możesz teraz usunąć właściwość android.buildToolsVersion). Domyślnie wtyczka automatycznie używa minimalnej wymaganej wersji narzędzi do kompilacji w przypadku tej wersji wtyczki do Androida, której używasz.
  • Teraz w bloku buildTypes włączasz lub wyłączasz sznurek PNG, jak pokazano poniżej. Tworzenie plików PNG jest domyślnie włączone dla wszystkich kompilacji oprócz tych do debugowania, ponieważ wydłuża czas kompilacji w przypadku projektów, które zawierają wiele plików PNG. Aby więc skrócić czas kompilacji innych typów kompilacji, wyłącz przechwytywanie plików PNG lub przekonwertuj obrazy do formatu WebP.

    Odlotowy

          android {
            buildTypes {
              release {
                // Disables PNG crunching for the release build type.
                crunchPngs false
              }
            }
          }
          

    Kotlin

          android {
            buildTypes {
              release {
                // Disables PNG crunching for the release build type.
                isCrunchPngs = false
              }
            }
          }
          
  • Wtyczka na Androida automatycznie kompiluje teraz wykonywalne cele, które skonfigurujesz w zewnętrznych projektach CMake.
  • Teraz musisz dodać procesory adnotacji do ścieżki klasy procesora za pomocą konfiguracji zależności annotationProcessor.
  • Korzystanie z wycofanej wersji ndkCompile jest teraz bardziej ograniczone. Zamiast tego użyj CMake lub ndk-build, by skompilować kod natywny, który chcesz spakować do pliku APK. Więcej informacji znajdziesz w artykule o migracji z ndkbuild (w języku angielskim).