2013年,我买了一台Ubuntu手机。不是为了打电话——是为了那个演示画面:手机插上线,屏幕亮起,变成一台完整桌面。同一台设备,同一套应用,没有第二套系统。我想让这东西成真。
那年我二十岁。我没只买一台手机,而是开始给代工厂发邮件,要数据手册、要参考设备,半真半假地觉得自己能移植一个融合桌面,然后拿去卖。结果我学到的是一堂硬核课:手机硬件为什么长成这样。
![]()
Halium让我在手头几台设备上活了下来,但大部分时间我在跟不透明二进制固件搏斗,跟冻结在一年没人碰过的分支上的厂商内核搏斗,跟"技术上礼貌、实际上缺席"的OEM支持搏斗。硬件最终失控,我想做的优化根本落不了地,计划死在那里——但那也是我学到最多东西的时期,关于应用层之下的一切究竟怎么运转。
那个梦本身也没好到哪去。Ubuntu Phone的底座在我那台硬件上卡得要命,应用支持稀薄,整套东西像一场市场还没准备好押注的赌局。几年后Canonical砍掉了Ubuntu Touch。UBports让它活着。Lomiri继承了融合野心,社区却更小。我一直没停止关注。
十三年了。
"融合"这个词被营销PPT磨平了
大多数人听到它,想到的是应用的响应式设计。那不是有趣的部分。有趣的部分是桌面环境——画底座、状态栏、窗口装饰、锁屏的那个东西。桌面环境是计算与你的手相遇的地方。
今天的Linux,每个桌面环境都被锁死在一种形态上。Plasma假设你在用桌面。Plasma Mobile假设你在用手机。GNOME假设你在用笔记本。Phosh假设你在用手机。它们各自把分内事做好,但切换形态意味着切换会话,有时候切换发行版。
我从那台Ubuntu Phone开始就想要的是:一个桌面环境,知道自己在什么硬件上跑,然后悄悄重组自己。插上显示器:底座在底边,边缘平铺,系统托盘。拔掉线:同样的进程,同样的通知,为拇指重新排布。
这几年我试过从头写这个。每次写到一定程度,意识到自己要重新发明多少轮子,就停了。
Plasma Mobile已经把难的部分做完了
它是一个Plasma桌面环境,用QML写在kwin之上——跟Plasma桌面用的是同一个合成器。它正确地讲Wayland。它有操作抽屉、主屏、状态栏、管理窗口的KWin脚本。手机端是扎实的。
它缺的是桌面端。所以我fork了它。
SHIFT是plasma-mobile在KDE Plasma 6分支上的一个fork。如果你用SHIFT启动一台手机,它表现得跟Plasma Mobile一样——上游的手机UI原封不动。这个fork加了一个融合模式,一层叠加,通过plasmamobileshellrc里的一个键切换。
拔掉显示器:你在用Plasma Mobile。插上显示器:你在用Plasma桌面。同一套进程,同一套通知,同一套应用状态。没有会话切换,没有发行版跳转。
这不是响应式设计。这是同一个shell,两套布局,根据硬件上下文自动切换。
为什么是现在,为什么是我
十三年前那个二十岁的人,现在有了足够的底层知识,知道哪些坑是真的,哪些坑是厂商故意挖的。Plasma Mobile的架构让我不用重新发明合成器、不用重新发明Wayland协议、不用重新发明窗口管理。我只需要补上桌面布局那一层。
KDE Plasma 6的迁移是个窗口期。上游在重构,社区在适应,这是切入的最佳时机。我选了fork而不是从头写,是因为我再也不想证明"我可以重写kwin"——我只想证明"这个体验可以存在"。
SHIFT的代码结构很直白:手机布局是基线,桌面布局是条件分支。检测显示器热插拔,切换配置,重载shell。QML的声明式特性让这种动态重组比想象中干净。KWin的脚本系统让我能复用桌面端的窗口管理逻辑,而不是自己写一套平铺算法。
最难的部分不是技术,是决策:哪些桌面功能要带进手机上下文,哪些手机功能要保留在桌面上下文。通知中心在两种模式下都要存在,但交互方式不同。应用抽屉在手机上从底边上滑,在桌面上从左上角点开。这些不是技术问题,是产品设计问题——而我花了十三年思考它们。
这个fork的边界在哪里
SHIFT不碰Plasma Mobile的核心代码。手机体验跟上游保持一致,这意味着我能直接拉取安全更新和功能改进,不用维护一个越来越大的补丁栈。融合模式是叠加层,不是替换层。
桌面端的功能范围我有意收得很窄:底座、系统托盘、边缘平铺、窗口装饰。不搞小部件桌面,不搞复杂面板配置,不搞Plasma桌面的全部自定义能力。目标是"能干活",不是"能替代"。
这种克制是教训换来的。当年Ubuntu Phone的底座为什么卡?因为Canonical想在一台2013年的手机上跑完整的桌面合成管线。SHIFT的做法是:桌面模式用同样的kwin,但布局逻辑简化,动画降级,优先保证响应而不是炫技。
应用生态的问题我没法解决。Linux桌面应用对手机触屏的适配仍然稀烂,手机应用对桌面键鼠的适配几乎不存在。SHIFT不魔术般地修复这个,它只是让同一台设备上的同一套应用,在两个形态下都能被启动和操作。至于应用本身好不好用,那是另一个十三年的战争。
十三年教给我的事
第一,硬件厂商的"开放"是有保质期的。 datasheets和参考设备在发布前六个月最有价值,之后支持曲线断崖下跌。如果你想做底层移植,窗口期很短,动作要快。
第二,社区fork比公司项目活得久。Canonical能砍Ubuntu Touch,但UBports能接着跑。Lomiri能继承遗产。我现在做的SHIFT,如果哪天我跑不动了,代码结构足够清晰,别人能接。这是有意设计的。
第三,"融合"的真正敌人不是技术复杂度,是形态惯性。用户习惯了手机是一套交互、电脑是另一套,开发者习惯了为两种形态写两套UI,发行版习惯了维护两条产品线。打破这个需要的不只是能用的代码,是一个能说服人"这样也行"的完整体验。
SHIFT目前的状态:能启动,能切换,能跑日常应用。我在自己的设备上日用,修边边角角的bug。代码在公开仓库,但还没到喊人来试用的程度——Wayland的显示器热插拔在部分驱动上仍然 flaky,KWin的某些脚本在手机分辨率下会溢出,这些需要逐案处理。
我不打算写一份路线图。十三年前我写过,然后学会了路线图是写给投资人的,不是写给代码的。现在我只做下一步:让桌面模式下的多显示器支持更稳,让手机模式下的手势跟上游保持一致,让切换过程不要闪黑屏。
如果这些东西都到位了,也许会有第三个人用。那比我当年写信给代工厂的现实感,已经强太多了。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.