Skip to content

Hardcoder 厂商接入指南

sophiaguo edited this page Nov 29, 2019 · 1 revision

Hardcoder 厂商接入指南

Hardcoder 项目介绍请参见 Hardcoder 产品方案介绍,技术方案请见 Hardcoder 技术方案介绍

Hardcoder 项目工程中提供了 Server 端的实现例子,代码主要参见 server.hserver.cpp 以及 protocol.h

设置系统属性

APP 判断手机是否支持 Hardcoder 会读取 persist.sys.hardcoder.name 的 property,若不为空则手机取 property 字段作为 server 端 socket name 请求建立 socket 连接。

厂商侧需设置 persist.sys.hardcoder.name 属性为系统 server 侧 socket name。

实现主要接口函数

protocol.h 的 HardCoder 类定义了所有 Hardcoder 接口为虚函数,厂商侧需继承 HardCoder 类实现相关接口。代码例子中 server.h 的 ManufacturerCoder 继承了 HardCoder 实现了相关接口,例子中为空函数,具体实现需要厂商侧编写。

此部分接口可同时参照 Hardcoder 接入指南中接口说明。

int getUidByAddress(const char *ip, int port);

获取 APP UID,每次在 socket 连接中收到 APP 请求都会检查 APP UID。由于 UID 有唯一性,可作为鉴权用。

bool checkPermission(std::vector<std::string> manufactures, std::vector<std::string> certs, int funcid, int uid, int callertid, int64_t timestamp);

是否允许 APP 使用 Hardcoder,允许返回 true,否则返回 false。若允许所有 APP 使用,直接返回 true 即可。

若需要限制 APP 接入,应实现对应的 checkPermission,其中 manufactures 为厂商名数组,certs 为鉴权值数组,可提供鉴权值给允许使用的 APP 作为参数传入。注意若限制应用使用,需告知 APP 开发者如何申请权限接入。

int requestCpuHighFreq(int scene, int64_t action, int level, int timeoutms, int callertid, int64_t timestamp);

请求提高CPU频率。

scene,APP 场景值;

action,APP 场景值扩展,保留字段;

level,请求的 CPU level,定义在 protocol.h;目前共分为三个 level,LEVEL 0 为不变,LEVEL 1 最高,默认为 CPU 最高频率,LEVEL 2 次之,LEVEL 3 最低,但仍比当前频率会提高,LEVEL 2 和 LEVEL 3 具体频率可由厂商自行决定。

timeoutms,从 timestamp 开始请求 timeoutms 时间的资源;

callertid,请求线程 id;

timestamp,请求时间戳;

int cancelCpuHighFreq(int callertid, int64_t timestamp);

取消提频请求。

int requestCpuCoreForThread(int scene, int64_t action, std::vector<int>bindtids, int timeoutms, int callertid, int64_t timestamp);

请求绑定指定线程到cpu大核。

bindtids,需要绑定到大核的线程 id 数组。

参考实现,部分厂商会直接把请求线程所在进程的所有线程同时绑定到大核。

int cancelCpuCoreForThread(std::vector<int>bindtids, int callertid, int64_t timestamp);

取消绑定线程请求。

int requestHighIOFreq(int scene, int64_t action, int level, int timeoutms, int callertid, int64_t timestamp);

请求提高 IO 频率。

int cancelHighIOFreq(int callertid, int64_t timestamp);

取消提高 IO 频率请求

int requestGpuHighFreq(int scene, int64_t action, int level, int timeoutms, int callertid, int64_t timestamp); 

请求提高 GPU 频率。

int cancelGpuHighFreq(int callertid, int64_t timestamp);

取消提高 GPU 频率请求。

int requestUnifyCpuIOThreadCoreGpu(int scene, int64_t action, int cpulevel, int iolevel, std::vector<int>bindtids, int gpulevel, int timeoutms, int callertid, int64_t timestamp);

混合请求,可同时请求提高 CPU 频率,提高 IO 频率,提高 GPU 频率以及线程绑核。

int cancelUnifyCpuIOThreadCoreGpu(int cancelcpu, int cancelio, int cancelthread, std::vector<int>bindtids, int cancelgpu, int callertid, int64_t timestamp);

取消混合请求;

LocalSocketServer

server.h 的 LocalSocketServer 类主要实现了 server 端的 LocalSocket,LocalSocketServer 的接口在Hardcoder 技术方案介绍中《Hardcoder 通讯方式 —— LocalSocket》一节中详细介绍过。

LocalSocketServer 作为通信方式,通过 recvEvent 函数收到 APP 请求,通过 onCallback 实现发送数据到 APP侧,从而实现通信。对应的 client 侧的回调函数在 protocol.h 的 onCallback 函数。

server.cpp 中 main 函数所示,新建一个实例 ManufacturerCoder 时把 LocalSocketServer 的实现类作为参数传入。

测试

使用项目 testapp 里面的 MoreAPIs 进行接口测试。

线上部署

厂商侧提供实现 server 的机型列表,并对线上机型进行系统升级。

注意事项

  1. 请求资源需要加兜底方案,当 APP 没有主动结束请求时,按照请求的 timeoutms 时间结束请求,为了避免 timeoutms 设定过大,需要由系统侧设定最长时间;
  2. 需要支持可同时维持多个 socket 连接,目前连接只针对单个进程,若 APP 有多个进程,可能有多个 socket 连接。