Kotlin Multiplatform: o que é, shared module e expect/actual

Autor: IT Sectr Publicado: 2026-02-11 Tempo de leitura: 11 min

Kotlin Multiplatform (KMP) é uma tecnologia da JetBrains que compila código Kotlin compartilhado para iOS, Android, Web e Desktop. Ao contrário do Flutter e React Native, o KMP não substitui UIs nativas — a lógica compartilhada é extraída para um shared module, enquanto a interface de cada aplicativo permanece nativa. Kotlin Multiplatform documentation — a referência principal para configurar módulos e o mecanismo expect/actual.

Pontos principais

  • KMP — lógica compartilhada em Kotlin com expect/actual para APIs de plataforma sem substituir a UI nativa
  • Shared module — um módulo Gradle com código de rede, banco de dados, validação e lógica de negócios para todas as plataformas
  • Expect/actual — mecanismo para declarar API de plataforma em código compartilhado com implementação para cada destino
  • Integração iOS — o shared module compila em um framework da Apple via Kotlin/Native
  • KMP vs KMM — Kotlin Multiplatform Mobile (foco móvel) agora faz parte do Kotlin Multiplatform

O que é Kotlin Multiplatform?

Kotlin Multiplatform é uma tecnologia de compilação cruzada que permite escrever código compartilhado em Kotlin e compilá-lo para diferentes plataformas: JVM (Android), LLVM (iOS, macOS, watchOS), JavaScript (Web) e binários nativos (Linux, Windows). KMP não é um framework de UI — ele resolve o problema de reutilizar a lógica de negócios, não as interfaces.

A arquitetura KMP é construída em torno de um shared module — um módulo Gradle contendo commonMain com código independente de plataforma e source sets para cada destino (androidMain, iosMain, desktopMain). De acordo com dados da JetBrains para 2025, mais de 40% dos novos projetos Kotlin usam KMP para compartilhar código entre plataformas.

Kotlin Multiplatform Mobile (KMM) — o nome anterior para o cenário móvel iOS+Android. Desde Kotlin 2.1+, o termo KMM foi substituído por Kotlin Multiplatform, pois a tecnologia ultrapassou o desenvolvimento móvel. Netflix, McDonald's e VMware usam KMP em produção para compartilhar código entre aplicativos móveis.

Mecanismo expect/actual: arquitetura

Expect/actual — o mecanismo chave do KMP para trabalhar com código específico de plataforma. No commonMain, uma declaração expect (função, classe, propriedade) é declarada, e em cada source set específico de plataforma (androidMain, iosMain), uma implementação actual é fornecida. O compilador verifica se para cada expect existe um actual em cada plataforma de destino.

kotlin
// commonMain — declaração de API de plataforma
expect fun getPlatformName(): String

expect class PlatformContext(val appVersion: String)

// androidMain — actual para Android
actual fun getPlatformName(): String = "Android \${Build.VERSION.SDK_INT}"

// iosMain — actual para iOS
actual fun getPlatformName(): String =
    UIDevice.currentDevice.systemName

A hierarquia de source sets no KMP permite criar níveis intermediários: por exemplo, iosArm64Main (dispositivos iOS físicos) e iosSimulatorArm64Main (simulador) com iosMain compartilhado. O código do commonMain está disponível para todas as plataformas, enquanto o código do iosMain está disponível apenas para destinos iOS. Isso reduz a duplicação quando a implementação difere não para cada plataforma, mas para um grupo de plataformas.

Na prática, expect/actual é usado para: acessar armazenamento local (SharedPreferences vs NSUserDefaults), redes (HttpEngine por plataforma), acesso ao sistema de arquivos, criptografia e análise. A JetBrains recomenda minimizar o número de declarações expect/actual e mover o máximo de código possível para o commonMain.

Shared module: estrutura e Gradle

Shared module — um módulo Gradle padrão com o plugin org.jetbrains.kotlin.multiplatform. Ele contém código compartilhado em src/commonMain/kotlin/ e implementações específicas de plataforma em src/androidMain/kotlin/ e src/iosMain/kotlin/. Um projeto KMP também inclui androidApp e iosApp, que dependem do shared module.

