黑鲨的这个赛季

前言

2016年5月20日,我正式从老东家MStar离开,怀揣着搞万物互联的想法在5月31日加入了黑鲨的前身,众思科技,开始了为期6年6个月的新赛季。

2016-Zeusis万物互联梦碎

最初接触到Zeusis团队是在2016年2月份,当时整个上海似乎只有70人左右,办公室也是刚装修完毕。彼时我在MStar已经是从事非Android工作,偶尔有一些交集,对Android的理解还是停留在2013年4.0的阶段,整个技术栈也是比较杂的,在公司也是属于公司要做啥就去做啥的角色,往好听的地方说是技术全面,从底层到上层,从linux到ecos都做过;另外一方面,别人会认为就是啥都不精;整个面试过程更倾向于是“你问我答”的知识竞赛,对着履历的工作讲问题说细节谈思路,当时说了啥已经记不得了,最重要的一点是跟面试官达成了共识:“XXX小区是个好小区,希望以后可以买进去”,有共同的目标可能应该是一个面试加分项。

等到5月底入职的时候才发现已经扩张到了500人,然后已经开始明确表示做手机了,“为了证明团队的实力”。这个时候说实话有一点点后悔,觉得手机没有太大的可玩性了,红海的市场太卷了,“来都来了”。

zeusis

业务一:用Android.mk替代gradle

放在现在很难想象居然会有这样的需求,但在2016年确实就是这样。

  • 对于ROM来说希望App是可以直接集成在ROM中进行源码编译
  • 部分App是需要用到@hide接口,但对于纯App的开发者来说,弄一个compile的jar包不方便
  • 使用Android Studio开发更方便

然后我开始系统学习aapt,javac,aidl的编译命令和工具链,开始面向App开发者的编程工作。整个过程持续了2周,最终是帮助Launcher和SystemUI完成了整合(可以由Android Studio直接编译,也可以在AOSP中集成编译)。

后来在JOYUI的开发中,直接采用apk集成的方式,所以此类方案就不没有必要推广了。

业务二:双开/沙箱

这个业务是一个比较有挑战的任务,2016年的时候双开的应用还是比较广的,当时的解决方案有两种,一种多账户,另外一种是hook。多账户方案实际是通过不同uid来做,但系统成本比较高,而且对Framework的修改也会更多,未来在做ROM升级的时候会比较麻烦。hook的方案实际是把Framework的改动都搬到了App中,对Framework干扰比较小,但是整体的App开发复杂度就比较高。

当时市面上hook方案还有几个选择,如360的DroidPlugin,Loddy的VirtualApp,那段时候Loddy的高中生写代码话题正热,吸引了不少人的眼球,我也是其中之一,所以整体方案就偏向于看看“新”的VirtualApp,在整个过程中也写了不少的学习文章,在QQ群也认识了不少人,顺便还搭建了自己的blog,开始了随缘更新的过程。

为什么说这个项目很有意义呢,是因为VirtualApp实际是hook了整个SystemServer,把整个SystemServer中的Service们全部hook了一下,包括占位用的Client-Server机制都是完全照搬了SystemServer的那一套,通过阅读这一套代码帮助我非常快速的跟上了Android 4.0 -> Android 7.0的变化,也加深了对SystemServer的理解,特别是AMS,WMS,PMS这三个部分。

在VirtualApp启动占位App时,大部分问题都是启动不了,或者是启动到了不同的Task,或者是某个权限被拦;再或者就是显示不正确,窗口大小不同;沙盒内的App uid,gid不对,导致数据无法访问等,这些问题最终都会回到AMS,WMS,PMS他们三个里面去。

通过这一部分的学习,算是深刻理解了反射/代理/hook的用法,对2018年开始做App解耦,模块划分有了很大的帮助。

业务三:多窗口-分屏浮屏

在VirtualApp的学习过程中熟悉了WMS的原理,正好在Android N上又出现了分屏的功能,公司打算在这一块大搞特搞,所以我就成为了公司内少数熟悉“WMS”的几个人,接手开始做分屏和浮屏的事情。这个业务与其说是考验技术,还不如说是考验逻辑,因为分屏和浮屏在Android Framework中本身就有了部分实现,对应了dock和pinned stack,但是整个交互的闭环是需要我们自己去构建的。Google给出的原生交互“比较粗暴”,而Activity/Task的启动又是组合多多,大部分时候我们都会陷入“这个情况下,退出分屏以后要怎么显示,以及是否可以全屏和分屏应用并存;如果分屏情况下,跳转的应用是全屏,而它又不支持分屏显示”这样一类查缺补漏的环节里去。

