首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

干货 | 携程机票 App KMM 跨端生产实践

2)协程调度器 Dispatchers.Default 在 Kotlin/JVM 上是线程池实现,而在 Kotlin/Native 上是单后台线程实现(multi-thread 版本)。...3)我们在 Kotlin/Native 上也无法自己编写基于池化技术的协程调度器,因为它可能会因为挂起时与恢复时所在线程不同而 crash。...首先,在 KMM 工程中,所有的协程只能在主线程开启;其次,在执行需要后台线程执行的任务时,通过专门编写的高阶函数 API 来执行;最后,所有的可变状态(通常是成员变量)必须在主线程更新值。...,仅有计算过程在后台线程执行。...3.5 协程异常处理器抛出 NoClassDefFoundError 该问题是 Kotlin 协程在 JVM 平台出现的问题。

3.7K10

KMM 求生日记二:KotlinNative 被踩中的坑

在 Android 上完成基本的测试,能跑通之后,由我的一位同事(也是小组 leader)在 iOS 主工程中编写类似我在 Android 主工程中编写的代码(Objective-C)。...其实在 Android 上基本没什么问题,因为本质就是用 Kotlin 写了些代码,打成 aar 给主工程调用而已,所以主要的问题还是出在 iOS(Kotlin/Native)上。 一....,一旦对其进行更改(无论是否在别的线程进行),都会抛出 InvalidMutabilityException 异常。...如果能证明语言层面上问题,后续 Model 层的业务逻辑就可以大规模迁移到 KMM。 后面我们可能会把精力花在研究一下 cinterop 这个工具以及 iOS 的构建系统上。...如果能用 cinterop 搞定对已有的 iOS Framework 或 .a 文件的依赖,我们可以基于许多已有的 Objective-C 库和 Java 库封装出许多实用的 KMM 库,而暂时不必用

