小米大咖讲述:从100到2亿+用户,MIUI的发展、创新故事

三节课 2017-10-10

编者按:本文作者是小米MIUI系统框架负责人董红光。 2010 年加入小米,一直在MIUI部门,见证了小米和MIUI一路走来的历程,这篇文章聊一聊MIUI的哪些事儿。

一、MIUI发展历程回顾

早期的 Android 系统非常难用,界面也很丑陋,与同时代的 iOS 差距非常明显,当时 Android 主要精力还是在完善系统本身,因此也基本没有考虑过中国人的本地化需求。所以在当时,做一款定制化的 Android 系统,易用、漂亮、更符合国人的需求,在用户侧还是有非常大呼声的。

MIUI 就是在这样的背景之下诞生的。

2010 年 8 月 16 日正式发布了第一个版本,当时找了 100 个内测用户,都是发烧友,率先将手机刷成 MIUI,深度使用、全方位吐槽、提各种意见建议。后来我们还拍了一部微电影,叫《100 个梦想的赞助商》,向最初的这部分发烧友和所有一直以来支持我们的米粉们表达敬意和感谢。

MIUI 的整个理念也是从那个时候就形成的,沿用至今,即“和用户做朋友”,真正去贴近和了解用户,从各个渠道倾听真实用户的看法。其中有一个很重要的渠道是 MIUI 论坛,论坛上都是发烧友,大家互相交流各种玩机经验,而 MIUI 甚至小米几乎所有人也都在论坛上,经常和发烧友们一起交流,解答问题,同时征询大家的各种看法。

比如,在做很多功能之前,我们都会去论坛上问大家的意见,根据收集回来的信息,再做方案上的调整。功能发出去之后,继续在论坛上收集大家的吐槽,然后再快速迭代改进。

这里就提到了 MIUI 的另一大特点——每周发版,以前称其为“橙色星期五”,这样做的好处在于:用户可以第一时间用到最新功能;如果不满意,马上吐槽,我们很快迭代方案,小步快跑,快速试错。

这样做得到了非常好的效果,所以那时大家说 MIUI 非常好用就不难理解了——因为 MIUI 的很多功能都是直接来自于真实的用户需求,而且根据用户的反馈修改无数遍,最终的效果自然会让更多的人满意。

回顾 MIUI 从 100 个用户发展到今天的 2 亿多用户,期间变化非常大,其中两个方面感触比较深:

一个是人数上的变化,最开始人很少,研发人员只有 20 个左右,后来总体人数逐步发展到 1000 多,这个影响很深远。一方面可以做更多的事情了,MIUI 在过去 8 年期间发布了 9 个大版本,几百个小版本,包含了无数的功能,很多以前没有足够精力做的事情,也一点点做起来和完善了。另一方面,可以把事情做得更好了,以前可能只能达到 80 分的,现在可以做到 95 分,甚至向 98 分 100 分努力,无论是功能细节,还是技术实现,以及性能、稳定性、功耗等等,每一点的提升,背后都是大量的人力投入。

另一个是模式上的细分,最开始 MIUI 面向的都是发烧友用户,都是很资深的玩家,动手能力强,对新功能很渴望,对 bug 容忍度高,所以快速试错、每周升级对所有用户都非常适合。但当用户规模已经是 2 亿以上时,对全部用户都这么做就不再适合了,功能也需要做更多的权衡。MIUI 在此做了很多事情,比如细分了体验版、开发版、稳定版,版本的发版频率和功能取舍都是针对相应的人群专门制定的,因此发烧友与普通用户才都能通过合适的版本满足自己的需求。

二、MIUI 的持续创新

MIUI非常注重创新,产品创新、技术创新等,在内部都是受到极大鼓励的,大家都勇于做各种层面的探索和尝试,最终也达到了比较好的效果。一方面推出了很多业界首创的功能和技术,另一方面,也使得很多已有的功能和技术变得更加好用。

这方面的例子很多,举两个我当时参与和负责的项目作为例子吧:

主题

电脑和前智能手机时代,主题换肤还是一个比较普遍的功能,但是到了 iOS 和 Android 上,这个功能弱化了,只支持更换壁纸和铃声等非常简单的个性化设置。但手机是私人物品,使用时间又长,用户需要更多彰显个性的能力。MIUI 应该是最早涉足 Android 系统级换肤能力的 ROM,当时有两个方面的创新:

一个是功能侧,MIUI 可定制项非常多,不仅支持壁纸、铃声、图标、字体等单项的更换,同时还支持系统应用和第三方应用的界面素材更换,另外还有百变锁屏、自由桌面等非常酷炫的功能,甚至还支持多套主题拆开混搭使用。

另一个是技术侧,MIUI 很早就开始深入研究 Android 的应用资源管理机制,在此基础之上率先做出了能更换所有应用资源的技术方案,后来很快又做到了更换主题后不需要重启手机,全部效果就都能生效的体验。而百变锁屏技术框架在当时的 Android 上也是十分先进的,可以让设计师很容易就写出酷炫的动画和交互,同时还能保证整个渲染的效率,以及很小的功耗代价,当时甚至还有人在百变锁屏上开发和运行小游戏。

MIUI SDK

MIUI 发展到今天,已经可以在非常多的 Android 版本和底层平台之上运行了,但这些背后,需要的是大量的移植和适配工作,不仅仅是 BSP 侧的工作,MIUI 对于 Android 的改动,也都需要做机型适配。随着 Android 版本和机型越来越多,如何能够做到快速适配,就变成一个急需解决的问题了。以前 MIUI 对于 Android framework 的改动,基本是通过直接改代码的形式实现的,这些都是移植成本。

为了降低这部分成本,我们提出了一个新的思路,将一部分代码剥离独立出来,形成一个 apk,叫做 MIUI SDK。

这个并没有什么特别的,但 MIUI SDK 还做了另一件事:很多改变 Android framework 的行为,不再需要直接改代码了,而是可以通过运行时动态 hook 的方式,将原始行为覆盖掉。

说到这里,可能很多 Android 玩家马上想到了 Xposed,最基本的原理的确比较类似,但是实际应用过程中会遇到很多问题。

一个最大的问题是:Android 从 5.0 开始,正式切换为 ART 虚拟机。以前的 dalvik 虚拟机做动态 hook 相对容易,方案也比较成熟,但是 ART 的原理完全不一样,因为使用了 AOT 的方式,在安装应用时直接编译成机器码,因此之前的技术方案完全不能使用。

Xposed 的思路是将 ART 虚拟机替换成一个修改过的版本,这样可以配合上层框架做些工作。但是这个思路对于 MIUI 来说不是好的选择,因为这实际上是将移植成本从 framework 转移到了 ART 侧。

MIUI 实际的做法是:通过对 ART 大量的调研工作,在 5.0 正式推出后很短的时间,就支持了动态 hook,这可能是第一个支持在 ART 上动态 hook 的技术方案,并且更关键的一点是,这套方案并没有修改 ART 相关的任何代码,最终和 dalvik 时做 hook 的效果基本一致。这套技术方案和相关的研究,不仅可以应用在机型移植和类 Xposed 的功能上,还可以应用在代码热修复、AOP 编程等很多领域。

相关推荐

轻舟已过万重山 / 0评论 2019-10-20