kotlin
// build.gradle.kts — shared module
plugins {
    kotlin("multiplatform")
    id("com.android.library")
}

kotlin {
    androidTarget()
    
    listOf(
        iosX64(),
        iosArm64(),
        iosSimulatorArm64()
    ).forEach {
        it.binaries.framework {
            baseName = "shared"
            isStatic = true
        }
    }

    sourceSets {
        val commonMain by getting {
            dependencies {
                implementation("io.ktor:ktor-client-core:3.1.0")
                implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3")
            }
        }
        val androidMain by getting {
            dependencies {
                implementation("io.ktor:ktor-client-okhttp:3.1.0")
            }
        }
        val iosMain by creating {
            dependencies {
                implementation("io.ktor:ktor-client-darwin:3.1.0")
            }
        }
    }
}

A configuração do Gradle para KMP requer a declaração explícita dos destinos iOS — x64 (simulador Intel), arm64 (dispositivos físicos) e simulatorArm64 (simulador Apple Silicon). Um framework Apple separado é gerado para cada destino. O plugin kotlin("multiplatform") configura automaticamente a compilação para JVM e LLVM de acordo com os destinos declarados.

Ktor e kotlinx.serialization — bibliotecas KMP padrão que suportam código compartilhado. Ktor fornece um cliente HTTP com mecanismos para cada plataforma (OkHttp para Android, Darwin para iOS). kotlinx.serialization funciona em todas as plataformas sem expect/actual graças à sua implementação multiplataforma no commonMain.

Integração com iOS via Kotlin/Native

Kotlin/Native — um compilador Kotlin para código nativo via LLVM. Para iOS, o shared module é compilado em um framework da Apple (.framework) que é conectado via Xcode. A chamada ao código compartilhado do Swift/Objective-C ocorre através dos cabeçalhos Objective-C gerados, portanto a API do shared module deve ser compatível com Objective-C.

Limitações da integração iOS: as coleções Kotlin (List, Map) são convertidas em NSArray/NSDictionary. Funções com parâmetros padrão não são exportadas — são necessárias sobrecargas. Para funções suspend, métodos baseados em callback são gerados com @ObjCName e suporte async/await a partir do Kotlin 2.0+.

swift
// Aplicativo iOS: chamando shared module do Swift
import shared

class ViewModel: ObservableObject {
    let repository = UserRepository()
    
    func loadUsers() {
        repository.fetchUsers(completionHandler: { result, error in
            if let users = result as? [User] {
                print("Users: \(users.count)")
            }
        })
    }
}

A integração do shared module no Xcode ocorre via embed-and-framework — o .xcframework gerado é adicionado ao projeto Xcode. O plugin Gradle pode atualizar automaticamente o framework durante a compilação via embedAndSignAppleFrameworkForXcode. Para teste no simulador, um binário iosSimulatorArm64 ou iosX64 é suficiente.

KMP vs Flutter vs React Native

A escolha entre KMP, Flutter e React Native depende da prioridade: reutilização de código ou plataforma cruzada completa. KMP fornece UI nativa em cada plataforma, mas requer duas bases de código para a interface. Flutter e React Native usam uma única UI, mas sacrificam a natividade.

CaracterísticaKMPFlutterReact Native
Framework de UINativo (Android XML/Jetpack Compose + SwiftUI)Dart + renderizador Skia próprioReact + componentes nativos
Código compartilhadoLógica de negócios, rede, BD, validação100% exceto plugins nativos100% exceto módulos nativos
DesempenhoNativo (sem camada intermediária)Alto (Skia Engine)Médio (JSI Bridge)
Suporte iOSKotlin/Native (excelente)ExcelenteBom
Barreira de entradaMédia (Kotlin + plataformas nativas)Baixa (um idioma + uma UI)Baixa (JS/TS + React)

Quando escolher KMP: o projeto requer UI de alto desempenho (jogos, mapas, animações), é necessário reutilizar código nativo existente, a equipe já conhece Kotlin e plataformas nativas. Quando escolher Flutter/RN: MVP ou startup com orçamento limitado, equipe de perfil único, a UI não requer personalização nativa profunda.

