Omówienie kompilacji Gradle

Aplikacje na Androida są zwykle tworzone w kompilacji Gradle. systemu. Zanim przejdziemy do szczegółów konfigurowania kompilacji, opowiemy, poznaj koncepcje stojące za kompilacji, aby móc zobaczyć system jako całość.

Co to jest kompilacja?

System kompilacji przekształca kod źródłowy w aplikację wykonywalną. Kompilacje często obejmują wiele narzędzi do analizowania, kompilowania, łączenia i pakowania aplikacji lub biblioteki. Gradle wykorzystuje podejście oparte na zadaniach do organizowania i uruchamiania tych poleceń.

Zadania zawierają polecenia, które przekładają się na dane wejściowe na dane wyjściowe. Wtyczki definiują zadania i ich konfigurację. Wprowadzanie wtyczka do Twojej kompilacji rejestruje zadania i łączy je dane wejściowe i wyjściowe... Możesz na przykład zastosować wtyczkę Androida do obsługi Gradle (AGP). do pliku kompilacji będą rejestrowane wszystkie zadania niezbędne do zbudowania pakietu APK. Biblioteka Androida. Wtyczka java-library umożliwia tworzenie pliku jar na podstawie źródła w Javie w kodzie. Podobne wtyczki są dostępne w języku Kotlin i w innych językach, ale w innych językach mają rozszerzać wtyczki. Na przykład wtyczka protobuf ma dodawać obsługi protokołu protobuf w istniejących wtyczkach, takich jak AGP czy java-library.

Gradle preferuje konwencję od konfiguracji, więc wtyczki na domyślnych wartościach. Możesz jednak skonfigurować kompilację język deklaratywny Domain-Specific Language (Język DSL). Format DSL został zaprojektowany więc możesz określić, co chcesz zbudować, a nie jak. Zasada działania a wtyczki zarządzają instrukcją. Ta konfiguracja jest określona w kilku Utwórz pliki w swoim projekcie (i jego podprojektach).

Dane wejściowe zadań mogą być plikami i katalogami, a także inne informacje zakodowane Typy Java (całkowite, ciągi znaków lub klasy niestandardowe). Dane wyjściowe mogą być tylko katalogami ponieważ muszą być zapisane na dysku. Łączenie danych wyjściowych zadania w innym dane wejściowe zadania, łączy zadania ze sobą, tak aby jedno z nich zostało uruchomione przed drugim.

Gradle obsługuje pisanie dowolnego kodu i deklaracji zadań w kompilacji plików, może to utrudniać narzędziom zinterpretowanie kompilacji które warto kontrolować. Możesz na przykład pisać testy kodu wewnątrz wtyczek ale nie w plikach kompilacji. Zamiast tego ogranicz logikę i zadania kompilacji deklaracje dla wtyczek (definiowane przez Ciebie lub kogoś innego) oraz deklaruj, aby używać tej logiki w plikach kompilacji.

Co się dzieje po uruchomieniu kompilacji Gradle?

Kompilacje Gradle są uruchamiane w 3 fazach. Każdy z nich realizuje inne części zdefiniowanych w plikach kompilacji.

  • Inicjacja określa, które projekty i podprojekty są uwzględniane oraz konfiguruje ścieżki zajęć zawierające pliki kompilacji i zastosowane Ten etap koncentruje się na pliku ustawień, w którym deklarujesz projekty oraz lokalizacje, z których mają być pobierane wtyczki i biblioteki.
  • Konfiguracja rejestruje zadania w każdym projekcie i wykonuje kompilację. w celu zastosowania specyfikacji kompilacji użytkownika. Warto wiedzieć, że kod konfiguracji nie będzie miał dostępu do danych ani utworzonych plików podczas wykonywania kodu.
  • Wykonanie wykonuje „kompilację” Twojej aplikacji. Dane wyjściowe konfiguracji to ukierunkowany acykliczny graf (DAG) zadań, reprezentujący wszystkie wymagane kroki kompilacji, o które zażądał użytkownik (element w wierszu poleceń lub domyślnie w plikach kompilacji). Ten przedstawia zależność między zadaniami, jawnie w funkcji lub na podstawie danych wejściowych i wyjściowych. Jeśli zadanie zawiera dane wejściowe, to wynik innego zadania, musi ono zostać uruchomione po drugim zadaniu. Ten faza uruchamia nieaktualne zadania w kolejności zdefiniowanej na wykresie; jeśli zadanie to dane wejściowe nie uległy zmianie od ostatniego wykonania, Gradle pominie je.

Więcej informacji znajdziesz w cyklu życia kompilacji Gradle.

Konfiguracja DSL

Gradle używa języka specyficznego dla domeny (DSL) do konfiguracji do tworzenia kampanii. To podejście deklaratywne skupia się na określaniu danych, a nie na szczegółowych instrukcji krok po kroku.

Platformy DSL mają na celu ułatwienie wszystkim, w tym ekspertom domen i programistów, mieć swój udział w projekcie, definiując niewielki język, który będzie reprezentował dane w bardziej naturalny sposób. Wtyczki Gradle mogą rozbudowywać protokół DSL, aby konfigurować dane niezbędną do wykonywania zadań.