很可惜当时没有拍照,我们的GUI交互Oliver画出了一个巨庞大的XMind,然后成为了开发,交互,测试的参考系,当出现问题的时候大家都要站过去来一次思想实验。

现在看来,当时的我们太过于纠结逻辑闭环,而Google开发团队应该也是发现了分屏的逻辑复杂性,所以非常粗暴的一刀切了。

好处是什么呢,是真的掌握了AMS,WMS,为后面2019做游戏小窗打下了良好的基础。

image-20221208094239839

2017-挣扎和重生

由于一些外部的原因,Zeusis的ODM之路也不是太顺,团队的规模在年中从1000人直接缩到了200人,这一年Alpha GO的出现也掀起了一股人工智能的热潮,大家都想着用AI来改变一切,我的业务也是这样。

业务一:负一屏的资讯未来

在MStar的时候从来没有考虑过流量变现的问题,在这边才知道负一屏是可以成为现金流的,参考了不少竞品才发现负一屏的潜力多多。跟产品经理大亮也做了好多次的沟通,最终是敲定了智慧助理这样的一个方向。

期间还对接了几个供应商,有生活推荐类的,到站提醒的,周边音乐在听等等的,现在看来“貌似别人都做好了”的需求,那时候自己的理解还不够到位,只是觉得“这些想法真不错”,现在再看大亮,在那个时候是很有想法和远见的。

参考了乐见的方案,负一屏的软件设计采用了Plugin的形式,VirtualApp的技术栈正好可以复用,整个Demo也很快落地了;带着更大的愿景,我们还去接触了腾讯的浏览器团队,希望可以对接浏览器的部分瀑布流,也就是这个契机,在腾讯的大族办公室,我和neo翻新了一下架构,诞生了I19tService的雏形。

image-20221208095609967

考虑到未来肯定会有更加多的应用要来接入我们的资讯,所以是以系统服务的角色来运行的(后来才知道,这个可以叫”中台“),然后我把VirtualApp中借鉴SystemServer的部分也搬了过来,I19tService也成为了一个小型的SystemServer,对外提供各种Service来完成各种业务。

业务二:毛绒玩具自己给自己发工资

2017下半年由于外部因素,进行了一波大裁员,直接从1000人的规模缩减到了200人,为了保留团队大家不得不开始接私活,我和花老板的小分队开始做一款毛绒玩具,大致的人员为4个人,金主要求手机端IOS和Android都有,最好还要微信小程序,硬件用的是乐鑫的方案。这个时候开始学习了ReactNative,开始了为期两个月的毛绒玩具之旅,然后在7月底结束,一共收到了1万5,很是开心。

业务三:危机中的自我提升-Udacity

AI的浪潮是大势所趋了,在做毛绒玩具的间隙我也觉得是时候学习一下AI的技术栈了,但总是盲目学习也不是一个办法,在多方比较以后最终决定在Udacity上报一个班,于是在7月底就开始了”地狱式“修炼,白天在公司恶补数学基础知识,看Andrew Ng的课程,晚上就在家赶Udacity的项目和课程,除了睡觉吃饭之外就全身心投入到学习里,现在回过头来看,这一段的学习经历非常难得,也很佩服自己就这样坚持下来了,不能说掌握了多少,但对于做项目是不害怕的了。

udacity

业务四:从亮一个灯开始的AI

在Udacity和AI的课程学习中,新的公司黑鲨科技成立了,正式确立了游戏手机的方向。当时最热门的游戏是王者荣耀,我们的产品经理提出了这样的一个想法”能否在击杀完成的时候亮一个灯?”,彼时在程序员圈子里最热议的话题是“平安的产品经理因为要求开发根据用户的手机壳颜色来显示主页颜色被暴打”,就这样,我开始了新的预研。

最初的其实就是想用AI来做,因为所有AI/CNN的入门就是MINST手写数字的识别,击杀嘛,也是数字的一种;为了保险起见,我也顺便给出了3个方案:因为是做系统出身的,所以直接提出了监听文件操作的的想法,当播放声音文件xx的时候肯定就有击杀了(当然这个方案有很多问题);或者找到王者荣耀工作室合作,直接给出API接口。

