2024 Google I/O 宣布正式支持 Kotlin Multiplatform ,那 KMP 是什么?它的未来在哪里?

基于最近一直有人和我提 KMP ,那就简单聊聊。

2024 Google I/O 正式官宣了支持 KMP ,而一般意义上的 KMP 指的就是 Kotlin Multiplatform ,它是 Google Workspace 团队的一项长期「投资」项目,这里有个重点,那就是 Kotlin Multiplatform 由 JetBrains 开发维护和开源的项目,简单来说,JetBrains 主导,Google Workspace 投资并提供技术支持。

原理上,Kotlin Multiplatform 通过将 Kotlin 编译为平台原生的二进制文件,从而提供跨平台共享代码的目的,应用场景上 :

Forbes 就提到过,他们通过 Kotlin Multiplatform 在 iOS 和 Android 上共享 80% 以上的逻辑,而麦当劳也曾提到过,他们采用了 Kotlin Multiplatform 开发全球移动应用。

当然,这里需要说的是,Kotlin Multiplatform 和 Compose Multiplatform 虽然都是 JetBrains 维护的项目,它们经常被一起提及,但是他们其实是两个项目

  • Kotlin Multiplatform:提供了底层逻辑的跨平台,为 Compose Multiplatform 提供了基础支撑
  • Compose Multiplatform:Compose UI 的跨平台框架,提供 UI 跨平台能力

用 JB 官方的话说就是:借助 Compose Multiplatform,开发者可以将 Kotlin Multiplatform 的代码共享能力推向应用逻辑之外

其实从另一方面讲,Kotlin Multiplatform 的目的并不是消除所有特定于平台的代码,它更多是提供了一种代码重用最大化的方式,同时允许灵活地进行特定于平台的优化和定制,很好的例子就是 iOS 上协程是通过 SKIE 实现支持。

所以如果有一个 Android App 想运行到 iOS 上,那么你会经历的逻辑就是:

  • UI 部分逻辑通过 Compose Multiplatform 实现跨平台,如果你是 Compose UI ,那么需要调整的不会很多。
  • 业务逻辑通过 Kotlin Multiplatform 来跨平台,需要注意你使用的一些库,例如 androidx.* 是否已经支持到了 Kotlin Multiplatform

PS,现在 iOS 上的 Compose Multiplatform 同样支持了集成 iOS 原生的 UIKit 和 SwiftUI ,例如可以通过 UIKitView 集成 iOS 的 UIKit 元素

正如本次 I/O 上所说,Google 和 JetBrains/Kotlin 开发者社区合作,为许多 Jetpack 库添加了 Kotlin 多平台支持,并在某些情况下提供 iOS 平台目标,例如:

  • Ktor 通过处理 REST 服务消耗来简化网络任务,
  • kotlinx.serialization 将数据转换为 JSON 等格式
  • Okio 管理基本的文件 I/O
  • SKIE 适配了类型和协程在 iOS 上的使用
  • CocoaPods 集成支持使用 iOS 特定的依赖项

另外,Annotations、Collections 和 DataStore 库都在稳定版本中支持 Kotlin Multiplatform,另外还添加了对验证 iOS 平台目标的二进制兼容性的支持,使其与 Android 的标准保持一致。

除了上面的库之外,目前还在致力于为 Room、 Lifecycle 和 ViewModels 提供 Kotlin 多平台支持,并且现已提供 alpha 版本。

最后 Android Gradle 插件现在正式支持 Kotlin Multiplatform,可以使用简洁的构建定义将 Android 设置为共享代码的平台目标,如下所示:

plugins {
    id("org.jetbrains.kotlin.multiplatform")
    id("com.android.library")
}

