编译:核子可乐、燕珊 不久前,谷歌正式推出JetpackCompose1。0版本。近日,JetBrains在此基础上发布了ComposeMultiplatformAlpha版本,旨在将Compose扩展到桌面和Web端。 ComposeMultiplatform由ComposeforDesktop和ComposeforWeb组成,通过KotlinMultiplatform支持许多不同的平台。其中,ComposeDesktop采用Google的Skia图形库,来实现在Windows、macOS和Linux上的UI绘制,借此在所有支持的操作系统中提供统一的体验,类似于Flutter的做法。 根据Kotlin团队的说法,相比起Electron框架,ComposeMultiplatform在内存消耗、安装大小和UI渲染性能等方面将有更明显的优势。随着Alpha版本的发布,ComposeMultiplatform还收获了新的AndroidStudio插件,包括对在IDE中显示组件预览的支持以及许多附加功能。 我们希望通过本文帮助大家进一步了解Compose的跨平台能力,以及JetBrains将Compose从Android扩展到这些其他平台背后的主要驱动力是什么。基于JetpackCompose1。0 由谷歌打造的JetpackCompose是一款用于在Android应用程序之内构建用户界面的官方框架,上周刚刚发布1。0版本。与此同时,AndroidStudio代号极狐的首个稳定版2020。3。1也正式亮相。 尽管才刚迎来1。0,但谷歌表示目前PlayStore中已经有超过2000款应用程序在使用Compose更重要的是,就连PlayStore这款应用本身也在使用Compose。谷歌方面还表示,我们一直在与一些顶级应用的开发人员进行合作,他们的反馈和支持帮助我们使1。0版本更加强大。 Compose是一套声明式框架,其最大特色在于摆脱了传统Android方法中的层级结构,或者说布局与控制树。Compose用户界面通过编写带有Composable注释的函数(用于描述屏幕状态)来定义,也就是所谓函数生成用户界面。谷歌Android开发团队解释道,随着应用程序状态的变化,你的UI也会自动更新,这让快速构建UI变得更加简单。 JetpackComposeforAndroid迎来1。0版本 Compose基于Kotlin开发,而Kotlin与AndroidStudio(即官方指定的AndroidIDE)均来自开发工具厂商JetBrains。虽然JetpackCompose专为Android打造(与谷歌的Flutter框架不同),但JetBrains公司坚信Compose完全能够获得跨平台能力。ComposeforDesktop:这只是开始 ComposeMultiplatform可以说是该框架面向MacOS、Linux、Windows以及Web开设的一个端口,目前刚刚发布1。0Alpha版本。虽然尚处于早期开发阶段,但JetBrains表示,其已经为开发人员带来能够基本安全使用的稳定API。 TheRegister就此事询问了JetBrains公司Compose项目负责人NikolayIgotti,希望了解为什么该公司在拥有了已经广泛应用于IntelliJIDEAIDE及多种丰富变体的桌面应用程序跨平台Java框架之外,还要费力开发ComposeforDesktop。Igotti的回答是,旧有Java框架基本上就是修改版的Swing。Swing属于默认JDKUI框架,Swing和AWT(AbstractWindowsToolkit,抽象窗口工具包)。Compose则完全是另一码事,当然我们也在设计中考虑到了互操作性需求Swing这套框架太陈旧了,最早出现在上世纪九十年代末。多年来人们对于UI的设计思路已经天翻地覆,Swing显然满足不了要求了。 JetBrainsIDE中的ComposeforDesktop项目 Compose与Swing有一个比较大的共同点:与其他使用本机控件的跨平台框架,比如例如Java的SWT(StandardWidgetToolkit)以及微软的Xamarin有所不同,它们选择自主绘制控件。Compose使用的Skia开源图形库,也在谷歌Chrome、Flutter及其他众多框架当中得到广泛应用。那这是否意味着Compose应用程序将没有自己的原生外观?对此,Igotti的回应是,这取决于开发人员的选择,取决于他们如何为应用程序设置主题。在这方面,Compose的情况与Flutter等其他框架没什么区别。 那ComposeforDesktop应用程序是否依赖于JVM(JavaVirtualMachine)运行?Igotti表示,我们也知道,JVM应用程序的发布情况可能比较棘手。因此我们提供自己的Gradle插件,其使用jpackage与Jlink以JVM应用程序为基础制作原生应用程序。Mac的。dmg、Windows的MSI、Linux的deb包等均可实现,大家用不着担心JVM。 也就是说,开发成果将会是一款被精心包裹起来的JVM应用程序。JetBrains还有一款用于解决这个问题的KotlinNative编译器,预计将在未来发布,或者专门用于桌面开发。 对应用程序的另一种思考方式 那Web应用程序方面呢?Igotti回应称,我们使用KotlinJS编译器。Compose的Web版本不如桌面版先进,说明文档中也警告称API尚未最终确定,预计会发生重大变化。此外,虽然Web版本确实使用Compose模型,但API却完全不同,而且会使用HTML与CSS。所以,Web版与ComposeforDesktop之间能够共享的代码应该比较少。 据Igotti介绍,Compose代表着一种不同的应用程序思考方式。状态即UI的真实来源,而UI本身是无状态的,其表达永远由状态计算得出。在这方面,ComposeforWeb采用一组相同的原语,完全相同的状态管理思路。但是对于具体的小部件集合与排列方式,Web版与桌面版之间确实无法互通。 说到这里,为什么要把ComposeforAndroid扩展到多种其他平台之上?Compose的目标受众主要分为三类。首先是使用Kotlin与Compose的Android开发人员,他们希望把自己的开发成果交付至其他平台;其二是纯Kotlin开发人员,他们希望以‘一次编写、随处运行’的方式开发新的应用程序;第三则是那些不太熟悉Kotlin或者Compose,但又希望开发出精美UI的用户,我们希望能为他们提供实现目标的工具。 Igotti并没有给出具体的发布日期,但表示自己希望Beta版能在今年秋天发布,我们也希望能在今年之内推出1。0版本。项目本身是完全开源的,二十一世纪了,框架在大多数人们心目中就不应该收费。我们只是想开发一款长期缺失的软件,补足JetBrains当前商业模式中的工具链。 需要注意的是,Compose并不提供可视化设计器。Igotti提到,大多数开发者都不喜欢图形UI构建器,声明式UI与设计内容预览才是最受欢迎的解决思路。因此我们提供预览机制,您可以在composable函数上添加注释,并在无需运行应用程序的前提下快速预览。 JetBrains认为目前工具市场对于桌面应用程序开发者的支持并不到位,公司组织的内部开发者调查也在一定程度上证实了这个结论。桌面开发现在有点‘二等公民’的意思这可是个需要高度关注的小众市场。 那么,JetBrains会在自己的其他工具中使用Compose吗?事实上,他们的JetBrainsToolbox(用于管理已安装的IDE)已经在使用Compose,但Igotti表示短时间内Compose还无法取代IntelliJIDEA等现有框架。编辑器是其中最复杂也最重要的组件,经历了20年的发展演进,我们几乎不可能在中途进行重写了。无论是JetBrains还是我个人,都不打算强迫每个人都转而使用Compose。我们的目标是为原有框架选项满足不了的用户提供新的解决方案。写在最后 那么,为什么除了Flutter之外,我们还需要另一个跨平台框架?虽然谷歌的Flutter最开始主要面向移动设备,但现在也开始向桌面及iOS进军,甚至比Compose还抢先了一步。不过,根据StackOverflow的最新调查,Flutter使用的语言为D尽管Dart语言的人气正在增长(正是受到Flutter的推动),但仍然无法与Kotlin相提并论。 更重要的是,Compose的发展势头颇为强劲其GitHubrepo拿下5000多个星,上报问题的数量也非常多。虽然诸多问题代表着麻烦不断,但也恰恰说明了这是开发者们所热切关注的方向。 Compose代表着一种独特的UI构建方法,也许最期待Compose跨平台功能的受众,正是那些曾在Android上使用过它、又特别喜欢这种UI构建体验的开发者。 想要进一步了解Compose,大家可以通过私信我获取jetpack完全手册 在这里还分享一份由大佬亲自收录整理的Android学习PDF架构视频面试文档源码笔记,高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 这些都是我现在闲暇时还会反复翻阅的精品资料。里面对近几年的大厂面试高频知识点都有详细的讲解。相信可以有效地帮助大家掌握知识、理解原理,帮助大家在未来取得一份不错的答卷。 当然,你也可以拿去查漏补缺,提升自身的竞争力。 真心希望可以帮助到大家,Android路漫漫,共勉! 如果你有需要的话,只需私信我【进阶】即可获取