显然,这里面最靠谱的是AI方案,看起来最好做的是监听方案,最不可能是合作方案(小厂 vs 大工作室)。于是很自然的我就开始了AI的预研,差不多在8月底就完成了第一版的demo,使用的是5层CNN网络+Tensorflow,图片来源是录屏转bitmap,除了功耗感人(+400mA),识别率低(10%),延迟严重(300+ms)之外,并没有其他问题,大家一致表示这个东西可以搞啊。

然后用了差不多2个多月,挨个解决了上面的问题:

  • 功耗高,主要是高在录屏上,所以就使用了截屏读framebuffer的方案
  • 识别率低,主要是模型的问题,移植&复现了google的街景门牌识别模型

  • 延迟严重,主要是跑在cpu上的问题,正好高通推出了SNPE的方案,我们有幸成为了第一个小白鼠

最终的结果是功耗增加30mA,识别率可以达到80%,延迟在20ms,期间的数据收集是用10+杯星巴克找测试伙伴PY交易帮忙的,而其他的部分都是自己和benjamin一行一行码出来的,于是我们就这样一战立名了。

由于已经可以识别到比分,我们顺便把游戏内的各个状态也一并识别了,再顺便发现我们的手机不支持开启“王者时刻“(小道消息称开启需要2000万),我们干脆就做了自己的”黑鲨时刻“,再再顺便一样都录制了,就做了一个”手动回录“(2021年王者荣耀官方也上线了这个功能),所有的这一切差不多在2017年12月前就绪了。

2018-收获,一切向好

这一年最重要的是黑鲨1发布了,说明了我们的公司有自己的产品了,而且卖的也还不错,I19tService的部分也在稳步推进中。benjamin也开始着手研究语音识别的相关内容,这一年是满满收获的一年:

  • 扩展了游戏的品类,增加和平精英,非人学园,顺便优化了原本的架构
  • 借助黑鲨时刻,完成了I19tService的能力外化,开始对外提供SDK
  • 工程化了GAN网络,用来做数据增广,还落地了几个专利
  • 语音识别的预研也开始了,尝试了多种方案感觉都有可落地性

blackshark1

2019-停下来的脚步

这一年在《2019年-年度小结》中大致写了,最主要的一个改变是正式成立了“猪队友实验室“这样一个组织,老板许诺这是一个”临时的,非实体“的组织,以减轻我对于带团队这样一类行为的抵触感(主要是觉得浪费了自己的时间,分散了精力,而我自己也没有那个”上进心“)。这一年的大部分收获不在于技术本身,而在于技术之外。主要有以下几点:

  • I19tService架构已经成熟,更多的是对外兜售能力
  • 模拟器的胜败存活不在技术本身,而在市场对灰色业务的监管
  • 小爱同学的源码不可知,debug主要靠日志和沟通求助
  • 投屏的需求做不下去,人不可能什么都会,精力有限

当我跳出技术圈之后,会发现一个事情/业务的推进并不是纯技术本身,而是要考虑一些其他的因素,最简单的就是利益交换,别人为什么要用你的东西,你的东西可以给别人带来什么好处,这个才是可以说服别人的理由。

比如在这一年推动的App独立发布流程,除了组内的少数App,大部分团队都没有办法实行下去,有部分是开发者的原因,比如无法理解这样做的意图,需要重新调整架构带入工作量;项目只有4个,还没有太复杂,分支自己尚可以挨个pick来应付。更大的责任是在于自己,没有办法站在”这样做可以让你xxx省力“的角度去宣导它,而是不断强调”这样会更好“。

有的人因为相信才看见,有的人因为看见才相信。

每个人的经历不同,角度也会不同,没有对错。

2020-积累的爆发

业务一:智能魔方

在没完没了的开关,优化,我觉得玩家XXX,各类不断的刺激之下,在3月的一个凌晨写了一个插件化的ppt:

addons

自认为自己作为一个真实的玩家,公司各类提问题的云玩家都是SB,铂金段位指导王者都可以滚出了,然后非常中二+热血的在最后添加了这么一页:

2022-12-08_11-15-30

写完之后就是早晨了,直接进公司开启了一天的PPT宣讲,事后大家告诉我,当时大家其实都没听明白,但是我讲的非常激情四射,大家都被我感动了所以也都很激动,而已。

接着就是ToyBox的上线,插件项目正式启动,I19tService中的AI能力正式出街,黑鲨手机又多了一个卖点。

