微信底层调用方案Hardcoder已开源!

一、Hardcoder 的诞生

随着微信愈来愈复杂,性能优化变得愈来愈难作,优化所带来的效果提高也愈来愈不明显。因此咱们⼀直在思考,该如何突破这个优化的极限?

直到有一次与厂商的交流咱们了解到,部分厂商会针对微信作一些小改动,其中比较典型的就是“暴力提频”。系统在识别到微信启动,页面切换等场景时,会粗暴地提升 CPU 频率,从而提高 APP 运行的性能。

但因为厂商没法准确判断微信场景,暴力提频效果并不理想;而若是过多地提升 CPU 频率,又对手机的功耗有影响。这一方案启发了咱们,咱们何不跳出软件的范畴,在手机硬件的层面上挖掘更多的性能优化空间呢?因而 Hardcoder 框架应运而生。

二、Hardcoder 是什么

厂商暴力提频效果不理想是因为在目前 Android 框架下,手机没有办法准确获知 APP 须要资源的时机。若是咱们须要挖掘手机硬件层面的性能优化,就须要跳过 Android 操做系统的应用框架,在应用开发者和硬件之间打开一个通道,让硬件能够直接根据应用开发者的须要进行资源的调度。

Hardcoder 构建了 APP 与系统(ROM)之间可靠的通讯框架,突破了 APP 只能调用系统标准 API,没法直接调用系统底层硬件资源的问题,让 Android APP 和系统能实时通讯。



利用 Hardcoder,APP 能充分调度系统资源如 CPU 频率,大小核,GPU 频率等来提高 APP 性能,系统可以从 APP 侧获取更多信息以便更合理提供各项系统资源。同时,对于 Android 缺少标准接口实现的功能,APP 和系统间也能够经过该框架实现机型适配和功能拓展。

三、Hardcoder 框架通讯流程

Hardcoder 框架分为 Server 端和 Client 端。其中 Server 端在厂商系统侧实现,Client 端以 aar 形式合入到 APP中。



APP 在须要资源的时候,向 Hardcoder 的 Client 端发出请求。Hardcoder Client 端接收到请求后向 Hardcoder Server 端发出请求。Server 端接受到请求后会根据请求参数向硬件申请不一样的资源,好比调整 CPU 频率,把线程绑定到大核运行等,实现了 APP 到系统的通讯。

同时系统也可把当前系统的状态经过 Hardcoder Client 在 Server 端注册的接口回调通知到 Client 端,从而 APP 能够获取到系统状态,实现系统到 APP 的通讯。

Hardcoder Client 端与 Server 端采用的是 LocalSocket 的通讯方式,因为 Hardcoder 采用 Native 实现,于是在 C 层使用 Linux 的 socket 接口实现了一套 LocalSocket 机制做为 Client 端与 Server 端之间的通讯方式。



Hardcoder 通讯框架有如下特色:
  • 1)系统服务为 optional,实现上能够彻底支持或者部分支持;
  • 2)框架实现不依赖于特定 Android 系统,如 API level 限制;
  • 3)APP 的功能和业务特性不依赖于该框架。

四、Hardcoder 适用场景和效果

Hardcoder 框架有效提高了微信启动、发送视频、小程序启动等重度场景的速度,朋友圈的滑动流畅性也明显提高,平均优化效果达 10%-30%。

此外,因为微信做为主动请求方能够在场景资源把控上作得更精细和准确,Hardcoder 在性能获得提高的同时仅增长了 2% 的电量消耗,至关于用 2% 的功耗换取平均 20% 的性能提高。

Hardcoder 框架目前已接入 OPPO、vivo、华为、小米、三星、魅族等主流手机厂商,覆盖 4.6 亿+ 设备量。

五、Hardcoder 开源

从微信技术开放共享的理念出发,咱们在腾讯内部进行了 Hardcoder 框架的宣传和推广,包括手机 QQ、企业微信、每天快报等多个应用团队接入。其中手机 QQ 接入 Hardcoder 后,在启动、打开聊天界面、发送图片等场景的平均优化效果达 10%-50%。

咱们现将 Hardcoder 框架开源,让更多 Android 开发者享受到 Hardcoder 框架的价值,解决你们在性能优化和机型适配上的烦恼。

欢迎你们查阅 github 网址: github.com/Tencent/Har…

六、如何使用 Hardcoder

1、经过 Hardcoder 技术方案介绍,了解 Hardcoder 实现原理以及框架;

2、使用工程自带 testapp 快速使用 Hardcoder 并验证效果,具体请见 Hardcoder Testapp 测试指南

3、APP 接入 Hardcoder,具体请参见 Hardcoder 接入指南
  • 1)下载 Hardcoder 工程编译 aar;
  • 2)项目 build.gradle 引入 Hardcoder aar;
  • 3)进程启动时调用 initHardCoder 创建 socket 链接(通常进程启动时须要请求资源,于是推荐在进程启动时调用)。每一个进程都是独立的,都须要调用 initHardCoder 创建 socket 链接,创建链接后每一个进程维持一个 socket,进程退出时 socket 也会断开;
  • 4)initHardCoder 回调成功后调用 checkPermission,传入 APP 已申请的各个厂商鉴权值;
  • 5)在须要请求资源的场景调用 startPerformance,传入请求资源的参数。若场景位于进程启动阶段,好比 APP 启动,须要在 initHardCoder 的回调成功之后再调用 startPerformance,确保链接已成功创建,或者判断 HardCoderJNI 的 isConnect() 检查 socket 是否已链接。
  • 6)场景结束时主动调用 stopPerformance,传入对应场景 startPerformance 时的返回值 hashCode 做为参数,中止本次请求。
  • 7)测试性能,APP 可对打开/关闭 Hardcoder 的状况作对比实验,测试性能是否有提高。
4、向厂商申请线上权限,具体请见常见问题

5、发布带 Hardcoder 功能的 APP。

附录: github的wiki 文档连接

Hardcoder产品方案介绍: github.com/Tencent/Har…
Hardcoder 技术方案介绍: github.com/Tencent/Har…
Hardcoder testapp 测试指南: github.com/Tencent/Har…
Hardcoder 接入指南: github.com/Tencent/Har…
常见问题: github.com/Tencent/Har…
相关文章
相关标签/搜索