本文首发自公众号「承香墨影(ID:cxmyDev)」,欢迎关注。java
今年一月微信公开课 Pro 2019 上,提到的微信性能优化框架「Hardcoder」,近日终于开源了。git
微信开源的东西,做为 Android 开发,固然是双击 666 了。github
可是做为一名 Android 开发者,我更关心的是 Handcoder 究竟是什么?对咱们 Android 开发者有什么影响?web
Hardcoder 在 18 年微信就放出了消息,简单来讲,Hardcoder 是微信研发的一款性能优化框架。性能优化
若是看了这么一句话,简单去理解的话,好像只要等微信开源以后,咱们在 App 内也接入 Hardcoder,就能够如微信般丝滑。微信
但理想老是很丰满的…app
Hardcoder 自己也是业务发展的产物,在微信愈来愈复杂后,常规的性能优化,带来的提高已经愈来愈小了。可是从厂商的角度,微信这种国民 App,就应该秒开无卡顿,作到极致的优化。框架
打个比方说,若是那个厂商的手机,被发现微信很差用了,用户确定是以为这个手机有问题,而不是微信有问题。性能
有句话怎么说的,「当你强大,整个世界都会对你和颜悦色」。学习
厂商也意识到了这一点,因此部分厂商早期是会针对微信,作一些小优化,其中比较典型的就是「暴力提频」。系统在识别当前微信正在运行,会粗暴的提升 CPU 频率,从而提高 App 的运行性能。
要知道,全部「一刀切」的事情,都是在暴露一些问题。
「暴力提频」也是同样。过多的提升 CPU 频率,必然会对手机的功耗形成影响,最直接的影响,就是你发现你的手机耗电更快了。
厂商对硬件资源的限制,自己有一部分,也是从功耗的角度考虑的,随着手机功能愈来愈丰富,其实电池技术是跟不上的,一款功能强大但离不开电源的手机,确定不会是用户的理想选择。
因此手机厂商就会对硬件作出一些限制,在不须要那么多资源的时候,就减小资源的给予。可是资源的减小,必然会引发一些体验上的问题,例如卡顿,而这种用户体验的问题,厂商也并不肯意。
毕竟谁卡,谁不卡,用户心理天然有一杆秤。
但这其中有个难点,厂商之因此选择一刀切这种暴力提频的方案,根本缘由在于,做为手机,没有办法准确知道 App 当前在干什么,是否须要资源。毕竟如今 App 的功能太丰富了,靠手机自身没法作到精准的优化。
既然厂商想优化体验,微信又有优化 App 性能的需求,那真是一拍即合,就诞生了 Hardcoder。Hardcoder 构建了 App 与系统(ROM)之间可靠的通讯框架,让系统知道 App 的需求。
以前厂商也不知道何时该给资源,何时该省资源,真是又怕他不来又怕他乱来。
如今好了,有了 Hardcoder,既然系统不知道,就由 App 主动告诉它,等于微信主动告诉手机系统,我如今在什么场景下,或者我接下来要干什么了,这个场景须要一些系统资源来加持,才能保证速度嗖嗖的,不会卡顿。
到这里你们应该就理解了,Hardcoder 更像是一个通讯框架,能够经过它告知操做系统,我接下来要作复杂操做了,请给我资源。
Hardcoder 自己与厂商,已经预设了一些场景值,能够直接使用。
int APP_SCENE_UNDEFINE = 0; //未定义场景
int APP_SCENE_STARTUP = 1; //进程启动,APP启动
int APP_SCENE_WINDOW_SWITCH = 2; //UI页面切换(同一进程),activity,fragment切换
int APP_SCENE_WINDOW_SCROLL = 3; //UI页面滑动
int APP_SCENE_DATA_LOADING_AND_PROCESS = 4; //数据加载和处理任务,指APP本地先后台任务
int APP_SCENE_MULTI_MEDIA_PROCESS = 5; //多媒体相关业务
int APP_SCENE_COMMUNICATE = 6; //APP/服务端通讯
int APP_SCENE_SYSTEM_DEVICE = 7; //调用系统服务
复制代码
固然你也能够自行定义。
知道了 Hardcoder 都干了什么,再简单了解一下它的设计。
Hardcoder 在 App 和系统之间,构建了一个可靠的通讯框架,跳出以前 App 只能调用系统标准 API,而没法直接调用系统底层硬件资源的问题,让 Android App 与 系统之间,能够实现实时的通讯。
利用 Hardcoder,App 能够在必要的时候,向系统申请更多的硬件资源,例如 CPU 频率、大小核、GPU 频率等资源来提高 App 的性能。
Hardcoder 框架,分为 Client 端和 Server 端,本次开源的就是 Client 端,Server 端则交由厂商系统侧自行实现。
Hardcoder Client 端和 Server 端之间,采用的是 LocalSocket 的通讯方式,等于 App 若是须要资源,经过 Hardcoder 的 Client 端向系统实现的 Server 发请求,系统侧接到请求以后,按需调整不一样的系统资源,例如给更大的 CPU 频率,把系统绑定到大核运行等等。
说到 LocalSocket,我想 Android 开发应该比较熟悉。由于在 Java 层,Android 自己提供了一套 LocalSocket 的 API,可是呢 Hardcoder 没用它。由于 Hardcoder 主要是采用 Native 实现的,因此微信在 C 层,使用 Linux 的 Socket 接口,又本身实现了一套 LocalSocket。
这大概就是大佬的世界,用不了就本身写。
那利用 Hardcoder 到底对性能有多少提高呢?
从官方里给出的数据来看,平均优化效果达 10%~30%,而又由于微信自己对资源的申请也比较精细和准确,因此功耗上仅增长了 2% 的耗电,至关于用 2% 的功耗,换来了 20% 性能的提高。这份数据在厂商来看,应该是能够接受的。
Hardcoder 框架的覆盖的设备量也很是的大,目前已接入 OPPO、vivo、华为、小米、三星、魅族等主流手机厂商,覆盖 4.6 亿+ 设备量。
到这里你们应该都明白了。说白了 Hardcoder 就是一个 App 与系统的通讯框架,以前说的性能优化框架,但实际上真正的起做用的逻辑,都在 Server 端。你想申请资源,你就用 Hardcoder 申请你的,系统给不给你,彻底由系统侧自身决定。
体量决定了复杂度,再简单的技术,用在 10w 用户和用在 10 亿用户上,就是天差地别。
有些事情,微信能作到的,你就算拿到了微信的源码,你也作不到。主要仍是由于微信这样的用户体量,让厂商一路给开绿灯。
从文档中了解到,Hardcoder 目前国内的主流厂商都已经支持了,而且有些已经开放出权限申请方式。
VIVO 这种商务渠道的申请,应该是比较困难的,可是自助注册的 OPPO 以及华为这种无需注册的,就能够用到 Hardcoder 了。
但 Hardcoder 本质上仍是一个与系统通讯的框架,至于系统是否响应你申请资源的请求,彻底拒绝于系统侧自身的逻辑,你这个申请资源的消息发过去了,对方受不受理,就不是咱们能决定的。
文档里也提到,Hardcoder Server 端也会对应用请求资源作必定的限制,例如当前 App 在前台或者在后台,就会有不一样的处理逻辑。
站在微信的视角,Hardcoder 是性能优化框架,站在普通开发者的角度,它可能仅仅是一个通讯框架,而且仍是那种单向通讯的框架,是否有做用,彻底取决于厂商,这部分堪称是玄学。
可能你在 A 手机上很差使,换到 B 手机上就好使了,也可能你在测试机上有效,换到自用机上就无效了。
不过话说回来,提高用户体验一直也是厂商的目标,这和大部分 App 开发者的目标上一致的,因此长期来看 Hardcoder 仍是有价值的。但在国内全家桶 App 的环境下,自然的让厂商不信任 App,将厂商与 App 推到了对立面。
可是若是厂商有一套标准的检验流程,能够检验出 App 开发者是否真的作到「诚实」,在须要的时候作到精确控制,只在须要的时候申请,不须要的时候不乱申请。就可让 App 和厂商愉快的玩耍了。
而 Hardcoder 发布以前也并不仅有微信在使用,腾讯系的很多产品已经在使用它了,例如 QQ、企业微信、每天快报等。等于微信此次开源了 Hardcoder,若是厂商想开放出来让广大开发者使用,其实成本是很是低的。
说到底 Hardcoder 是否有效的主动权仍是在厂商,因此在这件事情期待后续厂商的发声。
最后我提一句,Hardcoder 在 Github 上开源的文档,仍是值得 Android 开发者读一读的,能够学到很多东西。
你对 Hardcoder 有什么见解,欢迎留言讨论。
references:
https://github.com/Tencent/Hardcoder
本文对你有帮助吗?留言、转发、收藏是最大的支持,谢谢!
公众号后台回复成长『成长』,将会获得我准备的学习资料。