Ferramentas e bibliotecas KMP

O ecossistema de ferramentas KMP inclui bibliotecas para todas as camadas do aplicativo: redes (Ktor), serialização (kotlinx.serialization), banco de dados (SQLDelight), navegação (Decompose), DI (Koin) e armazenamento de dados (multiplatform-settings). A JetBrains oferece suporte ao Compose Multiplatform — um framework de UI em Kotlin que funciona em todas as plataformas.

kotlin
// Repositório KMP com SQLDelight + Ktor
class UserRepository(
    private val httpClient: HttpClient,
    private val db: AppDatabase
) {
    suspend fun syncUsers(): List<User> {
        val remote = httpClient.get("https://api.example.com/users")
            .body<List<UserDto>>()
        
        db.userQueries.replaceAll(remote.map { it.toDomain() })
        
        return db.userQueries.selectAll().executeAsList()
    }
}

Compose Multiplatform — um framework de UI para KMP baseado no Jetpack Compose. Permite escrever interfaces em Kotlin para Android, iOS, Desktop e Web. Em 2025, o Compose Multiplatform atingiu o status estável para Android e Desktop; o destino iOS está em beta. Para projetos de produção com UI nativa, a vantagem do KMP continua sendo a principal diferença do Flutter.

Perguntas frequentes

Qual a diferença entre Kotlin Multiplatform e Kotlin Multiplatform Mobile?

KMM — é o cenário móvel do KMP para iOS e Android. Desde Kotlin 2.1+, a JetBrains combinou ambos os termos em Kotlin Multiplatform, pois a tecnologia suporta não apenas plataformas móveis, mas também Desktop e Web. Os projetos KMM continuam funcionando, mas agora fazem parte do KMP geral.

Posso usar KMP com SwiftUI?

Sim. KMP compila em um framework da Apple via Kotlin/Native com cabeçalhos Objective-C. O SwiftUI importa este framework como qualquer biblioteca normal. O shared module exporta classes e funções Kotlin que são chamadas do Swift com algumas limitações (por exemplo, coleções Kotlin são convertidas em tipos Foundation).

Como testar o shared module no iOS?

No iOS, o shared module é testado através de testes Kotlin/Native no source set iosTest. Para testes de UI, utiliza-se XCTest no Xcode com o framework importado. Os testes Kotlin são escritos em commonTest com kotlin.test e executados no simulador iOS através da tarefa Gradle iosSimulatorArm64Test.

Quais bibliotecas estão disponíveis no KMP?

Principais bibliotecas KMP: Ktor (redes), kotlinx.serialization (JSON), SQLDelight (BD), Koin (DI), Decompose (navegação), multiplatform-settings (SharedPreferences/NSUserDefaults), Apollo GraphQL, Firebase (via KMP-NativeCoroutines). O Compose Multiplatform fornece UI para todas as plataformas.

O KMP suporta Gradle 8?

Sim. KMP é totalmente compatível com Gradle 8.5+. A partir do Kotlin 2.1, os plugins oficiais suportam Gradle 8. A configuração via build.gradle.kts com kotlin("multiplatform") requer Gradle 7.6+, mas a versão 8.5 é recomendada para desempenho ideal de compilação.

Resumo

  • Kotlin Multiplatform — tecnologia multiplataforma da JetBrains para código compartilhado sem substituir a UI nativa
  • Expect/actual — mecanismo para declarar APIs de plataforma no commonMain com implementações para cada destino
  • Shared module — módulo Gradle com commonMain e source sets específicos de plataforma (androidMain, iosMain)
  • Kotlin/Native compila o shared module em um framework da Apple chamável do Swift e Objective-C
  • KMP vs Flutter/RN — reutilização de lógica + UI nativa versus base de código única e UI
  • Compose Multiplatform — framework de UI em Kotlin para Android, iOS, Desktop e Web
  • Ecossistema — Ktor, SQLDelight, Koin, kotlinx.serialization, Decompose para todas as camadas do aplicativo

Vamos desenvolver um aplicativo móvel chave na mão

A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.

Discutir o projeto

Leia também