Skip to content

Commit 4953c4c

Browse files
committed
gradle post source sets and optimization added
1 parent 9121794 commit 4953c4c

File tree

1 file changed

+59
-17
lines changed

1 file changed

+59
-17
lines changed

_drafts/2019-09-16-gradle.md

Lines changed: 59 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ categories: ["Budowanie"]
66
image: build/gradle
77
github: build/tree/master/gradle
88
description: "Budowanie"
9-
keywords: "budowanie, kompilacja, konfiguracja, build, gradle, apk, properties, configuration, flavor, android, programowanie, programming"
9+
keywords: "budowanie, kompilacja, konfiguracja, build, gradle, apk, properties, configuration, variant, type, flavor, splits, android, programowanie, programming"
1010
---
1111

1212
## Wstęp
@@ -16,11 +16,11 @@ System budowania aplikacji `Android` kompiluje zasoby, kod źródłowy oraz paki
1616
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.
1717

1818
## Konfiguracja
19-
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) które mogą używać współdzielonych jak i prywatnych zasobów natomiast `buildVariants` jest konkretnym wariantem budowania wynikającym z połączenia wybranych `buildTypes` i `productFlavors`. 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`.
19+
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`.
2020

2121
## Pliki
22-
Informacje nt konfiguracji znajdują sie w kilku plikach projektu. 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`. Kod źródłowy i zasoby powinny być logicznie pogrupowane zgodnie z przynależnością do modułu, tzn. kod oraz zasoby znajdujące się w `src/main` są współdzielone przez wszystkie warianty kompilacji, natomiast np. `src/debug` tylko dla wariantu debug.
23-
22+
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`.
23+
2424
`settings.gradle` deklaruje moduły, które powinny wziąć udział w procesie budowania projektu
2525

2626
{% highlight gradle %}
@@ -94,7 +94,7 @@ android {
9494
// Configure multiple build types like apply Proguard for release and make debug debuggable
9595
buildTypes {
9696
release {
97-
minifyEnabled false
97+
minifyEnabled true
9898
debuggable false
9999
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
100100
}
@@ -119,31 +119,31 @@ android {
119119
}
120120
}
121121

122-
// Configure different APK builds that each contains only needed code and resources for density and abi
123-
// Notice that every build must have unique version code for store
124-
splits {
125-
density {
126-
enable true
127-
exclude "ldpi"
128-
}
129-
abi {
130-
enable true
131-
universalApk true
122+
// Use filter to disable some build variant
123+
variantFilter { variant ->
124+
def flavors = variant.flavors*.name
125+
def types = variant.buildType*.name
126+
if (types.contains("debug") && flavors.contains("paid")) {
127+
setIgnore(true)
132128
}
133129
}
134130
}
135131

136132
// Provide dependencies needed only for module itself
137133
dependencies {
138-
//local binaries
134+
//local binaries
139135
implementation fileTree(dir: 'libs', include: ['*.jar'])
140136

141137
//remote binaries
142138
implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version'
143139
implementation 'androidx.appcompat:appcompat:1.0.2'
144140
implementation 'androidx.core:core-ktx:1.0.2'
145141

142+
//add build type or flavor prefix to use implementation only for this variant
143+
paidImplementation 'com.android.billingclient:billing:2.0.1'
144+
146145
//unit and instrumental tests
146+
//notice that test and androidTest are source sets like any other build variant
147147
testImplementation 'junit:junit:4.12'
148148
androidTestImplementation 'androidx.test:runner:1.2.0'
149149
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
@@ -163,4 +163,46 @@ kotlin.code.style=official
163163

164164
{% highlight properties %}
165165
sdk.dir=C\:\\Android\\Sdk
166-
{% endhighlight %}
166+
{% endhighlight %}
167+
168+
## Źródła
169+
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`).
170+
171+
## Optymalizacja
172+
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.
173+
174+
{% highlight gradle %}
175+
android {
176+
177+
//...
178+
179+
flavorDimensions "stage", "version"
180+
productFlavors {
181+
//...
182+
183+
//add developer and production flavor with new dimension
184+
dev {
185+
//...
186+
dimension "stage"
187+
resConfigs "pl", "xxhdpi" //attach only pl resources
188+
}
189+
prod {
190+
//...
191+
dimension "stage"
192+
}
193+
}
194+
195+
// Configure different APK builds that each contains only needed code and resources for density and abi
196+
// Notice that every build must have unique version code for store
197+
splits {
198+
density {
199+
enable true
200+
exclude "ldpi"
201+
}
202+
abi {
203+
enable gradle.startParameter.taskNames.any { it.contains("release") }
204+
universalApk false
205+
}
206+
}
207+
}
208+
{% endhighlight %}

0 commit comments

Comments
 (0)