业务二:发布会

可能是因为ToyBox的激情演说,老板推荐我去了黑鲨3S的发布会,准备期间看了一加刘老板的所有发布会视频,也看了竞品对手7月的发布会们,整个试讲正式流程应该有10+次,加上自己的排练应该是超过30次的了,真的是形成了肌肉记忆,筹备的地方在北京,最后录制是回到了上海,隔天彩排的舞台讲了4次,最后一次11点半开讲,结果到了第二part直接断片,大家都很担心我第二天正式录制的状态。

录制的当天我喝掉了4瓶红牛,时刻保证自己处于一个亢奋的状态,最后的结果也比较好,罗老板和腾讯合作方的大佬一次过,我的状态也不错,整个录制一气呵成完美收工。不过自己还是觉得非常”羞耻“,感觉还是非常生硬,一点都不像自己的风格,喜提产品经理体验卡一天。

2022-12-21_17-29-26

站在台上讲到JOYUI的时候还是很有感触的,觉得伙伴们这么多年的努力还是很有东西的,触控,压感,AI,黑鲨时刻,主播投屏,反向控制,弹幕消息,语音操控,功耗性能优化,dock,小窗,宏,不知不觉我们已经做了很多,走了很远,是时候让软件露一下脸了吧。

2021-收拾再出发

猪队友实验室的人数不断壮大,虚拟组变成实体是一个既成事实的事情了,略感无奈和好笑。随着队伍的壮大,发现组内沟通和学习资料的传承是一个迫在眉睫的事情了,所以这一年的重心就放在了团队建设和人员培养上。

  • I19tService知识图谱建立,尝试交出去
  • 模型训练和训练脚本的归档,尝试自动化
  • wiki新人应知应会
  • 带着大家一起读书

虽然看起来没有什么新的重量级业务,但我们在生产效率上的提升是很大的,这部分都写在了《2021-年终述职报告》中。另外一个很大的收获是,说多少都不如直接做,先前一直会号召大家多看看书,但实际效果甚微,于是决定建立一个学习兴趣小组,从周志华的《机器学习》西瓜书开始,每周以章节的形式来做读书交流活动,持续了2个月,虽然期间很多问题自己也不是太了解,但跌跌撞撞带着大家完成了整个学习,不管懂不懂,至少大家都看了。我信心满满的觉得2022,猪队友实验室可以大干一场了。

2022-修罗场,诸神黄昏

2022的开篇即是高光时刻,大约在2月份收到密令需要转型做VR方向了,我的任务是去完成OpenXR SDK,所以整个上半年都在Spec和Monado的代码中反复横跳,借着疫情封闭的关系,在家里闭关修炼,效率很高,工时也很长,效果很不错,基本是完成了对OpenXR的一个完整认知,对于VR是什么有了大概的理解。

封闭完成以后进到公司,就开始了一级MDE的工作,一样的,起初是非常反感的,因为不必要的会议又增加了,老板的说辞也很直接,觉得过去2年猪队友实验室的小作坊模式挺好的,大家的提升也很大,希望可以推广一下,把ROM的整体硬实力提高一个档次,到2025年左右可以有一支更NB的软件团队。

但实际操作中困难重重,每个人都会有着或多或少不同的任务和侧重点,加上MDE本身就是一个(没有任何直接好处)的岗位,大家的积极性不是那么高,有些伙伴甚至也不理解(怪我没有宣导好)MDE到底要做什么,只是依葫芦画瓢般硬做而已,所以折扣打的就不是一星半点了,期间的反思也写在了《2022-年终述职报告》

高歌猛进的过程在10.1前开始的大裁员戛然而止,公司的业务不断调整,重心也不断切换,人心惶惶谣言四起,然后我就开始了一段整理归档和读书的经历《2022-读书笔记》,继续健身,然后再2022-11月30日这一天从黑鲨登出。

blackshark2

后记

在黑鲨的六年每年都会有一些事情发生,以至于一直担心它会随时倒闭,从另外一个侧面也说明做一个公司实在不容易,每一步都走的还可以,也就只能是这样,而只要走错一步就是GG的节奏了。

在黑鲨遇到了很多有趣的伙伴,也见识了一些技术之外的东西,产品,商业,思考,包括如何沟通,控制情绪,也是一些很大的收获;快乐的健身房,骑行活动。

一群人在一个地方做一个事,我觉得最重要的是一群人