diff --git a/.gitignore b/.gitignore index 6ec0ed2ff1d3a07683876f3720a392400ce96829..50f79f9098f574ada112b1a0c182bc23475a6eb4 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,7 @@ trace_streamer/*.tar.gz trace_streamer/*.zip ts_tmp.perf.data trace_streamer/.cache +trace_streamer/llvm tmp_* build-* *.pro.use* diff --git a/README_zh.md b/README_zh.md index 8e4603ba5e93624ba06351809e648d00b0d4cce0..b41da8eba5ba54c5e2d51a402b24c00f37da614e 100644 --- a/README_zh.md +++ b/README_zh.md @@ -69,6 +69,7 @@ https://gitee.com/openharmony/developtools_smartperf_host/releases - npm 版本 >= 8.13.2 - TypeScript 版本 >= 4.2.3 - golang 版本 >= 1.13.8 +- python 版本 >= 3.x ### Trace Streamer编译 搭建Smartperf_Host网站需要编译出trace_streamer的wasm版本供网页端进行原始trace数据解析工作,具体的编译过程参考《[如何独立编译Trace Streamer](./trace_streamer/doc/compile_trace_streamer.md)》。 ### Smartperf_Host编译部署 diff --git a/ide/src/base-ui/popover/LitPopoverV.ts b/ide/src/base-ui/popover/LitPopoverV.ts index 3dea9ceb6295308a55d6274072713bd9176d1752..d16bab7c1d29b0237c83b2d55e891ebd5c788c2c 100644 --- a/ide/src/base-ui/popover/LitPopoverV.ts +++ b/ide/src/base-ui/popover/LitPopoverV.ts @@ -419,6 +419,10 @@ export class LitPopover extends BaseElement { return this.getAttribute('haveRadio'); } + get haveCheckbox(): string | null { + return this.getAttribute('haveCheckbox'); + } + initElements(): void {} initHtml(): string { @@ -452,10 +456,17 @@ export class LitPopover extends BaseElement { this.focus(); } // @ts-ignore checkbox.checked = !checkbox.checked; // @ts-ignore - this.visible = checkbox.checked; + if (!this.haveCheckbox) { + // @ts-ignore + this.visible = checkbox.checked; + } }; // @ts-ignore popover.onmouseleave = (): void => { this.focus(); + if(this.haveCheckbox){ + // @ts-ignore + this.visible = false; + } }; this.onblur = (ev: unknown): void => { // @ts-ignore @@ -469,6 +480,8 @@ export class LitPopover extends BaseElement { // @ts-ignore this.visible = false; } + // @ts-ignore + } else if (this.haveCheckbox) { } else { // @ts-ignore this.visible = false; diff --git a/ide/src/base-ui/select/LitSelect.ts b/ide/src/base-ui/select/LitSelect.ts index da9d3e108939c3e05f5f15476b50fb2f00c5b4bd..61311ebed751bfdc734123c25a49a287ada5dca9 100644 --- a/ide/src/base-ui/select/LitSelect.ts +++ b/ide/src/base-ui/select/LitSelect.ts @@ -459,6 +459,13 @@ export class LitSelect extends BaseElement { if (this.hasAttribute('disabled')) { return; } + // @ts-ignore + if (this.selectInputEl.value.length > 0) { + // @ts-ignore + this.selectInputEl.placeholder = this.selectInputEl.value; + // @ts-ignore + this.selectInputEl.value = ''; + } if (this.hasAttribute('show-search')) { // @ts-ignore this.selectSearchEl.style.display = 'flex'; // @ts-ignore @@ -475,57 +482,57 @@ export class LitSelect extends BaseElement { // @ts-ignore this.selectInputEl.onkeydown = (ev: KeyboardEvent): void => { ev.stopPropagation(); - if (this.hasAttribute('tabselect')) { - // @ts-ignore - this.selectInputEl.readOnly = true; - } else { - // @ts-ignore - if (ev.key === 'Backspace') { - if (this.isMultiple()) { - // @ts-ignore - let tag = this.selectMultipleRootEl.lastElementChild.previousElementSibling; - if (tag) { - this.querySelector(`lit-select-option[value=${tag.value}]`)?.removeAttribute('selected'); - tag.remove(); - if (this.shadowRoot!.querySelectorAll('.tag').length === 0) { - // @ts-ignore - this.selectInputEl.style.width = 'auto'; // @ts-ignore - this.selectInputEl.placeholder = this.defaultPlaceholder; - } - } - } else { - this.clear(); - this.dispatchEvent(new CustomEvent('onClear', { detail: ev })); //向外派发清理事件 - } // @ts-ignore - } else if (ev.key === 'Enter') { - if (!this.canInsert) { - let filter = [...this.querySelectorAll('lit-select-option')].filter( - // @ts-ignore - (a: unknown) => a.style.display !== 'none' - ); - if (filter.length > 0) { - // @ts-ignore - this.selectInputEl.value = filter[0].textContent; // @ts-ignore - this.selectInputEl.placeholder = filter[0].textContent; - this.blur(); + if (this.hasAttribute('tabselect')) { + // @ts-ignore + this.selectInputEl.readOnly = true; + } else { + // @ts-ignore + if (ev.key === 'Backspace') { + if (this.isMultiple()) { // @ts-ignore - this.value = filter[0].getAttribute('value'); - this.dispatchEvent( - new CustomEvent('change', { - detail: { - selected: true, - value: filter[0].getAttribute('value'), - text: filter[0].textContent, - }, - }) + let tag = this.selectMultipleRootEl.lastElementChild.previousElementSibling; + if (tag) { + this.querySelector(`lit-select-option[value=${tag.value}]`)?.removeAttribute('selected'); + tag.remove(); + if (this.shadowRoot!.querySelectorAll('.tag').length === 0) { + // @ts-ignore + this.selectInputEl.style.width = 'auto'; // @ts-ignore + this.selectInputEl.placeholder = this.defaultPlaceholder; + } + } + } else { + this.clear(); + this.dispatchEvent(new CustomEvent('onClear', { detail: ev })); //向外派发清理事件 + } // @ts-ignore + } else if (ev.key === 'Enter') { + if (!this.canInsert) { + let filter = [...this.querySelectorAll('lit-select-option')].filter( + // @ts-ignore + (a: unknown) => a.style.display !== 'none' ); - } - }// @ts-ignore - } else if (ev.key === '0' && ev.target.value.length === 1 && ev.target.value === '0') { - // @ts-ignore - ev.preventDefault(); + if (filter.length > 0) { + // @ts-ignore + this.selectInputEl.value = filter[0].textContent; // @ts-ignore + this.selectInputEl.placeholder = filter[0].textContent; + this.blur(); + // @ts-ignore + this.value = filter[0].getAttribute('value'); + this.dispatchEvent( + new CustomEvent('change', { + detail: { + selected: true, + value: filter[0].getAttribute('value'), + text: filter[0].textContent, + }, + }) + ); + } + }// @ts-ignore + } else if (ev.key === '0' && ev.target.value.length === 1 && ev.target.value === '0') { + // @ts-ignore + ev.preventDefault(); + } } - } }; } diff --git a/ide/src/base-ui/slicer/lit-slicer.ts b/ide/src/base-ui/slicer/lit-slicer.ts index e9a1bc3875fcc3bbfadc31d03e72158269d2db74..86f9061f009ae0108d4c16781f8f7d909f912dbb 100644 --- a/ide/src/base-ui/slicer/lit-slicer.ts +++ b/ide/src/base-ui/slicer/lit-slicer.ts @@ -153,6 +153,8 @@ export class LitSlicerTrack extends HTMLElement { ) { previousElementSibling!.style.width = preWidth + e1.pageX - preX + 'px'; nextElementSibling!.style.width = nextWidth + preX - e1.pageX + 'px'; + } else { + this.draging = false; } } }; diff --git a/ide/src/base-ui/table/lit-table.ts b/ide/src/base-ui/table/lit-table.ts index 003ba5345a282a95fd6edf1a30a62b439d4c74d4..4a3c39128403edeeeaf741594a3595b816845b30 100644 --- a/ide/src/base-ui/table/lit-table.ts +++ b/ide/src/base-ui/table/lit-table.ts @@ -89,12 +89,16 @@ export class LitTable extends HTMLElement { ]; } + get slotArr(): Array { + return this.st!.assignedElements() + } + set mode(mode: TableMode) { this._mode = mode; } set loading(value: boolean) { - this.exportProgress!.loading = value; + this.exportProgress && (this.exportProgress.loading = value); } get hideDownload(): boolean { diff --git a/ide/src/command/Cmd.ts b/ide/src/command/Cmd.ts index c3e760f13a18a48a368a9bde08f65cfd0b3341df..6d0e68fe8e45af1bd5e46feb1f96f4360c1f461c 100644 --- a/ide/src/command/Cmd.ts +++ b/ide/src/command/Cmd.ts @@ -16,6 +16,8 @@ import { SpRecordTrace } from '../trace/component/SpRecordTrace'; import { CmdConstant } from './CmdConstant'; import { HdcDeviceManager } from '../hdc/HdcDeviceManager'; +import { TypeConstants } from '../webSocket/Constants'; +import { WebSocketManager } from '../webSocket/WebSocketManager'; export class Cmd { static CmdSendPostUtils(uri: string, callback: Function, requestData: unknown): void { @@ -231,6 +233,13 @@ export class Cmd { Cmd.execHdcCmd(cmd, (res: string): void => { resolve(Cmd.convertOutProcessList(res)); }); + } else if (SpRecordTrace.useExtend) { + WebSocketManager.getInstance()!.sendMessage(TypeConstants.USB_TYPE, TypeConstants.USB_GET_PROCESS, new TextEncoder().encode(SpRecordTrace.serialNumber)); + setTimeout(() => { + if (SpRecordTrace.allProcessListStr) { + resolve(Cmd.convertOutProcessList(SpRecordTrace.allProcessListStr)); + } + }, 1000) } else { HdcDeviceManager.connect(SpRecordTrace.serialNumber).then((conn): void => { if (conn) { @@ -244,17 +253,28 @@ export class Cmd { } }); } + static getPackage(): Promise { return new Promise((resolve, reject): void => { - HdcDeviceManager.connect(SpRecordTrace.serialNumber).then((conn) => { - if (conn) { - HdcDeviceManager.shellResultAsString(CmdConstant.CMD_GET_PACKAGE, false).then((res): void => { - resolve(Cmd.convertOutPackageList(res)); - }); - } else { - reject(-1); - } - }); + if (SpRecordTrace.useExtend) { + //@ts-ignore + WebSocketManager.getInstance()!.sendMessage(TypeConstants.USB_TYPE, TypeConstants.USB_GET_APP, new TextEncoder().encode(SpRecordTrace.serialNumber)); + setTimeout(() => { + if (SpRecordTrace.usbGetApp) { + resolve(Cmd.convertOutPackageList(SpRecordTrace.usbGetApp)); + } + }, 1000); + } else { + HdcDeviceManager.connect(SpRecordTrace.serialNumber).then((conn) => { + if (conn) { + HdcDeviceManager.shellResultAsString(CmdConstant.CMD_GET_PACKAGE, false).then((res): void => { + resolve(Cmd.convertOutPackageList(res)); + }); + } else { + reject(-1); + } + }); + } }); } } diff --git a/ide/src/doc/funDetail.json b/ide/src/doc/funDetail.json index e9a08eb4d55c5dd87b5b44d714e5454c582bf3f0..9bca062d7de50c4c2c854a08c75c02118d17a341 100644 --- a/ide/src/doc/funDetail.json +++ b/ide/src/doc/funDetail.json @@ -31,12 +31,6 @@ "EN": "this is an english translate for CN", "flag": "0" }, - { - "slice": "FlushLayoutTask", - "CN": "组件的布局,这一块可以确认是什么组件在创建或者复用", - "EN": "this is an english translate for CN", - "flag": "0" - }, { "slice": "CreateTaskMeasure", "CN": "组件的测量。这一块可以确认是什么组件在创建", @@ -49,12 +43,6 @@ "EN": "this is an english translate for CN", "flag": "0" }, - { - "slice": "JSAnimation", - "CN": "如果FlushVsync下面出现这个trace点,说明触发了ArkUI的动效,例如使用了属性动画animation属性或者显示动画animateTo。可以排查一下代码看一下这种场景是否需要触发这个动画,有时候会因为组件的刷新而出现该动画的冗余绘制", - "EN": "this is an english translate for CN", - "flag": "0" - }, { "slice": "BuildRecyle", "CN": "如果出现这个trace说明,这个组件是走复用逻辑的。当前如果组件节点较多,也会导致组件复用的时候耗时比较长导致丢帧。", @@ -186,6 +174,378 @@ "CN": "触发了shader编译,需要通过与之shader来避免。shader缓存是业界通用方案,在动效前几次执行的时候会概率性出现,用于创建该场景的着色器并将其缓存,以使之后的操作可以直接复用原有的着丝琪,从而提升系统的性能。但shader编译耗时太长导致RS侧丢帧造成动效卡顿", "EN": "this is an english translate for CN", "flag": "0" + }, + { + "slice": "OnVsyncEvent now", + "CN": "收到Vsync信号,渲染流程开始", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "UITaskScheduler::FlushTask", + "CN": "刷新UI界面,包括布局、渲染和动画等", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "FlushMessages", + "CN": "发送消息通知图形侧进行渲染", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "FlushRenderTask", + "CN": "总渲染任务执行", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "Layout", + "CN": "节点布局", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "FrameNode::RenderTask", + "CN": "单个渲染任务执行", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "ListLayoutAlgorithm::MeasureListItem:", + "CN": "计算列表项的布局尺寸", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "ListLayoutAlgorithm::MeasureListItemGroup:", + "CN": "计算列表ListItemGroup项的布局尺寸", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "HandleDragStart, id:", + "CN": "拖拽开始", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "HandleDragUpdate, mainDelta", + "CN": "拖拽中", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "HandleDragEnd, mainPosition:", + "CN": "拖拽结束", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "Scrollable friction animation start,", + "CN": "抛滑动画开始", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "Scrollable friction animation finish, id:", + "CN": "抛滑动画结束", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "StopFrictionAnimation, id:", + "CN": "关闭抛滑动画", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "Scrollable spring animation start, start:", + "CN": "过界回弹动画开始", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "Scrollable spring animation finish, id:", + "CN": "过界回弹动画结束", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "Scrollable spring animation update, start:", + "CN": "更新过界回弹动画开始", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "StopSpringAnimation, id:", + "CN": "关闭过界回弹动画", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "Scroll snap animation start, start:", + "CN": "Scroll的限位动画开始", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "Scroll snap animation finish, id:", + "CN": "Scroll的限位动画结束", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "List start snap animation, start:", + "CN": "List的限位动画开始", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "List snap animation finish, id:", + "CN": "List的限位动画结束", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "StopSnapAnimation isSnapAnimationStop_:", + "CN": "关闭限位动画", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "APP_LIST_FLING", + "CN": "滑动阶段(包括所有的拖拽,抛滑、回弹、滚动控制器动画)", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "TRAILING_ANIMATION id:", + "CN": "动画的拖尾阶段", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "HandleTouchDown, panDirection:", + "CN": "手指按下", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "HandleTouchUp, isDragging_:", + "CN": "手指抬起(新增)", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "HandleTouchCancel, id:", + "CN": "取消手势", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "ScrollAbort, no OnScrollStart, id:", + "CN": "ScrollAbort为true,触发OnScrollStart失败,(一般出现在抛滑后调用滚动控制器启动滚动动画)", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "OnScrollStart, id:", + "CN": "触发OnScrollStart成功", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "ScrollAbort, no OnScrollStop, id:", + "CN": "ScrollAbort为true,触发OnScrollStop失败(一般出现在抛滑后调用滚动控制器启动滚动动画)", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "OnScrollStop, id:", + "CN": "触发OnScrollStop成功", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "ScrollBy, offset:", + "CN": "滚动控制器触发ScrollBy", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "ScrollTo with animation, position:", + "CN": "滚动控制器触发带动画的ScrollTo", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "ScrollTo without animation, position:", + "CN": "滚动控制器触发不带动画的ScrollTo", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "ScrollPage with animation, position", + "CN": "滚动控制器触发带动画的Scrollpage", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "ScrollPage without animation, position:", + "CN": "滚动控制器触发不带动画的Scrollpage", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "Fling, flingVelocity:", + "CN": "滚动控制器触发惯性滚动", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "Scroll ScrollToEdge scrollEdgeType:", + "CN": "Scroll触发ScrollEdge", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "ScrollToEdge scrollEdgeType:", + "CN": "滚动控制器触发的ScrollEdge", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "ScrollToIndex, index:", + "CN": "滚动控制器触发ScrollToIndex", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "CUSTOM_ANIMATOR_SCROLLER_ANIMATION", + "CN": "滚动控制器触发ScrollTo滑动动画", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "HandleScroll, initOffset:", + "CN": "嵌套滚动处理偏移量", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "HandleScrollVelocity, IsOutOfBoundary:", + "CN": "嵌套滚动中处理离手速度", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "HandleOverScroll, IsOutOfBoundary:", + "CN": "离手时处理过界滚动", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "SCROLLER_FIX_VELOCITY_ANIMATION", + "CN": "控制器触发按固定速度滚动到边缘", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "CheckRestartSpring, sizeDiminished is true, do ProcessSpringUpdate, id:", + "CN": "回弹动画期间组件大小被修改导致触发回弹更新动画", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "CheckRestartSpring, do ProcessScrollOver, id:", + "CN": "在静态场景下因组件大小修改原因导致组件处于过界状态,触发回弹动画恢复到未过界状态", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "ListItemGroup:", + "CN": "设置lane的ListItemGroup列表布局", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "ListItem:", + "CN": "设置lane的列表布局", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "change direction in spring animation and start fling animation, distance::", + "CN": "过界回弹动效中出现方向改变,并启动抛滑动效", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "scrollPause set true to stop ProcessScrollMotion, canOverScroll:", + "CN": "抛滑动效期间达成停止条件从而关闭抛滑动效,并触发结束回调(一般出现在快速抛滑过界的场景)", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "Tabs.onChange index ", + "CN": "tabs页面切换后", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "Tabs/Swiper drag start", + "CN": "跟手拖拽开始", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "Tabs/Swiper drag end", + "CN": "跟手拖拽结束", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "Tabs/Swiper start property animation, X:", + "CN": "属性动画开始", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "Tabs/Swiper finish property animation, X: ", + "CN": "属性动画结束", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "Tabs/Swiper start spring animation", + "CN": "回弹动画开始", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "Tabs/Swiper finish spring animation, offset:", + "CN": "回弹动画结束", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "Tabs/Swiper start translate animation", + "CN": "自定义属性动画开始", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "Tabs/Swiper finish translate animation", + "CN": "自定义属性动画结束", + "EN": "this is an english translate for CN", + "flag": "0" + }, + { + "slice": "FlushVsync", + "CN": "刷新视图同步事件,包括记录帧信息、刷新任务、绘制渲染上下文、处理用户输入", + "EN": "this is an english translate for CN", + "flag": "0" } ] } \ No newline at end of file diff --git a/ide/src/doc/md/quickstart_Application_operation_skills.md b/ide/src/doc/md/quickstart_Application_operation_skills.md index f27f4be5b6c423b32ab9b45b95fba2439715ea6f..d1770cb0dbc4cf3e3ac1b50056d39b312cc5ae4b 100644 --- a/ide/src/doc/md/quickstart_Application_operation_skills.md +++ b/ide/src/doc/md/quickstart_Application_operation_skills.md @@ -24,6 +24,7 @@ 第一部分是?trace=(固定格式)。 第二部分是trace文件的url(https://iot.itocm.com:9001/upload/ftrace_small.txt),此处根据文件的url实际地址填写。 第三部分,&link=true(固定格式)。 +- 支持打开的trace文件类型: 本工具命令抓取的hiprofiler_data.htrace、hitrace命令行工具抓取的xxx.systrace、xxx.sys等、以上类型的zip压缩文件(压缩包里必须为单文件,压缩算法支持ZIP_DEFLATED和ZIP_BZIP2)、hitrace -z参数生成的压缩trace ### 内容支持宽度可伸缩 @@ -115,3 +116,30 @@ CPU 负载颜色的亮度,负载越大颜色更深,负载越小颜色越浅 - SpanId:当前节点id。 - ParentSpanId:当前节点的父节点id。 - ChainFlag:当前节点在调用链中的flag类型,C(Client)、S(Server)。 + +### 用户自定义序列导入说明 + +自定义序列导入功能支持查看自定义序列泳道及Tab页信息。 + +#### 自定义插件使用步骤 +#### 打开UserPluginsRow开关 +进入Flags页面,将UserPluginsRow开关置为Enable。 +![GitHub Logo](../../figures/OperationSkills/userpluginsrowFlag.JPG) + +#### 导入trace文件,可以看到UserPluginRow泳道 +![GitHub Logo](../../figures/OperationSkills/uerspluginrow.jpg) +#### 点击上传按钮,上传配置好的json文件,根据json文件内容进行泳道绘制 +注意:重复导入文件会清空泳道。 +![GitHub Logo](../../figures/OperationSkills/Importjsonbutton.jpg) +![GitHub Logo](../../figures/OperationSkills/afterimportjson.jpg) + +#### 点选功能 +点击泳道的trace点,Tab页 User Plugin展示json文件相关信息。 +#### json文件格式 +![GitHub Logo](../../figures/OperationSkills/jsondata.jpg) +![GitHub Logo](../../figures/OperationSkills/jsonrelation.jpg) +#### 注意: +- relation为泳道结构,泳道名为relation下的detail与function_name的拼接; +- data为relation里各层级的对应信息; +- data下的begin和end应该在trace的持续时间范围之内,其它数据可根据需要自行配置; +- data下的func_name、begin以及end为必选配置。 \ No newline at end of file diff --git a/ide/src/doc/md/quickstart_Frametimeline.md b/ide/src/doc/md/quickstart_Frametimeline.md index 6767203985544d0c73ee107afb9670855de1298b..14f9a03ffb1bd4e674113cb9022f9d4e6b3120cf 100644 --- a/ide/src/doc/md/quickstart_Frametimeline.md +++ b/ide/src/doc/md/quickstart_Frametimeline.md @@ -23,6 +23,7 @@ ### Frame timeline 泳道图展示 Frame timeline 展开就可以看到泳道图,泳道图上可以显示帧编号。 + ![GitHub Logo](../../figures/Frame/framechart.jpg) - Expected Timeline:理想帧泳道图。 @@ -32,7 +33,8 @@ Frame timeline 展开就可以看到泳道图,泳道图上可以显示帧编 可以对真实帧数据进行框选,框选后在最下方的弹出层中会展示框选数据的统计表格。 Frames 的 Tab 页如图: -![GitHub Logo](../../figures/Frame/frameprocess.jpg) + +![GitHub Logo](quickstart_Frametimeline.assets/frameprocess.jpg) - Jank Type:卡顿类型。 - Min duration:最小持续时间。 @@ -44,21 +46,41 @@ Frames 的 Tab 页如图: 通过点选理想帧和真实帧展示 Tab 页(Current Selection)。 理想帧 Tab 页如下图: + ![GitHub Logo](../../figures/Frame/frameexpectedtab.jpg) -- Name:帧编号。 -- StartTime:启动时间。 -- Absolute Time:绝对时间。 -- Duration:持续时间。 -- Process:进程名。 +- Name:帧编号。 + +- StartTime:启动时间。 + +- Absolute Time:绝对时间。 + +- Duration:持续时间。 + +- Process:进程名。 + 真实帧 Tab 页如下图: ![GitHub Logo](../../figures/Frame/frameactualtab.jpg) -- Name:帧编号。 -- StartTime:启动时间。 -- Absolute Time:绝对时间。 -- Duration:持续时间。 -- Process:进程名。 -- Jank Type:卡顿类型。 -- Gpu Duration:GPU耗时。 -- FrameTimeLine flows:显示的是绘制一帧的完整过程, 由两个阶段组成应用的提交一帧。 + +- Name:帧编号。 + +- StartTime:启动时间。 + +- Absolute Time:绝对时间。 + +- Duration:持续时间。 + +- Process:进程名。 + +- Jank Type:卡顿类型。 + +- Gpu Duration:GPU耗时。 + +- FrameTimeLine flows:显示的是绘制一帧的完整过程, 由两个阶段组成应用的提交一帧。 + - Following flows:展示真实帧包含的关联的帧,图中斜向上箭头点击会进行跳转功能直接定位到具体进程真实帧位置,点选的同时还将包含的关联帧通过线连起来,可以跨越多个进程。 + +render_server真实帧的范围根据新的规则发生变化: + +![GitHub Logo](../../figures/Frame/frameRS.jpg) + diff --git a/ide/src/doc/md/quickstart_app_startup.md b/ide/src/doc/md/quickstart_app_startup.md index f6f20762c06cd131637f983f63682c46d60dd55b..f16c4d98a2a69096b8e1c775e131f77ab6bb553a 100644 --- a/ide/src/doc/md/quickstart_app_startup.md +++ b/ide/src/doc/md/quickstart_app_startup.md @@ -17,7 +17,7 @@ App startup 的泳道图展示: ![GitHub Logo](../../figures/appstartup/appstartuprow.jpg) -应用启动包括六个阶段,分别是 Process Creating(应用进程创建阶段)、Application Launching(加载应用阶段)、UI Ability Launching(加载 UI Ability)、UI Ability OnForeground(应用进入前台)、First Frame - APP Phase(首帧渲染提交-应用)、First Frame - Render Phase(首帧渲染提交-Render Service)。每个阶段的 Slice 上都会显示出该阶段的时延。 +应用启动包括八个阶段,分别是ProcessTouchEvent(处理点击事件阶段)、StartUIAbilityBySCB(SCB发送请求阶段)、LoadAbility(AMS加载Ability阶段) 、Application Launching(加载应用阶段)、UI Ability Launching(加载UI Ability)、UI Ability OnForeground(应用进入前台)、First Frame - APP Phase(首帧渲染提交-应用)、First Frame - Render Phase(首帧渲染提交-Render Service)。每个阶段的Slice上都会显示出该阶段的时延。 ### App startup 泳道图点选功能 diff --git a/ide/src/doc/md/quickstart_hiperf.md b/ide/src/doc/md/quickstart_hiperf.md index 9423bf2f452fe4a26fb1fa5a23cbaff1c2cc2318..742c82c5ef7801a8f0805d4a3e6996515bf78a72 100644 --- a/ide/src/doc/md/quickstart_hiperf.md +++ b/ide/src/doc/md/quickstart_hiperf.md @@ -121,5 +121,15 @@ Hiperf 分为 process、thread、library、function 四层,调用栈均可在 ![GitHub Logo](../../figures/perf/perf_analysisjump.jpg) 如上图,右键点击 hiprofiler_plugins 可以跳转到下图 ![GitHub Logo](../../figures/perf/perf_jumpframe.jpg) -筛选面板新增 Hide Thread、Hide Thread State 筛选选项,Hiperf 可隐藏线程和线程状态。 +筛选面板包含 Hide Thread、Hide Thread State筛选选项、Hiperf 可隐藏线程和线程状态,以及新增Only Kernel 内核函数合并选项。 ![GitHub Logo](../../figures/perf/perf_hide.jpg) + +点击Only Kernel合并内核函数后,会使每个函数的Lib名不为[kernel.kallsyms]的从调用者中移除,只保留内核栈。 + +![GitHub Logo](../../figures/perf/perf_kernel.jpg) + +### SO导入获取符号所在行能力 + +在导入so符号化文件后,新增对elf文件中每个函数的地址定位到具体哪个源文件,以及显示该源文件的具体行号功能。 + +![GitHub Logo](../../figures/perf/perf_so.jpg) \ No newline at end of file diff --git a/ide/src/doc/md/quickstart_xpower.md b/ide/src/doc/md/quickstart_xpower.md index e3471349e196c0419f5aed3933270ef64b943cd5..9ed37e17fc2e7c47af866d18bd51c0c483cbe20a 100644 --- a/ide/src/doc/md/quickstart_xpower.md +++ b/ide/src/doc/md/quickstart_xpower.md @@ -6,25 +6,45 @@ Xpower用于查看系统整机和应用功耗数据,当前支持:电源信 #### Xpower 的抓取配置参数 -打开Start Xpower Record开关抓取Xpower数据。点击MessageType下拉框,可以选择需要抓取的类型(下拉框支持多选)。 -![GitHub Logo](../../figures/Xpower/Xpowerconfig.jpg) +打开Start Xpower Record开关抓取Xpower数据。点击Package下拉框,可以选择需要抓取的应用(仅支持单选) + +![GitHub Logo](../../figures/Xpower/xpowerpackage.jpg) + +配置项说明: + +- 下拉框内数据:应用包名。 + +选择后Trace command页面显示对应抓取命令 + +![GitHub Logo](../../figures/Xpower/xpowercmd.jpg) + + + +点击MessageType下拉框,可以选择需要抓取的类型(只有选择了应用才会出现COMPONENT_TOP、APP_STATISTIC、APP_DERAIL并且下拉框支持多选)。 +![GitHub Logo](../../figures/Xpower/xpowertype.jpg) 配置项说明: - REAL_BATTERY:电源信息。 - THERMAL_REPORT:热温度信息。 +- COMPONENT_TOP:每个器件的TOP应用。 +- APP_STATISTIC:应用每个器件的能耗信息。 +- APP_DETAIL:应用每个器件的详细信息。 -选择后Trace command页面显示对应抓取命令 -![GitHub Logo](../../figures/Xpower/xpowertracecommand.jpg) +选择后Trace command页面显示对应抓取命令: + +![GitHub Logo](../../figures/Xpower/xpowercmd1.jpg) ### Xpower 展示说明 将抓取的Xpower文件导入到HiSmartPerf工具中查看,查看系统整机和应用功耗情况。 + ![GitHub Logo](../../figures/Xpower/xpowertrace.jpg) ### Xpower泳道图说明——REAL_BATTERY 选择REAL_BATTERY会展示六条泳道: + ![GitHub Logo](../../figures/Xpower/xpowerbattery.jpg) - Battery.Capacity: 电池容量(单位mAh)。 @@ -34,9 +54,266 @@ Xpower用于查看系统整机和应用功耗数据,当前支持:电源信 - Battery.RealCurrent: 实时电流(单位mAh,充电时为正数,耗电时为负数)。 - Battery.Screen: 屏幕状态(亮屏1,灭屏0)。 +### system泳道图点选和框选功能 + +点击system下的任意通道图弹出Current Selection的tab页 + +![GitHub Logo](../../figures/Xpower/xpower_kx_system1.jpg) + +- StartTime(Relative):相对时间 +- StartTime(Absolute) :绝对时间 +- Value:值 +- Duration:持续时间 + +框选system下的任意时间泳道图可以弹出Xpower Counters和Xpowe Component Top两个tab页 + +Xpower Counters的tab页 + +![GitHub Logo](../../figures/Xpower/xpower_kx_system.jpg) + +- Name:器件的名字 + +- Delta value:增量值 + +- Rate /s:速率(单位:s) +- Weighted:加权平均值 +- avg value:平均值 +- Count:数值 +- First value:第一个值 +- Last value:最后一个值 +- Min value:最小值 +- Max value:最大值 + +Xpowe Component Top的tab页(此tab页为框选Battery.RealCurrent泳道图出现) + +![GitHub Logo](../../figures/Xpower/xpower_kx_top.jpg) + +根据选的的参数不同tab页的表头会发生变化,audio/bluetooth/flashlight/location/wifiscan表头为 + +- TimeStamp:时间戳 +- AppName:应用名 +- Background Duration:后台持续时间 +- Background Energy:后台能耗 +- Foreground Duration:前台持续时间 +- Foreground Energy:前台能耗 +- ScreenOff Duration:锁屏持续时间 +- ScreenOff Energy:锁屏能耗 +- ScreenOn Duration:亮屏持续时间 +- ScreenOn Energy:亮屏能耗 + +camera的表头为: + +- TimeStamp:时间戳 +- AppName:应用名 +- CameraId:相机id + +- Background Duration:后台持续时间 +- Background Energy:后台能耗 +- Foreground Duration:前台持续时间 +- Foreground Energy:前台能耗 +- ScreenOff Duration:锁屏持续时间 +- ScreenOff Energy:锁屏能耗 +- ScreenOn Duration:亮屏持续时间 +- ScreenOn Energy:亮屏能耗 + +CPU表头为: + +- TimeStamp:时间戳 +- AppName:应用名 +- UID:UID +- Load :负荷 + +- Background Duration:后台持续时间 +- Background Energy:后台能耗 +- Foreground Duration:前台持续时间 +- Foreground Energy:前台能耗 +- ScreenOff Duration:锁屏持续时间 +- ScreenOff Energy:锁屏能耗 +- ScreenOn Duration:亮屏持续时间 +- ScreenOn Energy:亮屏能耗 + +display/GPU表头 + +- TimeStamp:时间戳 +- AppName:应用名 +- Usage Duration:使用时长 +- Usage Energy:使用能耗 + ### Xpower泳道图说明——THERMAL_REPORT + 选择THERMAL_REPORT则展示两条泳道: - ![GitHub Logo](../../figures/Xpower/xpowerthermalreport.jpg) +![GitHub Logo](../../figures/Xpower/xpowerthermalreport.jpg) - ThermalReport.ShellTemp: 外壳温度(单位℃)。 - ThermalReport.ThermalLevel: 温度等级。 + +### Xpower泳道图说明——COMPONENT_TOP + +选择COMPONENT_TOP,框选Battery.RealCurrent则展示Xpower Component Top的tab页。 + +![GitHub Logo](../../figures/Xpower/xpowertop.jpg) + +- audio:audio的能耗 +- bluetooth:Bluetooth的能耗 +- flashlight:flashlight的能耗 +- location:location的能耗 +- wifi:wifi的能耗 +- camera:camera的能耗 +- cpu:cpu的能耗 +- display:display的能耗 +- gpu:gpu的能耗 + +### Xpower泳道图说明——APP_STATISTIC + +选择APP_STATISTIC则只有statistic泳道图有数据: + +![GitHub Logo](../../figures/Xpower/xpowerstatistic.jpg) + + + +- statistic:统计数据 + +### 系统泳道图的悬浮 + +鼠标悬浮至任意system的泳道图上鼠标旁边会悬浮当前值的大小 + +![GitHub Logo](../../figures/Xpower/xpower_xf_system.jpg) + +### Xpower泳道图说明——APP_DETAIL + +选择APP_DETAIL则有八条泳道图有数据: + +![GitHub Logo](../../figures/Xpower/xpowerdetail.jpg) + +![GitHub Logo](../../figures/Xpower/xpowerdetail2.jpg) + +- wifi packet:wifi的数据包。 +- WIFIBytes:wifi的字节数。 +- DisPlay:屏幕的刷新率。 +- Thread Count:线程统计。 +- Thread Energy:线程能耗。 +- Thread Load:线程负载。 +- Gpu Freq Count:GPU频率计数。 +- Gpu Freq:GPU频率。 + +### 应用泳道图的点选和框选 + +statistic泳道图的点选功能:点击statistic泳道图可以弹出Xpower Statistic Current Data的tab页 + +![GitHub Logo](../../figures/Xpower/xpower_dx_current.jpg) + +- Name:器件的名字 +- TimeStamp:时间戳 +- Duration:持续时间 +- Energy:能耗 + +WIFIPacket、WIFIPacket和DisPlay泳道图的点选功能:点击WIFIPacket、WIFIPacket和DisPlay泳道图可以弹出Current Selection的tab页 + +![GitHub Logo](../../figures/Xpower/xpower_dx_selection.jpg) + +- StartTime(Relative) :相对开始时间 +- StartTime(Absolute) :绝对开始时间 +- receiver:接收数据大小 +- send:发送数据大小 + +特别地:点击display的泳道图会出现屏幕刷新率的持续时间 + +![GitHub Logo](../../figures/Xpower/xpower_dx_display.jpg) + +Thread Load泳道图的点选功能 + +![GitHub Logo](../../figures/Xpower/xpower_dx_load.jpg) + +- ThreadName:线程名 +- TimeStamp:时间戳 +- Load:负载 +- Duration:持续时间 + +Thread Energy泳道图的点选功能: + +![GitHub Logo](../../figures/Xpower/xpower_dx_energy.jpg) + +- ThreadName:线程名 +- TimeStamp:时间戳 +- Energy:能耗 +- Duration:持续时间 + +GPU Freq泳道图的点选功能: + +![GitHub Logo](../../figures/Xpower/xpower_dx_freq.jpg) + +- Frequency:频率 +- TimeStamp:时间戳 +- RunTime:运行时间 +- IdleTime:休眠时间 + +Thread Count和Gpu Freq Count框选功能:框选Gpu Freq Count、Thread Count泳道图任意处会弹出Xpower Counters的tab页 + +![GitHub Logo](../../figures/Xpower/xpower_kx_counters.jpg) + +- Name:器件名字 +- Delta value:增量值 +- Rate/s:速率(单位:s) +- Weighted avg value:加权平均值 +- Count:数量 +- First value:第一个值 +- Last value:最后一个值 +- Min value:最小值 +- Max value:最大值 + +Statistics泳道图的框选功能:框选Statistics泳道图任意处会弹出Xpowe Statistics的tab页 + +![GitHub Logo](../../figures/Xpower/xpower_kx_Statistics.jpg) + +- Name:器件名 +- Count:数量: +- Avg_Energy:平均能耗 +- Max_Energy:最大能耗 +- Min_Energy:最小能耗 + +WIFIPackets、WIFIBytes和Display泳道图的框选功能:框选WIFIPackets、WIFIBytes和Display会出现三个Display Detail、WIFIPackets、WIFIBytes三个tab页,但表头均一致 + +- Name:名字(display为刷新率,WIFIPackets、WIFIBytes为收发数据) +- Count:数量(display为持续时间,WIFIPackets、WIFIBytes为收发的数据包个数活数据大小) +- Max:最大值(display为刷新率的最大持续时间,WIFIBytes为收发的数据包个数活数据最大值) +- Min:最小值(display为刷新率的最小持续时间,WIFIBytes为收发的数据包个数活数据最小值) +- Avg:平均值(display为刷新率的平均持续时间,WIFIBytes为收发的数据包个数活数据平均数) + +Thread energy泳道图的框选功能:框选Thread energy泳道图会弹出Xpowe Thread energy的tab页 + +![GitHub Logo](../../figures/Xpower/xpower_kx_energy.jpg) + +- ThreadName:线程名 +- Count:线程数 +- Avg Energy:平均能耗 +- Max Energy:最大能耗 +- Min Energy:最小能耗 + +Thread Load泳道图的框选功能:框选Thread Load泳道图会弹出Xpowe Thread Load的tab页 + +![GitHub Logo](../../figures/Xpower/xpower_kx_load.jpg) + +- ThreadName:线程名 +- Count:线程出现的次数 +- Avg Load:平均占比 +- Max Load:最大占比 +- Min Load:最小占比 + +Gpu Freq Count泳道图的框选功能:框选Thread energy泳道图会弹出Xpowe Gpu Frequency 的tab页 + +![GitHub Logo](../../figures/Xpower/xpower_kx_freq.jpg) + +- Frequency:频率 +- Count:数量 +- Avg RunTime:平均运行时间 +- Max RunTime:最大运行时间 +- Min RunTime:最小运行时间 +- Avg IdleTime:平均休眠时间 +- Max IdleTime:最大休眠时间 +- Min IdleTime:最小休眠时间 + +### 应用的鼠标悬浮 + +鼠标悬浮至应用的任意的泳道图上鼠标旁边会悬浮当前器件的简要信息 + +![GitHub Logo](../../figures/Xpower/xpower_xf.jpg) \ No newline at end of file diff --git a/ide/src/doc/quickstart_Application_operation_skills.html b/ide/src/doc/quickstart_Application_operation_skills.html index f5eaf5fc220331e43c4b28df8bcf5897623f10aa..3b33378c097e3bd6e7c7acdf87bd8b8755a41071 100644 --- a/ide/src/doc/quickstart_Application_operation_skills.html +++ b/ide/src/doc/quickstart_Application_operation_skills.html @@ -813,6 +813,10 @@ 第三部分,&link=true(固定格式)。 +
  • +
    支持打开的trace文件类型: 本工具命令抓取的hiprofiler_data.htrace、hitrace命令行工具抓取的xxx.systrace、xxx.sys等、以上类型的zip压缩文件(压缩包里必须为单文件,压缩算法支持ZIP_DEFLATED和ZIP_BZIP2)、hitrace -z参数生成的压缩trace
    +        
    +
  • 内容支持宽度可伸缩

    @@ -918,6 +922,49 @@
    ChainFlag:当前节点在调用链中的flag类型,C(Client)、S(Server)。
    + +

    用户自定义序列导入说明

    + +

    + 自定义序列导入功能支持查看自定义序列泳道及Tab页信息。 +

    +

    自定义插件使用步骤

    +

    打开UserPluginsRow开关

    +

    进入Flags页面,将UserPluginsRow开关置为Enable。
    + GitHub Logo +

    +

    导入trace文件,可以看到UserPluginRow泳道

    + GitHub Logo +

    点击上传按钮,上传配置好的json文件,根据json文件内容进行泳道绘制

    +

    注意:重复导入文件会清空泳道。
    + GitHub Logo
    + GitHub Logo +

    + +

    点选功能

    +

    点击泳道的trace点,Tab页 User Plugin展示json文件相关信息。
    + GitHub Logo +

    + +

    json文件格式

    + GitHub Logo
    + GitHub Logo + +

    注意:

    + + + + \ No newline at end of file diff --git a/ide/src/doc/quickstart_hiperf.html b/ide/src/doc/quickstart_hiperf.html index 1d4a901df123eaf03c12e90e5f97df53a4b611f7..f73ecd41bf0a912f1a5d61c299fc4d3bc46b36b5 100644 --- a/ide/src/doc/quickstart_hiperf.html +++ b/ide/src/doc/quickstart_hiperf.html @@ -969,9 +969,9 @@ Backtrace:栈顶的调用栈名称。

    Hiperf支持多种Options展示风格

    - 点击Perf Profile的Tab页底部的Options,会有四个CheckBox复选框。 + 点击Perf Profile的Tab页底部的Options,会有5个CheckBox复选框。
    - GitHub Logo + GitHub Logo