用新技术 “派生” 的旋律把耳朵叫醒

1,099 阅读7分钟

只有少数的应用能获得 “常驻主人手机后台” 这一殊荣,音乐便是其中一类。

不同于其他手机内存里的常客,音乐类应用更多的时候是在手机熄屏的状态下工作着。享受音乐,最理想的状态便是沉浸而不易中断,开发者们也在为此不断努力。

Shawn 是 QQ 音乐 Android 开发团队的一名开发工程师,他和同事们一直不断地在思考如何让用户获得更纯粹的音乐体验。

Android 9 发布后,Shawn 发现了更多的可能。

双轨并行 效率至上

Android 9 到来之前,最令 Shawn 头疼的一项工作便是为当时方兴未艾的各种刘海屏手机进行单独适配。

虽然音乐应用并不是主要 “靠脸吃饭”,但用户打开应用留下的第一印象确实十分重要,如果界面不够协调有瑕疵,很可能会产生 “劝退” 效果。

QQ 音乐适配刘海屏屏前后界面对比
在国内很多手机还在使用 Android 8 系统时,市面上已经陆续出现了一些刘海屏产品,各个手机厂商也有自己的刘海屏判断逻辑,这对于开发者来说很麻烦。为了让 QQ 音乐在这些手机上有良好的显示效果,Shawn 和同事们梳理出的逻辑是首先用代码判断手机是否为刘海屏,然后再根据其顶部显示空间对应用进行布局上的一些调整。

Android 9 收归了刘海屏的适配逻辑
令 Shawn 感到高兴的是,Android 9 中官方收归了该功能的适配逻辑,在手机厂商们按照 Google 官方的接口实现 Android 9 功能的前提下, 开发者可以使用官方提供的方式来直接适配刘海屏。

为此,Shawn 还撰写了文档在腾讯音乐技术团队的公众号与大家分享,希望更多的开发者能够规范地使用官方 API 提高工作效率。

目前,在国内还有很多手机没有升级到 Android 9 版本系统的情况下,QQ 音乐的 Android 团队在使用自己整合的 Android 8 各厂商刘海屏判断逻辑的同时,加上了 Android 9 官方的判断逻辑,这样就能保证灵活地为国内的 Android 用户服务。

满足个性化 工作 “不打扰”

如果说对刘海屏适配 API 的整合只是 Android 9 时代为开发者提供的一项基本保证,那么新版本中的通知栏优化则为开发者提供了更多提升用户体验的空间。

人们在使用音乐应用时,很多时候并不是经常在主界面进行操作,而是会在通知栏进行切歌等行为,这时候频繁与用户打交道的应用通知栏样式成了“颜值担当”。

QQ 音乐让用户可以根据喜好选择 QQ 音乐默认通知栏样式 (左) 或自定义跟随系统样式 (右)
在国内各类的第三方 Android 系统中,很多应用自身的视觉设计语言可能会和整体系统有所不协调。Shawn 表示,QQ 音乐在很早的版本已经支持了通知栏样式切换,让用户根据自己的实际喜好进行选择,目前默认使用的是 QQ 音乐自定义通知栏,这个在不同手机上的表现效果是一致的,或者用户可以将其修改成原生系统通知栏样式,这样的通知栏在不同手机上表现效果各异,整体上更加符合不同第三方 Android 系统的设计语言,这也是 QQ 音乐在为用户提供各种个性化选择上做出的努力。

而通知栏的 “面子” 变了,不容易看见的通知逻辑其实也在新版本中悄然发生了改变。

QQ 音乐 Android 团队成员在开会研讨
Android 9 中,开发者可以对应用内通知进行更加精细的分级管理,灵活运用这特性,可以帮助应用变得更加 “识分寸”,将对用户的干扰降到最低。

QQ 音乐的 Android 开发团队很早就使用了 Android 8 的 Notification Channel 功能,并在适配 Android 9 期间计划逐步将应用内的通知根据重要性进行了不同等级的区分,同时建立不同的通知渠道,比如最重要的是听歌的通知,其次是类似用户私信的通知,再次是一些活动的相关推送等信息,这些不同等级的内容都有独立的通知渠道,用户可以自定义地去设置是否播放声音和震动,而不是像过去一样简单粗暴地关掉所有通知,或者放任大量通知干扰自己。

做后台的小透明, 提供不间断的沉浸体验

通知频率不当会打扰到用户,但对于沉浸在音乐世界中的用户来说,更严重的打扰是突然中断——进程被系统杀死。

Android 版本的 QQ 音乐应用由两个进程组成,即播放进程和主进程,播放进程的占用内存要尽可能的小来降低被系统杀死的概率,所以很多业务逻辑都是在主进程完成,但是在某些后台管理策略激进的第三方 Android 系统中,应用的所有进程可能会被同时杀死。

团队成员的工位
针对上面提到的这种问题,QQ 音乐的团队想出了更加稳定的后台策略:在双进程的前提下尽可能减少播放进程对主进程的拉起频率,降低整体应用的系统内存资源占用,这样也能够减少被系统杀死的概率,绝大多数时候做个安静的 “小透明”,尽力提升用户体验,一切以用户价值为依归。

所以在适配 Android 9 的后台执行策略期间,QQ 音乐团队内部开了多次技术会议,提早将双进程的优化提上日程,投入更多精力对目前的双进程机制进行优化,在满足 Android 9 后台执行策略的基础上进一步降低主进程驻后台的时间,从而实现更少的整体内存占用,极力减少音乐播放时戛然而止的糟糕情况发生。

优化打磨产品,离不开趁手的工具链。

QQ 音乐的 Android 同事认为 Android Studio3.2 版本的 Memory profiler 功能十分好用
Shawn 和同事们很早就开始使用 Android Studio 作为自己的 IDE,一些同事甚至会经常体验 canary 版本的 Android Sutdio 来为这个工具贡献自己的一份努力。最新发布的 Android Sutdio 3.2 版本提供的 Memory profiler 内存工具也让他们赞不绝口,相比之前,最新的这个工具可以很直观地对 JNI 层内存分配进行实时监控,看到底层内存申请和释放的过程,对于内存优化功能帮助极大。

除了使用 Android Studio 之外,QQ 音乐新增的功能特性基本都使用的是 Kotlin 语言,Shawn 认为,从零开始开发一个模块的时候,使用 Kotlin 可以节省 25% 左右的开发时间,同时还能大大的减少空指针等异常。

工程师们用自己的智慧,把音乐应用调教成一位外冷内热的演奏家,它彬彬有礼地工作着,不动声色地奏响一曲又一曲或波澜壮阔或低吟浅唱的美妙音乐。

一行行代码随着编程的旋律在咏唱,正等待着有心的耳朵去聆听。

点击这里下载 “Android 9 Pie 开发者手册

Android 9 Pie 官方适配指南,确保应用完美兼容!