DEV Community

Rodrigo Sicarelli
Rodrigo Sicarelli

Posted on • Edited on

Android Plataforma - Parte 8: Decorando os módulos 'library'

🌱 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:

  1. Expor e implementar a função internal fun applyAndroidLibrary() no arquivo decorations/android.kt.
  2. Tornar nossa API acessível para os demais módulos no arquivo KPlatformPlugin.kt através da função fun androidLibrary().
  3. 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> { } } 
Enter fullscreen mode Exit fullscreen mode

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}" } } } } 
Enter fullscreen mode Exit fullscreen mode

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() 
Enter fullscreen mode Exit fullscreen mode

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) } 
Enter fullscreen mode Exit fullscreen mode
// 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) } 
Enter fullscreen mode Exit fullscreen mode
// 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) } 
Enter fullscreen mode Exit fullscreen mode

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)