Przydatne snippety Gradle
Przydatne snippety Gradle

Przydatne snippety Gradle

Tags
Hidden
Hidden
Published
January 10, 2023
Author
Jarosław Michalik
Poniżej znajdziesz kilka przydatnych snippetów kodu, które pomogą Ci w automatyzacji budowania Twoich aplikacji. Wykorzystuję te skrypty we wszystkich swoich projektach.
Mam nadzieję, że dzięki temu przyśpieszysz i ułatwisz sobie pracę nad swoimi aplikacjami.
 
Na początku chciałem przygotować opracowanie tych snippetów jako PDF do pobrania po podaniu adresu email – ale umówmy się. PDFa czytasz raz i potem zapominasz, że go masz na dysku.
Po prostu zapisz sobie te stronę do zakładek w kategorii “praca” / ”development” / ”cokolwiek”.
 

A jeśli interesują Cię rzeczy związane z programowaniem na Androida (i programami edukacyjnymi mojego autorstwa), to zostaw swój adres email tak czy inaczej. Wyślę Ci najlepszą możliwą ofertę na nadchodzący program #next level androiddev, a także będę Cię informował o aktualizacjach w bezpłatnych materiałach takich jak ten. Umowa stoi?
 
 

 
 

Build time tracker

Plugin pokazuje ile czasu zajął poszczególny element buildu.
notion image
classpath "net.rdrei.android.buildtimetracker:gradle-plugin:0.11.1"
apply plugin: "build-time-tracker" // alternatywnie plugins { id "net.rdrei.android.buildtimetracker" version "0.11.0" }
W app/build.gradle:
buildtimetracker { reporters { summary { ordered true threshold 50 //milliseconds barstyle "unicode" shortenTaskNames false } } }
 

Zmienna do BuildConfig.java

W app/build.gradle, top-level zmienna:
def buildTime = new Date().format("yyyy-MM-dd'T'HH:mm'Z'", TimeZone.getTimeZone("UTC"))
Przykład użycia (dodanie tego do generowanej klasy BuildConfig.java)
android{ defaultConfig{ buildConfigField "String", "BUILD_TIME", "\"${buildTime}\"" } }
Pamiętaj o umieszczenie stringa “buildTime” w wyescapowanych slashach.
Idąc za dokumentacją metody
void buildConfigField(String type, String name, String value):
The field is generated as: <type> <name>=<value>;
This means each of these must have valid Java content. If the type is a String, then the value should include quotes.

Zmiana nazwy artefaktów

Zmiana nazwy APK

Przy modyfikacji applicationVariants
 
android{ applicationVariants.all { variant -> variant.outputs.each { output -> output.outputFileName = output.outputFileName.replace(".apk", "-${applicationVersionNameFull}.localBuild.apk") } } }
 

Zmiana nazwy AAB

Modyfikacja property archivesBaseName
android{ setProperty("archivesBaseName", applicationId + "-v" + applicationVersionNameFull) }

Rozdzielenie dużego pliku app/build.gradle

Stwórz nowy plik dependencies.gradle i umieść blok dependencies w ext{}
ext { dependencies { implementation 'androidx.core:core-ktx:1.9.0' implementation "androidx.compose.ui:ui:$compose_version" implementation "androidx.compose.material:material:$compose_version" implementation "androidx.compose.ui:ui-tooling-preview:$compose_version" implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' implementation 'androidx.activity:activity-compose:1.6.1' //i wiele innych } }
plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' } apply from: 'dependencies.gradle' apply from: 'test-dependencies.gradle' android { compileSdk 33 defaultConfig { //... reszta konfiguracji } } // nie potrzebujemy już bloku dependencies w tym miejscu
 
notion image
 

Zmiana nazwy aplikacji z build.gradle

Funkcja resValue(String, String, String) doda do values/gradleResValues.xml zmienną o nazwie app_name z wartością odpowiednio MyApp (free) oraz MyApp
android{ flavorDimensions "version" productFlavors { free { resValue "string", "app_name", "My App (free)" } premium { resValue "string", "app_name", "My App" } } }
💡
Warto pamiętać: nie zostanie wyedytowany plik values/strings.xml, tylko do katalogu {module}/build/generated/resValues/{flavor}/{buildType}/values zostanie dodany plik gradleResValues.xml
notion image

Inspekcja dependencji i wersje bibliotek

W terminalu odpal:
./gradlew app:dependencies
Dostaniesz jako output cały dependency graph dla całego modułu.
notion image
🔥
Protip: wrzuć output tej komendy od razu do pliku, będzie to łatwiej przeglądać niż sam output z terminala. ./gradlew app:dependencies > deps.txt
 
 

Failuj, gdy wersje dependencji się nie zgadzają

configurations.all { resolutionStrategy { failOnVersionConflict() } }
Przykładowy output:
Conflict(s) found for the following module(s): - androidx.core:core-ktx between versions 1.7.0 and 1.1.0 - androidx.compose.material:material between versions 1.1.0-beta01 and 1.0.0 - androidx.activity:activity-compose between versions 1.3.1 and 1.3.0
💡
Przydatne, gdy masz dużo dependencji i nie wiesz która “może coś psuć”

dry-run, czyli odpal taska bez odpalania go

Do każdego taska Gradle możesz dodać flagę —dry-run:
./gradlew bundleDebug --dry-run
Dostaniesz informacje jakie inne taski są wykonywane przy wywołaniu bundleDebug
:app:preBuild SKIPPED :app:preDebugBuild SKIPPED :app:compileDebugRenderscript SKIPPED :app:generateDebugResValues SKIPPED (...) :app:packageDebugBundle SKIPPED :app:signDebugBundle SKIPPED :app:produceDebugBundleIdeListingFile SKIPPED :app:createDebugBundleListingFileRedirect SKIPPED :app:bundleDebug SKIPPED
💡
przydatne, gdy debugujesz czasochłonny build