Wstęp
System budowania aplikacji Android
kompiluje zasoby, kod źródłowy oraz pakiety do pliku w formacie APK
(Android Application Package
), który może być testowany, podpisany i dystrybuowany. W tym celu Android Studio
używa zaawansowanego zestawu narzędzi Gradle
wraz z dedykowanym Android Gradle plugin
pozwalających na zarządzanie i automatyzację tego procesu dzięki czemu każda konfiguracja może definiować własne zasady budowania projektu. Gradle
oraz plugin
działają niezależnie od Android Studio
co pozwala na kompilacje bez udziału środowiska programistycznego, np. przez wiersz poleceń.
Proces
Budowanie aplikacji angażuje wiele narzędzi i uruchamia różne procesy umożliwiające konwersje projektu do APK
. Typowy proces przebiega następująco. Na początku kompilator konwertuje kod źródłowy do plików DEX
(Dalvik Executable
) zawierających kod bajtowy, a pozostałe pliki i zależności do skompilowanych zasobów. Następnie APK Packager
łączy i optymalizuje pliki DEX
i skompilowane zasoby do jednego pliku APK
podpisując go kluczem debug
lub release
z keystore
. Powstały plik APK
jest gotowy do instalacji, debugowania czy testowania.
Konfiguracja
Dokonując konfiguracji budowania projektu można wyróżnić kilka aspektów wpływających na wyjściowy rezultat. buildTypes
definiuje właściwości dla wydań (np. zaciemnienie release), productFlavors
reprezentuje różne wersje aplikacji (np. płatna, darmowa, demo). buildVariants
jest konkretnym wariantem budowania wynikającym z połączenia wybranych buildTypes
i productFlavors
, które mogą używać współdzielonych jak i prywatnych zasobów. Wartości wpisów w AndroidManifest
mogą się różnić w zależności od wariantu budowania (np. inna nazwa czy różne minSdk). System budowania zarządza także wpisami lokalnych i zdalnych zależności dependencies
dzięki czemu nie ma potrzeby ręcznego szukania, pobierania i kopiowania pakietów zależności do projektu. Ponadto umożliwia ustawienie podpisu autentykacyjnego i zasad bezpieczeństwa ProGuard
oraz wspiera budowanie wielu APK
.
Pliki
Informacje nt konfiguracji znajdują sie w kilku plikach projektu należących do danego modułu. Używają one DSL
(Domain Specific Language
) do opisania i manipulowania logiką przy pomocy Groovy
(dynamicznego języka dla JVM
). Android Gradle plugin
dostarcza większość potrzebnych elementów DSL
w związku z czym nie jest wymagana wiedza programowania w Groovy
.
settings.gradle
deklaruje moduły, które powinny wziąć udział w procesie budowania projektu
build.gradle
znajdujący się w głównym katalogu definuje konfigurację wspólną dla wszystkich modułów w projekcie, np. repozytoria i wersja Sdk
build.gradle
znajdujący się w każdym module pozwala na specyficzną konfiguracje dla danego modułu uzupełniając lub nadpisując definicję build.gradle
projektu, np. zależności, wtyczki czy konfiguracja wersji i wariantów budowanej paczki APK
gradle.properties
określa ustawienia Gradle
dla całego projektu, np. maksymalna wielkość stosu deamona czy użycie artefaktów AndroidX
local.properties
konfiguruje lokalne właściwości środowiska dla systemu kompilacji, np. ścieżka instalacji Sdk
Źródła
Aby budowane warianty aplikacji zadeklarowane w build.gradle rzeczywiście różniły się implementacją należy stworzyć dla nich lokalizacje odpowiadające nazwie wariantu oraz umieścić tam specyficzny kod źródłowy i zasoby. Dla zdefiniowanych powyżej wariantów ich zbiory źródeł mogłyby znajdować się w: src/debug
, src/release
, src/debugFree
, src/debugPaid
, src/releaseFree
, src/releasePaid
. Zawartość src/main
jest traktowana jako domyślna i współdzielona przez wszystkie warianty kompilacji natomiast źródła konkretnych wariantów nadpisują implementację bazową zgodnie z zasadą priorytetów (build variant > build type > build flavor > main > library
).
Optymalizacja
Tworząc konfiguracje budowania aplikacji należy rozważyć optymalizację czasu procesu kompilacji oraz rozmiaru pliku wyjściowego. Budowanie wielu APK
dedykowanych pod konkretne architektury czy gęstości ekranów pozwala zmniejszyć rozmiar poprzez załączenie tylko wymaganych zasobów. Jednakże taki proces znacząco wydłuża czas całkowitej kompilacji w związku z czym warto wyłączyć niepotrzebne wersje oraz zawężyć wariant deweloperski. Ponadto zastosowanie zasad ProGuard
także umożliwia redukcje rozmiaru przy jednoczesnym spowolnieniu kompilacji. Użycie statycznych zależności, trybu offline, cache czy Instant Run
przyśpiesza budowanie projektu. W przypadku wersji produkcyjnej przeważnie dąży się przede wszystkim do optymalizacji rozmiaru natomiast w wersji deweloperskiej do optymalizacji czasu kompilacji.