Posted: 14 Jun. 2022 7 minutos Tiempo de lectura

Kotlin Multiplatform Mobile: ¿La panacea del desarrollo móvil?

El uso de aplicaciones móviles está en auge y la demanda de desarrollo de aplicaciones está contribuyendo a su crecimiento. Según un estudio elaborado por WeAreSocial, en colaboración con Hootsuite, la descarga de aplicaciones ha aumentado un 23.7% respecto al año anterior, con un total de 142.9 billones de aplicaciones descargadas. En consecuencia, el desarrollo de aplicaciones móviles se encuentra en su etapa de mayor crecimiento y debe haber un manera más rápida y eficaz de crear aplicaciones.

Durante la etapa de planificación de una aplicación móvil, el principal desafío es decidir si la aplicación debe ser nativa o híbrida. Sin embargo, el problema de una aplicación híbrida, y a pesar de que el desarrollo es unificado, es que el rendimiento suele inferior respecto a una aplicación nativa, además de que tienen más dificultades para trabajar con las funciones integradas del dispositivo (GPS, cámara, bluetooth, etc).

Y entonces, ¿por qué no utilizar una tecnología híbrida que solucione los problemas de rendimiento y que no tenga que lidiar con las funciones integradas del dispositivo?

¿Qué es Kotlin Multiplatform Mobile?

Kotlin Multiplatform Mobile es un SDK para el desarrollo móvil multiplataforma desarrollado y suministrado por JetBrains. Su principal beneficio es la capacidad para reducir el tiempo invertido tanto en el desarrollo como en mantenimiento del mismo código fuente para diferentes plataformas manteniendo la flexibilidad y los beneficios de la programación nativa.

A menudo, las versiones para Android y iOS de una aplicación tienen mucho en común, pero también pueden diferir en gran medida (especialmente en cuanto a interfaz de usuario). Al mismo tiempo, la lógica de negocio, como la gestión de datos, analíticas y autenticación, suele ser idéntica. Por eso resulta natural compartir algunas partes de una aplicación entre plataformas y mantener otras partes totalmente separadas.

Con KMM, se puede disfrutar de esta flexibilidad, abstrayendo en un único código común toda la lógica de negocio y utilizar este código tanto en aplicaciones iOS como Android, y mantener las ventajas de la programación nativa, escribiendo el código especifico de cada plataforma cuando sea necesario, por ejemplo, para implementar una UI nativa o utilizar APIs específicas de cada plataforma.

¿Cómo funciona KMM en iOS y Android?

La estructura de un proyecto básico en KMM está formado principalmente por tres módulos:

Shared Module

El shared module contiene la lógica común, escrita en Kotlin y compilada mediante Gradle, tanto para las aplicaciones Android como para las aplicaciones iOS. Sin embargo, a veces es necesario escribir lógica especifica de la plataforma dentro del shared module. En estos casos, Kotlin proporciona el mecanismo expect/actual. Con este mecanismo, el shared module define las declaraciones de tipo expect, y los módulos de las plataformas especificas deben proporcionar las implementaciones de tipo actual correspondientes.

Está organizado en 3 sub-módulos respectivamente:

  • CommonMain: contiene el código fuente que puede ser usado en ambas plataformas, incluyendo las declaraciones de tipo expect.
  • AndroidMain: contiene el código fuente específico para Android, incluyendo las implementaciones de tipo actual.
  • iOSMain: contiene el código fuente específico para iOS, incluyendo las implementaciones de tipo actual.

Una vez tenemos el código fuente, este es compilado en un artefacto Android ARchive (AAR), en el caso de Android. En cambio, para iOS, el código fuente es compilado en un framework usando Kotlin Native. Además, por cada plataforma, se pueden compilar uno o más artefactos. Por defecto la compilación incluye:

  • Para iOS dos artefactos: main y test.
  • Para Android, se crea un artefacto por cada Android Build Variant.

Android App

