🌱 Branch: 8/decorating-android-library
🔗 Repositório: github.com/rsicarelli/kotlin-gradle-android-platform
⬅️ Artigo Anterior: Parte 7: Decorando o módulo 'app'
➡️ Próximo Artigo: Parte 9: Unificando a Application e Library extensions com a Common Extension
No último post, apresentamos a primeira decoração na Plataforma e fizemos toda a configuração do nosso módulo app usando Kotlin DSL.
Agora, vamos estender essa configuração para os módulos designsystem, home e details.
Adotaremos exatamente a mesma estratégia para essa decoração:
- Expor e implementar a função
internal fun applyAndroidLibrary()
no arquivodecorations/android.kt
. - Tornar nossa API acessível para os demais módulos no arquivo
KPlatformPlugin.kt
através da funçãofun androidLibrary()
. - Substituir as configurações do módulo por essa nova função.
Passo a passo
1 - Crie uma nova função internal fun applyAndroidLibrary()
em build-logic/decorations
. Em seguida, recupere as extensões registradas no Project
para configurar o LibraryExtension
:
import com.android.build.api.dsl.LibraryExtension
import org.gradle.api.Project
import org.gradle.kotlin.dsl.configure
internal fun Project.applyAndroidLibrary() {
extensions.configure<LibraryExtension> {
}
}
2 - Transfira o conteúdo do bloco android {}
de qualquer módulo (designsystem
, home
, details
) para a configuração do LibraryExtension
.
Neste passo, vamos também reutilizar o applyKotlinOptions()
da solução anterior e a configuração do compilador Compose:
import com.android.build.api.dsl.LibraryExtension
import org.gradle.api.JavaVersion
import org.gradle.api.Project
import org.gradle.kotlin.dsl.configure
internal fun Project.applyAndroidLibrary() {
extensions.configure<LibraryExtension> {
namespace = "com.rsicarelli.kplatform"
compileSdk = 34
defaultConfig {
minSdk = 24
targetSdk = 34
vectorDrawables {
useSupportLibrary = true
}
}
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
applyKotlinOptions()
buildFeatures {
compose = true
}
composeOptions {
kotlinCompilerExtensionVersion = libs.version("composeKotlinCompilerExtension")
}
packaging {
resources {
excludes += "/META-INF/{AL2.0,LGPL2.1}"
}
}
}
}
3 - É hora de tornar esta decoração acessível aos nossos projetos. No KPlatformPlugin.kt
, declare a função fun androidLibrary()
:
import com.rsicarelli.kplatform.decorations.applyAndroidApp
import com.rsicarelli.kplatform.decorations.applyAndroidLibrary
import org.gradle.api.Plugin
import org.gradle.api.Project
class KplatformPlugin : Plugin<Project> {
override fun apply(project: Project) = Unit
}
fun Project.androidApp() = applyAndroidApp()
fun Project.androidLibrary() = applyAndroidLibrary()
4 - Sincronize o projeto. Depois, acesse cada build.gradle.kts
dos módulos e aplique a decoração androidLibrary()
:
// core/designsystem/build.gradle.kts
import com.rsicarelli.kplatform.androidLibrary
plugins {
id(libs.plugins.android.library.get().pluginId)
kotlin("android")
}
androidLibrary()
dependencies {
implementation(platform(libs.androidx.compose.bom))
api(libs.androidx.compose.ui)
api(libs.androidx.compose.ui.graphics)
api(libs.androidx.compose.ui.tooling.preview)
api(libs.androidx.compose.material3)
debugApi(libs.androidx.compose.ui.tooling)
debugApi(libs.androidx.compose.ui.test.manifest)
}
// features/home/build.gradle.kts
plugins {
id(libs.plugins.android.library.get().pluginId)
kotlin("android")
}
androidLibrary()
dependencies {
implementation(projects.core.designsystem)
implementation(projects.features.details)
}
// features/details/build.gradle.kts
import com.rsicarelli.kplatform.androidLibrary
plugins {
id(libs.plugins.android.library.get().pluginId)
kotlin("android")
}
androidLibrary()
dependencies {
implementation(projects.core.designsystem)
}
Sucesso!
E aí, o que achou dessa mudança? Olha a quantidade de código e repetição que conseguimos reduzir!
Com isso, a escalabilidade dos nossos módulos em desenvolvimentos futuros se torna muito mais viável.
No entanto, ainda existem oportunidades significativas para otimização e robustez na nossa plataforma.
No próximo post, vamos analisar o código redundante nas funções applyAndroidApp()
e applyAndroidLibrary()
. Além disso, exploraremos mais sobre ApplicationExtension
e LibraryExtension
.
Top comments (0)