kotlin {
    androidTarget {
        compilations.all {
            kotlinOptions {
                jvmTarget = "11"
            }
        }
    }  
    listOf(
        iosX64(),
        iosArm64(),
        iosSimulatorArm64()
    ).forEach { iosTarget ->
        iosTarget.binaries.framework {
            baseName = "Shared"
            isStatic = true
        }
    }    
    sourceSets {
        commonMain.dependencies {
            // put your Multiplatform dependencies here
        }
    }

当然,也有一些其他问题,例如不少第三方库没有实现支持,例如 Dagger#3916 里所说的,Dagger/Hilt 仍然面临修复 KSP 支持的问题,他们目前还没有计划支持 KMP。

当然对于 DI 现在也有类似替代框架,例如:

  • Koin

  • Kodein

  • kotlin-inject

  • Koject

  • DI.kt

  • PopKorn

最重要的是,JB 现在提供了包发布和检索网站: https://package-search.jetbrains.com/ ,这是跨平台必备的社区支撑,类似 npm、pub 平台,这对于 Kotlin Multiplatform 生态的重要性不言而喻。

至于使用了 Kotlin Multiplatform 的知名企业,目前已知的有:

  • 麦当劳
  • netflix
  • PHILIPS
  • 百度
  • Meetup
  • 快手
  • VMware

最后,其实今年 I/O ,Android 和 Flutter 的 PM 还联合发布了一篇文章 《让开发者更轻松地进行跨平台开发》 ,文章里面就提到了:最适合你业务的的才是最重要的

基于这篇内容,简单总结就是:

  • Kotlin 和 Jetpack Compose 是 Android 开发的首选。
  • KMP 将 Kotlin 编译为特定于平台的二进制文件(如 Android、iOS、JVM、WASM),所以你可以用最小的开销调用特定于平台的 API,并利用 Compose MultiPlatform 实现 UI 。
  • Flutter 更多是提供所有平台上业务和 UI 代码的一致,它不特定于平台。

所以,很多时候大家可能觉得它们是你死我活的局面,但是更多来说,它们的维护主体和关注的群体都不一样

最后,我相信很多老 Android 都还在用 XML 布局,这并没有什么问题,但是声明式 UI 基本在客户端已经是主流了, Compose 、Flutter、React Native、SwiftUI 、ArkUI 都表明了声明式 UI 是这个时代的选择

不过还是那句话,能完成业务才是最重要的,技术“新不新“”牛不牛“都是其次,重要的还是业务赚不赚钱,产品是否有前景,企业是否提供岗位,毕竟我们都不是技术驱动的公司,技术并不盈利

更多参考资料:

  • https://github.com/android/kotlin-multiplatform-samples

  • https://android-developers.googleblog.com/2024/05/android-support-for-kotlin-multiplatform-to-share-business-logic-across-mobile-web-server-desktop.html

  • https://developers.googleblog.com/en/making-development-across-platforms-easier-for-developers/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/635655.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Day 59 503.下一个更大元素Ⅱ 42.接雨水

下一个更大元素Ⅱ 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环…

Java用反射reflect来实例化对象: class.getDeclaredConstructor().newInstance()

Java用反射reflect来实例化对象: class.getDeclaredConstructor().newInstance() 从java9开始, class.newInstance()已过时, 被加上Deprecated强烈反对注解 SuppressWarnings("removal")CallerSensitiveDeprecated(since"9")public T newInstance()throws …

使用xsd验证xml格式的正确性

1.1 基础知识介绍 XML简介:XML是可扩展标记语言(eXtensible Markup Language)的缩写,它是一种数据表示格式,可以描述非常复杂的数据结构,常用于传输和存储数据。xml文件、xml消息。XSD简介:是X…

基于轻量级神经网络GhostNet开发构建CIFAR100数据集场景下的图像识别分析系统,对比不同分辨路尺度下模型的性能情况

Cifar100数据集是一个经典的图像分类数据集,常用于计算机视觉领域的研究和算法测试。以下是关于Cifar100数据集的详细介绍: 数据集构成:Cifar100数据集包含60000张训练图像和10000张测试图像。其中,训练图像分为100个类别&#x…

基于图鸟UI的资讯名片模版开发与应用

一、引言 在前端技术日新月异的今天,快速、高效、美观的UI组件库和模板成为了开发者们关注的焦点。图鸟UI作为一款集成了基础布局元素、配色体系、图标icon和精选组件的UI框架,为前端开发者提供了极大的便利。本文将以图鸟UI为基础,探讨基于…

汀木云OZON选品工具,OZON跨境电商的选品利器

在竞争激烈的跨境电商市场中,选品是卖家们成功经营的关键之一。而汀木云OZON选品工具,作为OZON跨境电商的选品利器,以其独特的优势,为卖家们提供了精准、高效的选品解决方案。接下来看看汀木云OZON选品工具和萌啦OZON数据跨境OZON…

Unity3D输入事件

文章目录 前言一、全局事件二、射线三、点选3D模型四、点击地面控制人物移动总结 前言 Unity输入事件分为两类,全局触发和监听式触发。全局触发通常是运行在update在每帧进行检测,而监听式触发是被动的输入事件。 一、全局事件 在最新的unity中有新和旧…

docker-compose 搭建 单机版ELK

docker-compose 搭建 单机版ELK 前言 本次部署将使用ElasticSearch官方的镜像和Docker-Compose来创建单节点的ELK,用于学习ELK操作。在k8s集群内,如果每天的日志量超过20G以上,建议部署在k8s集群外部,以支持分布式集群的架构。在…

人类听觉处理和语言中枢

人类听觉概述 人类听觉是指通过耳朵接收声音并将其转化为神经信号,从而使我们能够感知和理解声音信息的能力。听觉是人类五种感觉之一,对我们的日常生活和交流至关重要。 听觉是人类交流和沟通的重要工具。通过听觉,我们能够听到他人的语言…

计算机专业实习生应该去哪实习?

计算机专业实习生可以选择在各种不同类型的公司和组织中实习。我这里有一套编程入门教程,不仅包含了详细的视频讲解,项目实战。如果你渴望学习编程,不妨点个关注,给个评论222,私信22,我在后台发给你。 这取…

高稳定数显芯片防干扰抗噪数码屏驱动高亮LED驱动IC-VK16K33A/AA 最大13×3的按键扫描

产品型号:VK16K33A/AA 产品品牌:永嘉微电/VINKA 封装形式:SOP28/SSOP28 原厂,工程服务,技术支持! 概述 VK16K33A/AA是一种带按键扫描接口的数码管或点阵LED驱动控制专用芯片,内部集成有数据…

C#读取.sql文件并执行文件中的sql脚本

有些时候我们需要在程序中编写读取sql脚本文件并执行这些sql语句,但是我们在有些时候会遇到读出来的sql语句不能执行,其实不能执行并不是你的sql脚本文件有错误,而是去执行sql语句的时候,C#代码里面执行sql语句的代码对sql里面的一…

【DevOps】深入浅出:Jenkins 性能监控全解析

目录 一、监控指标:把握系统健康状况 1、资源利用率: 2、 任务执行效率: 3、系统稳定性: 二、监控工具:选择合适的利器 1、Jenkins 内置监控 1.1、Jenkins Performance Plugin:系统性能指标的直观展…

3D工业视觉

前言 本文主要介绍3D视觉技术、工业领域的应用、市场格局等,主要技术包括激光三角测量、结构光、ToF、立体视觉。 一、核心内容 3D视觉技术满足工业领域更高精度、更高速度、更柔性化的需求,扩大工业自动化的场景。 2D视觉技术基于物体平面轮廓&#…

【译】MySQL 组复制 - 部分网络故障对性能的影响

原文地址:MySQL Group Replication – Partial Network Failure Performance Impact 在这个由两部分组成的博客系列中,我想介绍一些使用组复制的故障转移场景。在第一部分中,我将讨论我在撰写这些文章时发现的一种有趣的行为和性能下降。在第…

Java方法的递归

Java方法的递归 前言一、递归的概念示例代码示例 二、递归执行过程分析代码示例执行过程图 三、递归练习代码示例按顺序打印一个数字的每一位(例如 1234 打印出 1 2 3 4)递归求 1 2 3 ... 10写一个递归方法,输入一个非负整数,返回组成它的数字之和. …

全网首发UNIAPP功能多的iapp后台源码

全网首发UNIAPP功能多的iapp后台源码,众所周知UN Dev Assist 后台是一款既不免费又不好用的后台今天直接分享。 搭建教程在里面了,自己查看。 源码下载:https://download.csdn.net/download/m0_66047725/89291994 更多资源下载:…

PDF Candy Desktop v2.89软件安装教程(附软件下载地址)

软件简介: 软件【下载地址】获取方式见文末。注:推荐使用,更贴合此安装方法! PDF Candy Desktop v2.89是一款多功能且操作简便的PDF转换工具。该软件不仅功能强大,还能帮助用户将PDF文件转换为多种格式的文档&#x…

dubbo复习:(4) 和springboot 整合时,客户端负载均衡的配置

需要在DubboReference注解指定loadbalance属性。示例如下: package cn.edu.tju.service;import org.apache.dubbo.config.annotation.DubboReference; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Ser…