El módulo Android App como parte de un proyecto KMM, es la típica aplicación Android escrita en Kotlin y compilada mediante Gradle. Y para acceder a la lógica común dentro del shared module, se añade el artefacto como una dependencia dentro de Gradle:

iOS App

El módulo iOs App como parte de un proyecto KMM, es la típica aplicación iOS escrita en Swift y compilada mediante XCode. Y para acceder a la lógica común dentro del shared module, se debe de configurar de manera correcta:

  1. Other linker flags dentro de la sección Linking:
 
2. Framework Search Paths dentro de la sección Search Paths:

Ventajas y desventajas de KMM

Las principales ventajas de KMM son:

  • Gastos de desarrollo mayores: usando KMM, es posible reducir los tiempos de desarrollo entre un 30 – 50%. Además, gracias a Kotlin, son necesarias alrededor de un 40% menos de líneas de código con respecto a Java. Esto da como resultado un menor coste y tiempo invertido durante el desarrollo de una aplicación.
  • Menos bugs: menos líneas de código y un código más simple, conlleva a la aparición de menos bugs. Sin embargo, en caso tener algún bug y dado que el código es compartido para todas las plataformas, implementando un único fix se soluciona el bug tanto para Android como para iOS. No es necesario un fix por plataforma.
  • Mayor eficiencia del equipo: gracias a la lógica de negocio es compartida para ambas plataformas, por ejemplo, el equipo iOS se puede centrar en el desarrollo de la UI para la plataforma iOS, mientras el equipo Android se divide las tareas entre UI y lógica común dado que el gap entre lenguajes de programación es menor.
  • Prácticamente una solución nativa: el uso de KMM permite que la toda la parte visual de la aplicación sea responsabilidad de cada una de las plataformas, asegurando un rendimiento óptimo y una magnifica integración con los diferentes componentes nativos.

A pesar de las ventajas, también hay una serie de desventajas que hay que tener en cuenta antes de usar Kotlin Multiplatform Mobile:

  • Curva de aprendizaje: en el caso de alguien ya familiarizado con Kotlin, el salto a KMM es prácticamente inmediato en comparación con un desarrollador iOS o alguien con poca o sin experiencia en programación orientada a objetos.
  • Multithreading: Kotlin hace uso de las Coroutines para escribir código asíncrono, pero existen una serie de limitaciones, ya que el uso de Coroutines en iOS solo soporta un único hilo. Sin embargo, hay una serie de herramientas y workarounds para solucionarlo.
  • Fase alpha: KMM se encuentra en fase Alpha lo que implica que algunas características pueden sufrir camnbios en futuras versiones.
  • Falta de expertos: a pesar de que Kotlin ha ganado adeptos en los últimos años, sobre todo en el desarrollo de Android, KMM todavía no es suficientemente conocido y puede que durante el desarrollo de una aplicación se encuentre un problema sin una solución óptima.

Conclusión

Kotlin es un lenguaje de programación magnifico y KMM lo acerca a otras plataformas con la intención de crear aplicaciones escalables y fácilmente mantenibles teniendo una única lógica de negocio común. A pesar de que el código compartido es ligeramente menor al de otras tecnologías (no es posible compartir la UI), nos da la ventaja de crear la UI acorde con las directrices de diseño y las buenas prácticas de las plataformas específicas.

Además, combinar KMM con programación reactiva y un flujo de datos unidireccional, nos ayuda a crear una solución totalmente desacoplaba y agnóstica a la UI. Usando KMM se espera compartir un 70 – 80% del código entre todas las plataformas, y añadir una nueva plataforma, sería solo cuestión de implementar una nueva UI.

Y, por último, pero no menos importante, y a pesar de que KMM se encuentra en fase Alpha, es totalmente seguro utilizarlo en producción gracias a que Kotlin JVM es estable y Kotlin Native se encuentra en fase Beta.

 

Autor del artículo

Marc Gareta, consultor de Consultoría Tecnológica de Deloitte