2.7K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    谷歌社区说|聊聊Compose跨平台与KMM

    上一次在社区分享还是在三年前的Android 11见面会上,本次为大家分享的主题是Compose Multiplatform和KMM。这里是本次分享的文字版。...通过KMM,开发者可以在 iOS 、 Android、Desktop与Web 应用程序之间共享业务逻辑的通用代码,在必要时也可以编写特定于平台的代码。所以,KMM只负责跨平台下的业务逻辑部分。...但是,其实这种观点是不正确的,很多业务逻辑比如日志系统、埋点等业务使用KMM还是非常有利的。 后来Compose Multiplatform的出现弥足了KMM的短板。...这里我基于刚刚创建的KMM项目,在KMM的基础上添加Compose Multiplatform的配置。...很多人告诉我的理由都是Java也能用啊、老板不让用啊、公司项目陈旧啊,其实这些放到现在都是借口了。

    1.4K10

    KMM跨平台开发入门,看这一篇就够了~

    通过KMM开发者可以在 iOS 和 Android 应用程序之间共享通用代码,并仅在必要时编写特定于平台的代码。 ...输入项目名称,选择对应的配置 在 iOS 框架分发列表中,选择常规框架选项 (这里为了简单演示,实际项目根据所需选择即可)。点击Finish就创建了一个KMM的项目。...可以使用 CocoaPods 或其他依赖项管理器的原生 iOS 项目和使用 Gradle 的 Android 项目中使用。...运行程序 安装过KMM的插件,可以在AndroidStudio中选择iOS的虚拟机,前提必须是已经在Xcode或其他地方配置了iOS的虚拟机,如图所示。  ...写在最后 到这里,恭喜你,已经入门了KMM的使用,更多的使用方法需要在实际项目中不断地去总结,去尝试,Jetpack目前也在开发KMM版本,这对KMM发展将会是一个推进~

    4.7K20

    KotlinNative KMM项目架构

    在 KMM 的帮助下,您可以在 iOS 和 Android 应用程序之间共享通用代码,并仅在必要时编写特定于平台的代码。...KMM用纯Kotlin编写一次代码,即可在iOS和Android上运行,开发应用的公共业务逻辑只需要编写一次。KMM减少了为不同平台编写和维护相同代码所花费的时间。...[KMM构建.png] 二、KMM项目架构 项目架构主要分为原生系统层、Android/iOS业务SDK层、KMM SDK层、KMM业务逻辑SDK层、iOS sdkframework层、Android/...Android/iOS业务SDK层:主要是包括一些现有的Android/iOS SDK,需要直接依赖现有SDK来开发KMM时,在commonMain expect声明接口,在androidMain、iosMain...函数,而iOS没有这个函数。好处是通常一些SDK在commonMain中会定义一套公共接口,有时候Android或iOS有一些独有接口,就可以用这种方式声明。

    3.3K00

    别具特色的跨平台移动开发 - Kotlin Multiplatform Mobile

    在KMM的官网上,它对自己的最简明的一句介绍是: Share the logic of your iOS and Android apps while keeping the UX native 用中文来理解就是...在移动端开发中,一个显著的特征是: 不同端的业务逻辑是几乎完全一致的,只是它们的实现技术与载体不同而已 所以,KMM则基于上述这个思路,创新式的引入了另一种模式: 在保持原生开发的基础上,使业务模块重用...KMM的实现思路是重用业务。 在Android中开发业务实现,KMM会将你的业务生成iOS类库。你在iOS开发的时候,相当于依赖了一个类库,这个类库提供了本身你业务的很多方法。...KMM官网:https://kotlinlang.org/lp/mobile/ myddd-kmm-scoffold示例项目发布 我一直在关注与调研移动开发的技术,对iOS的SwiftUI,Android...而KMM也是我关注的一个移动开发技术方向,因为它一方面重用了业务,另一方面又维持了原生开发,似乎是个挺不错的实现思路。 最近五一假期时,基于KMM做了一个可运行的示例项目。

    1.7K20

    Bugless 异常监控系统 (iOS端)

    同时 Bugless 也支持后台聚合错误信息数据,分析历史异常数据,协助开发人员对项目进行实现监控和产品迭代优化。...二、认识崩溃和异常 在讲解 Bugless 之前,让我们从三个层面来介绍,让大家认识App为什么会出现崩溃和异常,以及如何应对。...Unix 信号的种类有很多,在 iOS 应用程序中,常见的 Unix 信号有如下几种: SIGILL:程序非法指令信号,通常是因为可执行文件本身出现错误,或者试图执行数据段。...SIGSEGV:程序无效内存中止信号,即试图访问未分配的内存,或向没有写权限的内存地址写数据。 SIGPIPE:程序管道破裂信号,通常是在进程间通信时产生该信号。...在 iOS App 中,一般情况采集以上几个常见的信号,就能满足日常采集 App 异常的需求。

    2.6K30

    Kotlin Multiplatform 实战记 | QCon

    主要负责基础业务、搜索、首页、用增相关等内容,会经常遇到多个 App 部分业务需要复用的情况。...cinterop 是 Kotlin Native 支持的能力,KMM 工程的编译使用了 gradle 工具链,其中对 iOS 来说,我们使用了 Kotlin CocoaPods 插件。...内存管理机制 Android:现代垃圾回收算法 iOS(Kotlin Native):基于引用计数的垃圾回收算法,额外增加了对环的处理 多线程实践 不可变状态才允许多线程访问(Kotlin Native...(Atomic) 3 Kotlin Multiplatform 在阿里巴巴的实践 1688 日志 我们在日志建设上使用了 Kotlin 收拢双端逻辑。...搜索逻辑比较复杂,有不同场景的搜索、不同品类的搜索、下拉的筛选项、侧边栏的筛选项等。在开发维护搜索逻辑的时候,我们遇到过好几次由于双端逻辑不一致,出现问题很难排查的情况。

    1.7K10

    Compose也能开发iOS了,快来体验~

    Android Studio创建一个KMM项目,如果你不知道如何创建一个KMM项目,可以参照之前的这篇文章KMM的初次尝试~ ,项目目录结构如下所示。...不过这是KMM的iOS项目,接下来我们看如何使用Compose编写iOS页面。...login() } 运行iOS程序,效果如下图所示: 嗯~,Compose 在iOS上UI几乎可以做到100%复用,还有不学习Compose的理由吗?...实现一个双端网络请求功能 在之前的第1弹和第2弹中,我们分别实现了在Desktop、和Web端的网络请求功能,现在我们对之前的功能在iOS上再次实现。...一个尴尬的问题 我一直认为存在一个比较尴尬的问题,那就是像上面实现一个完整的双端网络请求功能需要用到KMM + Compose-jb,但是KMM与Compose-jb并不是一个东西,但是用的时候呢基本上都是一起用

    1.4K30

    说说最近官方公布的 Kotlin 的动态

    项目刚开始,自然需要稳扎稳打,做一个功能就是一个功能,因此可以说 1.4 及以前的所有版本的迭代计划都是按照这个思路展开的,功能啥时候做好啥时候上,做不好就 delay。...KMM 运行在 iOS 上的实际上就是 Kotlin Native 的代码,通过 Kotlin MPP 与运行在 Android 上的 Kotlin Jvm 代码来共享逻辑。...最近随着 Kotlin 1.4 发布推出的 KMM 插件也支持了在 Android Studio 上直接运行 iOS 应用,启动 iOS 模拟器,甚至单步调试运行在 iOS 上的 Kotlin Native...不过,如果想要将 KMM 直接应用于移动端跨平台上上,还是有些问题需要解决的,这主要就是 Kotlin Native 对于 iOS 的支持的问题,例如: Kotlin Native 的并发模型比较严格,...也正是如此,Kotlin 协程的 Kotlin Native 版本迟迟没有正式推出多线程版本,在 iOS 上使用 Kotlin 协程目前还受制于所调用的 API 是否本身已经自己支持了异步以及回调的线程切换

    1.3K30

    Hello World —— 使用 Kotlin 开发跨平台应用

    原文作者:Aman Bansal 原文地址:Create Hello World App with KMM - Android & IOS 译者:秉心说 在移动开发领域,Android 和 iOS 版本的应用程序通常会有很多共同点...在写这篇博客的同时,KMM 仍然处于 Alpha,你可以开始尝试在你的应用中共享业务逻辑代码。 在移动开发领域,KMM 目前没有为大众所熟知。...但是,为了在 Android/iOS 上实现同样的逻辑,有时候你不得不写两份版本特定代码,例如蓝牙,Wifi 等等。为了处理这种情况,Kotlin 提供了 expect/actual 机制。...首先,在 common 模块中使用 expect 关键字声明一个空的类或函数,就像创建接口或者抽象类一样。然后,在所有的其他模块中编写平台特定代码来实现对应的类或函数,并用 actual 修饰。...甚至放飞一下自我,未来的某一天是不是可以用 Flutter 做 UI 上的通用,用 Kotlin 做业务逻辑上的通用? 不管怎样,最终还是得开发者买账才行。

    2.1K20

    开源|携程机票 App KMM 跨端 KV 存储库 MMKV-Kotlin

    MMKV-Kotlin 的总体设计见下图: 四、实现简介 在《携程机票 App KMM 跨端生产实践》(参考链接 1)一文的 2.2 小节中我们曾以 MMKV 作为 demo 来介绍 KMM 的...5.1 API 功能测试 Kotlin 提供了一套 kotlin-test 单元测试框架,可以在 common 与 iOS source set 中使用。...针对每种具体数据类型的测试都独立在 testXXX 函数内,针对正常写读、读空值以及读空值时默认值是否生效三种情况进行了测试。...另外三个是 iOS 构建产物,分别对应:iphone 真机(iosarm64)、M1 & M2 芯片的 Mac 上的 iOS 模拟器(iossimulatorarm64)、Intel 芯片的 Mac 上的...但目前实测,覆盖该属性后只有 multiplatform 与 iOS 的 artifact id 会发生改变,对 Android 无效(Gradle 7.2,Kotlin 1.6.10、1.6.21),

    1.8K20

    Kotlin开发框架建议入门实践

    开始之前推荐一篇实用的文章:uniapp 实现网络测速小功能 ,这篇网络测速文章详实且实用,提供了前端与后台的实现方法,值得一读,强烈推荐,讲解了网络测速的基本思路、测速界面设计与交互、代码实现:速度显示圆环等内容...以下是一个简单的示例,展示了如何在Kotlin中使用LiveData和ViewModel:class MyViewModel : ViewModel() { private val _data =...通过Kotlin Multiplatform Mobile(KMM),开发者可以在iOS和Android应用程序之间共享通用代码,并仅在必要时编写特定于平台的代码。...KMM注重业务逻辑的跨平台共享,这使得开发者可以更加高效地利用代码资源,减少重复工作。...以下是一个简单的KMM项目结构示例:my-app/├── androidApp/├── iosApp/└── shared/ ├── commonMain/ │ └── kotlin/

    25220

    开源 | 携程机票跨端 Kotlin DSL 数据库框架 SQLlin

    携程机票移动端团队在2021年介绍过 KMM 技术在机票产线的落地情况(参考链接 1),2022 年年中开源了团队首个 KMM 项目—— MMKV-Kotlin(参考链接 2),并撰文(参考链接 3)详述...例如,在 Android 开发中,我们有 Android Framework SQLite Java API,但是开发者们通常会在项目中使用 Jetpack Room 来操作数据库。...三、 基本设计与实现 3.1 架构设计与 module 划分 在一个项目开发之前,我们首先需要做的是将项目的基本功能理清,然后进行适当的 module 划分: 无论是 iOS 还是 Android,最底层调用的都是...在 iOS 端的实现上我们也碰到了一些问题,虽然 Kotlin/Native 与 C 语言的互操作很完善,但是也非常繁琐,比如我们在 Kotlin/Native 上做一次 open database 的操作...它不仅仅支持 iOS,还支持 macOS、tvOS、watchOS、Linux、Windows 等多个操作系统,抹平了包括线程锁在内的多端差异。

    1.7K40

    再探Kotlin 跨平台——迁移Paging分页库至KMM

    前言 KMM的发展除了靠官方社区的支持外,一些大企业的开源落地也尤为重要。从这些开源中我们需要借鉴他的设计思想和实现方式。从而在落地遇到问题时,寻得更多的解决办法。...如果之前项目已经使用了AndroiX的Paging库,则可以在Android平台上无缝迁移。...如果你之前从未使用过Paging库,可以参考许久之前我写的两篇相关文章: 在View中使用Paging3分页库 在Compose中使用分页库 接下来我们就以multiplatform-paging-samples...也就是github主页上的搜索功能。App运行截图如下所示。  这里我们搜索关键词为“MVI”,左侧输出为作者/项目名 右侧为start数量,且实现了分页功能。接着我们来看这个项目结构是怎么样的。...目前我们所能做的就是持续关注KMM的动态,探索可尝试落地的组件,为己所用。

    1.2K20

    C# 中的函数编程:实用部分

    让我们来看看今天就能在C#项目中使用的五种实用模式。 高阶函数 高阶函数可以接收其他函数作为参数或将函数作为结果返回。它们让你能够编写更灵活和可组合的代码,因为你可以像传递数据一样传递行为。...它的特别之处在于你可以对容器内的值进行链式操作,而无需直接处理容器。这种链式操作称为单子绑定。 你每天都在使用LINQ时都在使用单子绑定,只是可能不知道。它允许我们链式操作来转换数据。...不可变性 不可变对象在创建后不能被更改。相反,它们为每个更改创建新的实例。这个简单的约束消除了整类bug:竞态条件、意外修改和不一致状态。...: 默认线程安全 使无效状态变得不可能 保持数据和计算的一致性 使更改明确且可追踪 函数式编程不仅仅是关于写"更干净"的代码。...这些模式从根本上改变了你处理复杂性的方式: 将错误推送到编译时 — 在运行代码之前捕获问题 使无效状态变得不可能 — 不依赖文档或约定 使正确路径明显 — 当一切都是显式的,流程就很清晰 你可以逐步采用这些模式

    8300

    Donut多端框架小程序打包适配ios和安卓app

    适配过程展示组件、样式上微信大部分都适配了,没啥大的问题,目前就发现 css 里的网格 grid 布局在一些低版本手机上会显示异常。...,信任登录然后在电脑上输入手机上获取到的授权码就行了。...5、Build ipa failed:Sign the app fail:undefined跟上一个问题类似,用临时证书打包时可能会出现这个报错,先清除证书签名缓存,再输入正确的账号和密码。...(ID: xxx)用分发证书打包成功后,在 Transporter 里上传交付时报错,上面的报错提示证书文件无效,解决办法:核对证书和描述文件,确保受信任而且未过期打包时用的证书和描述文件,是否误用了开发证书和描述文件把本地已经在钥匙串里安装了的证书全部删掉.../ #elif IOS// #elif ANDROID// #endif// wxml 模板文件中使用<!

    94000

    iOS_Crash 异常类型

    内存访问类型 计数寄存器器包含导致内存访问异常指令的地址 无效内存读取:当代码取消引用无效指针时。计数寄存器与异常地址不同。...无效指令读取:当函数通过错误的函数指针或通过对意外对象的函数调用跳转到另一个函数时。寄存器与异常地址相同。...使用 beginBackgroundTask(withName:expirationHandler:) 请求在主线程上额外的后台执行时间。...SIGQUIT并不意味这进程崩溃了,但可能以可检测的方式出现了错误行为。 如果 iOS 和 iPadOS 键盘扩展加载时间过长,主应用程序会终止键盘扩展。...因为触发此异常的通信频繁发生,通常多个后台线程具有非常相似的回溯,指示线程通信的起源。

    2K20

    【移动开发趋势】2022 年移动应用程序开发的主要趋势

    以下是有关它们对移动应用解决方案影响的一些信息。 元宇宙 元宇宙的统治迫在眉睫?这是许多应用程序开发人员在 2022 年设计和开发时应该问自己和考虑的一个问题。...如今,遗留项目中的集成越来越多。新项目往往是用 SwiftUI 编写的。SwiftUI 是 Swift 的 UI 框架,它在去年获得了许多新功能,包括异步图像、扩展列表视图和支持拉取刷新。...AR 眼镜的传言已经有一段时间了,有迹象表明,当它们真正发布时,它们可以重新定义可穿戴和个人计算。到目前为止,智能眼镜在很大程度上未能引起人们的广泛关注,并且一度成为一个可笑的怪人。...Kotlin 多平台移动 (KMM) Kotlin Multiplatform Mobile (KMM) 技术允许您编写一次代码,然后在 iOS 或 Android 等多个平台上使用此代码。...此外,Flutter for web 的另一个好处是可以在某个时候将移动设备中使用的所有组件移植到 Web 上以供消费者使用。 随着品牌的成长,有一个扩大平台的潜在领域。

    2.9K20

    了解和分析iOS Crash

    有可能是因为线程在一个配置错误的函数指针的误导下尝试jump到一个无效地址。 在Intel处理器上,ud2操作码会导致一个EXC_BAD_INSTRUCTIONY异常,但是这个通常用来做调试用途。...iOS中,如果占用了太长时间,键盘扩展程序会随着宿主app被干掉。因此,这种情况的异常下不太可能会在Crash report中出现合理可读的异常代码。...因为发生这种异常的通信被触发的如此频繁,所以很多后台进程会出现彼此高度雷同的堆栈信息——恰恰暗示了它们是从哪儿来的。...一种常见原因是在主线程上做网络同步逻辑。不论Thread0上(也就是主线程)想做什么(重要的事),都应该转移到后台线程,或者换一种方式触发,这样它才不会阻塞主线程。...这个异常出现在加载app的storyboard时,需要响应的IBOutlet的对应元素丢失了。

    1.5K30
    领券