认识的朋友越来越多去了互联网公司工作,并且看起来互联网公司对做过手机设备的系统工程师比较青睐。其实我对互联网做APP公司招聘编译器大概OS的人,觉得有些奇怪。从技术上简单讨论一下,互联网做APP质量提升的工程师需要的技术栈跟手机厂商做基础软件质量(稳定性/性能/功耗)差异是什么。
站在APP角度来说,应用运行在一个非常受限的沙箱环境,包括权限、使用内存、可以调用的接口都是被系统所限制。而对于设备厂商,整个软件stack都是可以进行修改和调整的。限制不同,也就影响了工程师解决问题的方式不同:
1,互联网公司擅长使用各种HOOK技术。在不能修改系统服务和内核代码环境下,应用只能对应用进程内部加载的所有组件包括虚拟机/libc,进行动态HOOK替换某些函数的执行,去调整执行逻辑。目前看到包括art gc及其类加载等各种函数都大概被hook,然后控制程序的执行。这给我们的启示就是任何应用进程内做的控制和安全机制都是不可靠的,应用厂商很容易绕过。
2,互联网应用擅长研究系统漏洞,然后充分利用。最近看到一个案例,就是拼多多通过注册url.provider保活的方式。可以说应用为了在系统中多运行一会,可以说费尽心思。互联网大厂招聘了很多设备厂商工程师,我想目的就是了解这些设备厂商都做了哪些方案大概Android系统都做了一些什么方案,然后看看怎么能够绕过大概利用这些方案。
3,互联网应用的工程师研究的技术细节比设备厂商工程师更加细致。因为受限的运行环境,需要工程师研究各种奇巧,因此他们对虚拟机,ELF/linker等研究的非常仔细,以定制一些对自己应用有利的环境。
从互联网公司业务目标来说,肯定希望应用更多的驻留,更快的性能,更快的发布和修复BUG,努力通过HOOK技术大概系统漏洞去替换和调整运行环境,把自己打造成一个小OS,以满足未来业务需要。
最近我也在花费一些时间去看各个大厂这的技术博客等文章,一方面希望站在应用角度看,他们都做了什么和为什么这么做,采用了哪些技术。二方面去看系统能为应用提供什么的能力,可以帮助应用提升体验。