我不是“不诚实的”,因为这并不是人们希望我作为内容创作者推广KMP的方式
这张图片是使用人工智能图像生成程序创建的。
在继续之前我们需要澄清的事情
Kotlin多平台(KMP)支持跨多个平台的开发,包括Android、iOS、桌面端、Web和服务器端。尽管最常见的用例是针对Android和iOS,但创建一个仅关注Web和服务器而没有任何移动元素的KMP项目在技术上是可行的。因此,最适合KMP的IDE取决于具体的项目及其需求。
我首先专注于桌面端开发,然后将功能扩展到Android和iOS。对我来说,KMP的Web支持仍处于alpha阶段,使其更适合于临时性的玩具应用或演示,而不是生产项目,因为在生产项目中,额外的复杂性和兼容性问题可能会成为一个问题,所以目前我对它并不特别感兴趣。
需要注意的是,JetBrains拥有Kotlin多平台,而JetBrains和Google是独立的实体。尽管他们紧密合作开发Android Studio、Kotlin和Jetpack Compose,以服务于Android开发者,但他们独立运营。不难发现,我们经常错误地将错误和问题报告到错误的跟踪器上。
⚠️ 本文反映了我根据我的情况选择开发KMP应用的最佳IDE的观点。未来情况可能会发生变化,我们无法预测这些工具将如何演变。
Kotlin多平台的官方IDE是JetBrains的Fleet
虽然Android Studio通过额外的插件提供了一些与KMP的兼容性,但它是由Google Android维护的。另一方面,Fleet是由JetBrains从头开始开发的一个新IDE,它正式支持Kotlin多平台。
🤦🏻 我知道,由于我没有大加赞赏,有些人可能会认为我的观点“不诚实”,因为它们与KMP粉丝所期望的宣传语调不一致。
没有任何负面意图,Fleet似乎通过从头开始重新发明轮子。即使是IntelliJ IDEA插件也与Fleet不兼容。有经验的Android开发者可能会回忆起从Eclipse ADT迁移到Android Studio的最初挑战,这花了多年时间才成熟。我很好奇Fleet需要多长时间才能与其他现有的IDE选项相媲美。
我赞赏JetBrains的创新努力,但Fleet目前无法取代Android Studio和Xcode,而反过来则是可以的。Fleet的范围超出了代码编辑器,但Android Studio和Xcode多年来一直是不仅仅是代码编辑器。谷歌和苹果的专有平台工具让我想知道JetBrains计划如何使Fleet自给自足,并匹配开发者体验,尤其是作为一种付费产品。
当Fleet成熟时,我可能会重新考虑它。目前,由于它的局限性,我不会投入我的开发时间:
- 在Fleet上的开发体验与Android Studio或Xcode的实际使用不匹配。
- 对AGP(Android Gradle Plugin)支持有限。当Fleet尚未自给自足时,在项目中降级AGP以使用Fleet,而Android Studio可以无缝处理,这似乎没有必要。
IntelliJ IDEA插件与Fleet不兼容。Fleet的插件支持几乎不存在。
- 缺乏插件支持——Fleet与IntelliJ IDEA插件不兼容。例如,SQLDelight插件对许多人来说是必不可少的,还有其他协助格式化和命名参数的Kotlin插件。
IntelliJ IDEA插件与Fleet不兼容。Fleet的插件支持几乎不存在。
- Compose Desktop预览功能有限。即使让预览工作也可能是个问题。
- 不支持导入矢量绘图。多平台资源已经成熟,但Fleet仍然缺乏矢量绘图的转换和预览能力。
- Fleet无法独立处理完整的开发周期;在某个时刻仍然需要Android Studio和Xcode。在现有的IDE旁边运行另一个IDE似乎多余。
IntelliJ IDEA
我最初使用IntelliJ IDEA开发我的Compose Desktop应用,不知道Android Studio也可以处理。IntelliJ IDEA的一个优势是大多数Android Studio插件是兼容的。借助Compose多平台插件,我仍然可以开发UI,尽管布局预览能力有限。
对于不针对Android的项目,IntelliJ IDEA是可以的。没有与Android相关的附加组件,它更干净、更响应。然而,由于Android Studio本质上是IntelliJ IDEA的增强版本,如果我的KMP项目针对Android,那么使用IntelliJ IDEA对我来说就没有意义了。
此外,IntelliJ IDEA对最新AGP版本的支持也有限,这是JetBrains尚未解决的一个已知问题。
使用最新AGP版本的KMP项目在IntelliJ IDEA上无法构建。为什么要妥协呢?
Android Studio
一些开发者可能带着有限的Android经验进入Kotlin多平台的世界。然而,对于那些有丰富Android开发经验的人来说,放弃原生Android开发和Android Studio的好处似乎并不合理。对于针对Android的KMP项目来说,尤其如此,在这种情况下,妥协Android开发标准和实践是没有意义的。
Android Studio支持Kotlin多平台和Compose多平台插件。它可以处理KMP项目非Android部分的expect/actual声明,运行桌面(JVM)应用,并在不同目标上执行单元测试。我简要尝试过Web开发,从Android Studio启动Web应用是可行的。
数据库支持
SQLDelight插件在Android Studio上可以工作。对于Room多平台,我们仍然可以在Android目标上使用数据库检查器,尽管需要一些变通方法。
如果我们使用Room多平台,尽管需要一些变通方法,我们可以在Android Studio上检查数据库内容。
现有的Android开发工具
如果我们使用OkHttp作为Ktor客户端,我们可以像往常一样使用内置的网络检查器。即使在公共UI代码中使用JetBrains Compose而不是Jetpack Compose,布局检查器仍然可以使用。
Android Studio提供了商业级生产应用所需的所有必要工具,例如生成启动图标和创建基线配置文件。在导入和转换矢量图形时,Android Studio仍然是最好的IDE。
以老方法检查我的KMP-Android应用的网络流量
预览
在IntelliJ IDEA(通过Compose多平台插件)和Fleet中,Compose多平台预览仍然很基础。需要变通方法才能在CommonMain下预览Compose多平台可组合项。预览与Fleet和IntelliJ IDEA中可用的有限Compose桌面预览相同。
Android Studio用于桌面应用的一个限制是,从IDE运行桌面应用会阻止构建或刷新Compose桌面预览,直到桌面应用关闭。
💡 然而,通过在AndroidMain下定义预览来调用CommonMain中的可组合项,我们可以使用完整的Android功能集来生成预览。尽管存在一些与可组合项访问Compose多平台资源相关的错误,但这种变通方法超过了其他IDE所提供的。
没有理由妥协Android应用质量和开发者体验
即使在KMP项目中大部分代码是共享的,我们的Android应用仍然是一个原生Android应用。仅仅因为Kotlin多平台,就降低Android开发标准和实践是不合逻辑的。
…以及用于iOS的Xcode
对于iOS目标,理由与Android Studio类似。我使用Xcode,它提供了构建和交付原生iOS应用所需的一切。共享的KMP代码是使用Gradle编译的,即使没有大量使用iOS原生功能,Xcode仍然足以满足我的需求。仅保留Android Studio和Xcode就足以交付移动和桌面应用,节省MacBook Pro的内存和磁盘空间。
结论
尽管这篇文章可能会因为既得利益而让一些人感到不安,但我必须强调,特别是对于Kotlin多平台,亲自尝试它以看看它对你是否有效至关重要。没有大量的实践经验就赞美或批评KMP并不能反映其实际用例。
🙋♂️ 如果Fleet满足你的开发需求,我鼓励你支持JetBrains。对我来说行不通的东西,对你来说可能很理想,所以试试吧!
我注意到一些知名人士受到我的作品的启发,为他们的YouTube频道创建了类似的KMP内容。如果你觉得这篇文章像他们一样令人鼓舞,请考虑尽可能多地在下面鼓掌。谢谢!