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)