一场“技术冷暴力”的公开课:美团如何远程射杀饿了么、大众点评及淘点点等外卖APP
外卖O2O战火一直未停息,去年是美团外卖与饿了么线下地推人员的掐架。上周,又爆出美团与大众点评地推间的斗殴。商业战争斗智斗勇,体肤格斗外,我们看不见的是背后的“技术冷暴力”。就以外卖O2O为例,美团外卖给大家上了一堂公开课。
据 极客头条 报道,昨日(6月18日)下午,一位程序员小伙伴在知乎上发了一则帖子技术揭幕贴,题目也是广为人知的知乎体 《如何评价美团外卖强杀竞争对手的 App 进程?》 。
该程序员在反编译完美团外卖商家Android版后,发现其中有一个杀死后台运行进程的权限,通过Android开发者官方文档,他随之找到了killBackgroundProcesses(String packageName)的调用处, 发现美团的Android程序员直接用Hardcode写死了四款App的包名——饿了么商家版、点评商家版、淘点点商家版、百度外卖商家版。
这位举报者指出,美团调用killBackgroundProcesses(String packageName)方法的类名是FriendUtil,最后他表示美团大胆地用Hardcode封杀的行为,实在有点过了。
反编译美团APP的大致过程
1. 一开始是这样的,在反编译完美团外卖商家Android版后,我发现其中有一个杀死后台运行进程的权限:
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>
Android开发者官方文档描述如下:
Have the system immediately kill all background processes associated with the given package. This is the same as the kernel killing those processes to reclaim memory; the system will take care of restarting these processes in the future as needed.You must hold the permission KILL_BACKGROUND_PROCESSES to be able to call this method.
2. 看到这个权限后,第一感觉应该是美团为了保证自己App可以流畅运行而杀死后台长时间不运行的App,凭借着职业的敏感继续跟进,终于找到killBackgroundProcesses(String packageName)的调用处:
3. 从调用处看,美团并未使用很高深的技术来判断后台运行进程来选择杀死长期不运行的App,而是直接用Hardcode写死了四款App的包名,细心读了读包名,结果让我震惊。
这些熟悉的名字,每个都是美团的竞对。原来美团并不是为了让自己App运行更流畅而杀死别的App,而是直接封杀竞对的App。
4. 从上图看,调用killBackgroundProcesses(String packageName)方法的类名是FriendUtil,也就是美团字面上称竞对是朋友,然后背后捅一刀子。
美团的回应
美团公司的副总王慧文(外卖事业部负责人)在当晚9点多给出了详细的调查结果:
这段代码是在 2014 年7 月 10 日提交的,当时我们在做蓝牙打印机的 MVP (可以理解为实验)版本,我们的一个工程师发在部分Android系统上 APP 在连接蓝牙打印机的时候,如果打印机已经被其他 APP 占用端口,则需要重启打印机;由于各同行商家端 APP 后台自动唤醒程序,用这种方法能减少商家操作,也不会给同行业务带来实质上的损害。
随后,王慧文表示美团将发布“全量发版更新掉了这段代码”,并做了道歉。另外代码的编写者(已离开美团,前员工也能很快找到并回应,看人家这执行力)也给出了自己的说明,并道歉。
知乎上很多讨论来自“杀与被杀”当事双方,都有些意气用事,多数都没什么价值。但其中董涵的回答中,建议这种情况下,可以“使用断开后重连的方式来强制再次连接……毕竟你们使用的蓝牙打印机应该是不同的,可以判断出是否是自己应用连接上。实在不行,可以先disable后再enable。”
十三郎还给出了代码:
BluetoothAdapter.getDefaultAdapter().enable(); BluetoothAdapter.getDefaultAdapter().disable();
对此,代码编写者回复:
商家那块一般只会放一台蓝牙打印机,所以当一个app连接上的时候,另外一个app必然不能连接
关于断开蓝牙重连的思路,这个早就尝试过,但是没有效果,原因据我猜测,同行的app监听的蓝牙广播,并且后台自启动,所以即使我们应用在前台,只要他们应用在后台运行着,蓝牙端口也会被抢先占用,所以才考虑kill后台进程的方案
饿了么的产品经理sacho则从产品角度提出了一种解决方案:
针对你说的蓝牙端口被其他 app 占用无法连接的问题,饿了么的产品经理会给出如下解决方案:弹窗提醒用户问题所在,请用户选择是否强行关闭其他 app。
不管是有意还是无意,偶然性的针对同行对手,背后折射的是商竞争中的技术冷暴力,这也给互联网技术型创业公司上了一堂公开。