Na przykład skonfigurowanie części kompilacji związanej z Androidem może wyglądać tak:

Kotlin

android {
    namespace = "com.example.app"
    compileSdk = 34
    // ...

    defaultConfig {
        applicationId = "com.example.app"
        minSdk = 34
        // ...
    }
}

Odlotowe

android {
    namespace 'com.example.myapplication'
    compileSdk 34
    // ...

    defaultConfig {
        applicationId "com.example.myapplication"
        minSdk 24
        // ...
    }
}

W skrócie kod DSL wygląda tak:

fun Project.android(configure: ApplicationExtension.() -> Unit) {
    ...
}

interface ApplicationExtension {
    var compileSdk: Int
    var namespace: String?

    val defaultConfig: DefaultConfig

    fun defaultConfig(configure: DefaultConfig.() -> Unit) {
        ...
    }
}

Każdy blok w DSL jest reprezentowany przez funkcję, która wykorzystuje funkcję lambda do , a następnie użyć usługi o tej samej nazwie, aby uzyskać do niej dostęp. Dzięki temu kod w plikach kompilacji sprawia wrażenie, że jest to specyfikacja danych.

Zależności zewnętrzne

W systemie kompilacji Maven wprowadzono specyfikację zależności, pamięci masowej i zarządzania. Biblioteki są przechowywane w repozytoriów (serwerów lub katalogów) z metadanymi zawierającymi: ich wersji i zależności od innych bibliotek. Ty decydujesz, do przeszukania, wersje zależności, których chcesz użyć, oraz i pobiera je w trakcie kompilacji.

Artefakty Maven są identyfikowane według nazwy grupy (firmy, dewelopera itp.) oraz artefaktu nazwa (nazwa biblioteki) i wersja artefaktu. Zwykle jest to jest reprezentowana jako group:artifact:version.

To podejście znacznie usprawnia zarządzanie kompilacji. Często usłyszysz takie nazywanych „repozytoriami Maven”, ale chodzi przede wszystkim o to, artefaktów, można je pakować i publikować. Te repozytoria i metadane zostały wykorzystywane ponownie w kilku systemach kompilacji, w tym w Gradle (oraz Gradle może publikować w tych repozytoriów). Repozytoria publiczne umożliwiają udostępnianie plików wszystkim użytkownikom. w repozytoriach firmowych – wewnętrzne zależności.

Możesz też połączyć projekt modułowo w podprojekty. (nazywanych też „modułami” w Android Studio), których można też używać jako zależności. Każdy podprojekt generuje dane wyjściowe (takie jak pliki jar), które można wykorzystywane przez podprojekty lub projekt najwyższego poziomu. Może to skrócić czas kompilacji przez izolowanie części do zrekonstruowania, a także lepiej oddzielanie zobowiązań w aplikacji.

Bardziej szczegółowe informacje o określaniu zależności w sekcji Dodaj kompilację .

Utwórz warianty

Tworząc aplikację na Androida, zazwyczaj skup się na tworzeniu kilku warianty. Warianty zawierają inny kod lub zostały utworzone za pomocą innych i oferują różne typy konstrukcji oraz smaki produktów.

Typy kompilacji różnią się zadeklarowanymi opcjami kompilacji. Domyślnie AGP konfiguruje „release” i „debuguj” ale możesz je dostosować i dodać więcej (na przykład dla testów przejściowych lub testów wewnętrznych).

Kompilacja do debugowania nie minifikuje ani nie zaciemnia aplikacji, co przyspiesza jej działanie i zachowania symboli w niezmienionej formie. Oznacza także aplikację jako „debuggable”, podpisując go ogólnym kluczem debugowania i umożliwiając dostęp do plików aplikacji zainstalowanych na urządzeniu. Dzięki temu możliwe jest eksplorowanie zapisał dane w plikach i bazach danych podczas uruchamiania aplikacji.

kompilacja wersji optymalizuje aplikację, podpisuje ją kluczem wersji; chroni pliki zainstalowanych aplikacji.

Za pomocą rodzajów usług możesz zmienić uwzględnione źródło i zależność wersji dla aplikacji. Można na przykład utworzyć „demonstracja”, i „pełny” smaków do aplikacji albo np. „bezpłatnie” i „płatne” smaków. Wpisz swoje wspólne źródło w polu „głównym” katalogu source set, zastąpić lub dodać źródło w zbiorze źródłowym o nazwie odpowiadającej rodzajowi.

AGP tworzy warianty dla każdej kombinacji typu kompilacji i rodzaju produktu. Jeśli gdy nie zdefiniujesz smaków, nazwy wariantów będą nosić nazwy typów kompilacji. Jeśli po określeniu obu tych opcji wariant nazywa się <flavor><Buildtype>. Na przykład w przypadku kompilacji release i debug oraz smaki demo i full, AGP utworzy wersje:

  • demoRelease
  • demoDebug
  • fullRelease
  • fullDebug

Dalsze kroki

Po omówieniu koncepcji kompilacji przyjrzymy się kompilacji Androida w strukturze swojego projektu.