电子说
性能调优组件包含系统和应用调优框架,旨在为开发者提供一套性能调优平台,可以用来分析内存、性能等问题。
该组件整体分为PC端和设备端两部分,PC端最终作为deveco studio的插件进行发布,内部主要包括分为UI绘制、设备管理、进程管理、插件管理、数据导入、数据存储、 数据分析、Session管理、配置管理等模块;设备端主要包括命令行工具、服务进程、插件集合、应用程序组件等模块。设备端提供了插件扩展能力,对外提供了插件接口,基于该扩展能力可以按需定义自己的能力,并集成到框架中来,目前基于插件能力已经完成了实时内存插件,trace插件。下文会重点对设备端提供的插件能力进行介绍。
下面针对设备端对外提供的插件扩展能力进行接口和使用说明。
下面是设备端插件模块对外提供的接口:
表 1 PluginModuleCallbacks接口列表
[]()
[]()[]()接口名 | []()[]()类型 | []()[]()描述 |
---|---|---|
[]()[]()PluginModuleCallbacks::onPluginSessionStart | []()[]()int (PluginSessionStartCallback)(const uint8_tconfigData, uint32_t configSize); | []()[]()- 功能: |
[]()[]()插件会话开始接口,开始插件会话时会被调用,用来下发插件配置
表 2 WriterStruct接口列表
[]()
[]()[]()接口名 | []()[]()类型 | []()[]()描述 |
---|---|---|
[]()[]()WriterStruct::write | []()[]()long (WriteFuncPtr)(WriterStructwriter, const void* data, size_t size); | []()[]()- 功能: |
[]()[]()写接口,将插件中采集的数据通过writer进行写入
表 3 PluginModuleStruct接口列表
[]()
[]()[]()接口名 | []()[]()类型 | []()[]()描述 |
---|---|---|
[]()[]()PluginModuleStruct::callbacks | []()[]()PluginModuleCallbacks* | []()[]()功能:定义插件回调函数列表 |
[]()[]()PluginModuleStruct::name | []()[]()C style string | []()[]()功能:定义插件名称 |
[]()[]()PluginModuleStruct::resultBufferSizeHint | []()[]()uint32_t | []()[]()功能:用于提示插件管理模块调用数据上报接口时使用的内存缓冲区字节数 |
下面介绍在设备端基于性能调优框架提供的插件能力,新增一个插件涉及到的关键开发步骤:
message PluginData {
int32 pid = 1;
string name = 2;
uint64 count1 = 3;
uint64 count2 = 4;
uint64 count3 = 5;
......
}
message PluginConfig {
int32 pid = 1;
bool report_interval = 2;
int report_counter_id_1 = 3;
int report_counter_id_2 = 4;
......
}
static PluginModuleCallbacks callbacks = {
PluginSessionStart,
PluginReportResult,
PluginSessionStop,
};
PluginModuleStruct g_pluginModule = {&callbacks, "test-plugin", MAX_BUFFER_SIZE};
int PluginSessionStart(const uint8_t* configData, uint32_t configSize)
{
......
return 0;
}
int PluginReportResult(uint8_t* bufferData, uint32_t bufferSize)
{
......
return 0;
}
int PluginSessionStop()
{
......
return 0;
}
action("plugin_cpp_gen") {
script = "${OHOS_PROFILER_DIR}/build/protoc.sh" //依赖的编译工具链
sources = [ //定义的插件相关的proto文件,比如插件配置文件、插件数据对应的proto文件
"plugin_data.proto",
"plugin_config.proto",
]
outputs = [ //通过protoc编译生成的结果文件
"plugin_data.pb.h",
"plugin_data.pb.cc",
"plugin_config.pb.h",
"plugin_config.pb.cc",
]
args = [
"--cpp_out",
"$proto_rel_out_dir",
"--proto_path",
rebase_path(".", root_build_dir),
]
deps = [
"${OHOS_PROFILER_3RDPARTY_PROTOBUF_DIR}:protoc(${host_toolchain})",
]
}
ohos_source_set("plug_cpp") { //将定义的proto文件生成cpp文件
deps = [
":plugin_cpp_gen",
]
public_deps = [
"${OHOS_PROFILER_3RDPARTY_PROTOBUF_DIR}:protobuf",
"${OHOS_PROFILER_3RDPARTY_PROTOBUF_DIR}:protobuf_lite",
]
include_dirs = [ "$proto_out_dir" ]
sources = [ //目标plug_cpp中包括的源文件
"plugin_data.pb.h",
"plugin_data.pb.cc",
"plugin_config.pb.h",
"plugin_config.pb.cc",
]
}
ohos_shared_library("***plugin") {
output_name = "***plugin"
sources = [
"src/***plugin.cpp", //插件中的源文件
]
include_dirs = [
"../api/include",
"${OHOS_PROFILER_DIR}/device/base/include",
]
deps = [
"${OHOS_PROFILER_3RDPARTY_PROTOBUF_DIR}:protobuf_lite",
"${OHOS_PROFILER_3RDPARTY_PROTOBUF_DIR}:protoc_lib",
"${OHOS_PROFILER_DIR}/protos/types/plugins/**:plug_cpp", //上面ohos_source_set中生成的plug_cpp
]
install_enable = true
subsystem_name = "${OHOS_PROFILER_SUBSYS_NAME}"
}
插件动态库生成后,可以自己编写测试代码,通过dlopen加载动态库,并调用上面代码中实现的插件模块回调函数进行验证。
int main(int argc, char** argv)
{
void* handle;
PluginModuleStruct* memplugin;
handle = dlopen("./libplugin.z.so", RTLD_LAZY); //动态打开上面生成的插件动态库
if (handle == nullptr) {
HILOGD("dlopen err:%s.", dlerror());
return 0;
}
memplugin = (PluginModuleStruct*)dlsym(handle, "g_pluginModule"); //获取开发步骤3中定义的g_pluginModule全局变量
//check memplugin- >callbacks // 通过该指针调用上面开发步骤3中定义的回调函数
return 0;
执行hiprofiler_cmd 为调优业务的离线命令行抓取工具,具体使用方法及命令行参数介绍如下。
可以使用-h
或者--help
参数查看命令的使用描述信息:
hiprofiler_cmd -h
help :
--getport -q : get grpc address
--time -t : trace time
--out -o : output file name
--help -h : make some help
--list -l : plugin list
--start -s : start dependent process
--kill -k : kill dependent process
--config -c : start trace by config file
其余参数使用说明如下:
-q
或者--getport
选项,用于查询服务的端口信息;-t
或者--time
选项,用于指定抓取时间,单位是秒;-o
或者--out
选项,用于指定输出的离线数据文件名;-h
或者--help
选项,用于输出帮助信息;-l
或者--list
选项,用于查询插件列表;-s
或者--start
选项,用于启动依赖的进程;-k
或者--kill
选项,用于关闭依赖的进程;-c
或者--config
选项,用于指定配置文件;hiprofiler_cmd
-c -
-o /data/local/tmp/hiprofiler_data.htrace
-t 50
-s
-k
<
命令参数说明:
hiprofiler_cmd
-c -
-o /data/local/tmp/hiprofiler_data.htrace
-t 50
-s
-k
<
命令参数说明:
使用如下命令:
hiprofiler_cmd
-c -
-o /data/local/tmp/hiprofiler_data.htrace
-t 50
-s
-k
<
使用如下命令:
hiprofiler_cmd
-c -
-o /data/local/tmp/hiprofiler_data.htrace
-t 50
-s
-k
<
如配置抓取的进程名是com.ohos.mms
hiprofiler_cmd
-c -
-o /data/local/tmp/hiprofiler_data.htrace
-t 50
-s
-k
<
配置参数说明:
运行如下命令:
hiprofiler_cmd
-c -
-o /data/local/tmp/hiprofiler_data.htrace
-t 30
-s
<
运行如下命令:
hiprofiler_cmd
-c -
-o /data/local/tmp/hiprofiler_data.htrace
-t 50
-s
-k
<
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !