@gracker/smartperfetto 1.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +586 -0
- package/LICENSE +685 -0
- package/data/perfettoSqlDocs.json +33478 -0
- package/data/perfettoSqlIndex.json +9458 -0
- package/data/perfettoSqlIndex.light.json +13129 -0
- package/data/perfettoStdlibSymbols.json +677 -0
- package/dist/agent/agents/base/baseAgent.d.ts +378 -0
- package/dist/agent/agents/base/baseAgent.d.ts.map +1 -0
- package/dist/agent/agents/base/baseAgent.js +1484 -0
- package/dist/agent/agents/base/baseAgent.js.map +1 -0
- package/dist/agent/agents/base/baseSubAgent.d.ts +135 -0
- package/dist/agent/agents/base/baseSubAgent.d.ts.map +1 -0
- package/dist/agent/agents/base/baseSubAgent.js +483 -0
- package/dist/agent/agents/base/baseSubAgent.js.map +1 -0
- package/dist/agent/agents/baseExpertAgent.d.ts +37 -0
- package/dist/agent/agents/baseExpertAgent.d.ts.map +1 -0
- package/dist/agent/agents/baseExpertAgent.js +322 -0
- package/dist/agent/agents/baseExpertAgent.js.map +1 -0
- package/dist/agent/agents/domain/additionalAgents.d.ts +54 -0
- package/dist/agent/agents/domain/additionalAgents.d.ts.map +1 -0
- package/dist/agent/agents/domain/additionalAgents.js +292 -0
- package/dist/agent/agents/domain/additionalAgents.js.map +1 -0
- package/dist/agent/agents/domain/binderAgent.d.ts +27 -0
- package/dist/agent/agents/domain/binderAgent.d.ts.map +1 -0
- package/dist/agent/agents/domain/binderAgent.js +100 -0
- package/dist/agent/agents/domain/binderAgent.js.map +1 -0
- package/dist/agent/agents/domain/cpuAgent.d.ts +35 -0
- package/dist/agent/agents/domain/cpuAgent.d.ts.map +1 -0
- package/dist/agent/agents/domain/cpuAgent.js +163 -0
- package/dist/agent/agents/domain/cpuAgent.js.map +1 -0
- package/dist/agent/agents/domain/frameAgent.d.ts +59 -0
- package/dist/agent/agents/domain/frameAgent.d.ts.map +1 -0
- package/dist/agent/agents/domain/frameAgent.js +511 -0
- package/dist/agent/agents/domain/frameAgent.js.map +1 -0
- package/dist/agent/agents/domain/index.d.ts +92 -0
- package/dist/agent/agents/domain/index.d.ts.map +1 -0
- package/dist/agent/agents/domain/index.js +250 -0
- package/dist/agent/agents/domain/index.js.map +1 -0
- package/dist/agent/agents/domain/memoryAgent.d.ts +26 -0
- package/dist/agent/agents/domain/memoryAgent.d.ts.map +1 -0
- package/dist/agent/agents/domain/memoryAgent.js +94 -0
- package/dist/agent/agents/domain/memoryAgent.js.map +1 -0
- package/dist/agent/agents/domain/skillCatalog.d.ts +10 -0
- package/dist/agent/agents/domain/skillCatalog.d.ts.map +1 -0
- package/dist/agent/agents/domain/skillCatalog.js +66 -0
- package/dist/agent/agents/domain/skillCatalog.js.map +1 -0
- package/dist/agent/agents/evaluatorAgent.d.ts +76 -0
- package/dist/agent/agents/evaluatorAgent.d.ts.map +1 -0
- package/dist/agent/agents/evaluatorAgent.js +517 -0
- package/dist/agent/agents/evaluatorAgent.js.map +1 -0
- package/dist/agent/agents/index.d.ts +13 -0
- package/dist/agent/agents/index.d.ts.map +1 -0
- package/dist/agent/agents/index.js +25 -0
- package/dist/agent/agents/index.js.map +1 -0
- package/dist/agent/agents/iterationStrategyPlanner.d.ts +140 -0
- package/dist/agent/agents/iterationStrategyPlanner.d.ts.map +1 -0
- package/dist/agent/agents/iterationStrategyPlanner.js +359 -0
- package/dist/agent/agents/iterationStrategyPlanner.js.map +1 -0
- package/dist/agent/agents/plannerAgent.d.ts +56 -0
- package/dist/agent/agents/plannerAgent.d.ts.map +1 -0
- package/dist/agent/agents/plannerAgent.js +379 -0
- package/dist/agent/agents/plannerAgent.js.map +1 -0
- package/dist/agent/agents/scrollingExpertAgent.d.ts +11 -0
- package/dist/agent/agents/scrollingExpertAgent.d.ts.map +1 -0
- package/dist/agent/agents/scrollingExpertAgent.js +132 -0
- package/dist/agent/agents/scrollingExpertAgent.js.map +1 -0
- package/dist/agent/agents/tools/adbTools.d.ts +5 -0
- package/dist/agent/agents/tools/adbTools.d.ts.map +1 -0
- package/dist/agent/agents/tools/adbTools.js +326 -0
- package/dist/agent/agents/tools/adbTools.js.map +1 -0
- package/dist/agent/communication/agentMessageBus.d.ts +138 -0
- package/dist/agent/communication/agentMessageBus.d.ts.map +1 -0
- package/dist/agent/communication/agentMessageBus.js +542 -0
- package/dist/agent/communication/agentMessageBus.js.map +1 -0
- package/dist/agent/communication/index.d.ts +7 -0
- package/dist/agent/communication/index.d.ts.map +1 -0
- package/dist/agent/communication/index.js +15 -0
- package/dist/agent/communication/index.js.map +1 -0
- package/dist/agent/compaction/compactionTypes.d.ts +163 -0
- package/dist/agent/compaction/compactionTypes.d.ts.map +1 -0
- package/dist/agent/compaction/compactionTypes.js +32 -0
- package/dist/agent/compaction/compactionTypes.js.map +1 -0
- package/dist/agent/compaction/contextCompactor.d.ts +109 -0
- package/dist/agent/compaction/contextCompactor.d.ts.map +1 -0
- package/dist/agent/compaction/contextCompactor.js +225 -0
- package/dist/agent/compaction/contextCompactor.js.map +1 -0
- package/dist/agent/compaction/index.d.ts +10 -0
- package/dist/agent/compaction/index.d.ts.map +1 -0
- package/dist/agent/compaction/index.js +43 -0
- package/dist/agent/compaction/index.js.map +1 -0
- package/dist/agent/compaction/strategies/index.d.ts +5 -0
- package/dist/agent/compaction/strategies/index.d.ts.map +1 -0
- package/dist/agent/compaction/strategies/index.js +13 -0
- package/dist/agent/compaction/strategies/index.js.map +1 -0
- package/dist/agent/compaction/strategies/slidingWindowStrategy.d.ts +53 -0
- package/dist/agent/compaction/strategies/slidingWindowStrategy.d.ts.map +1 -0
- package/dist/agent/compaction/strategies/slidingWindowStrategy.js +237 -0
- package/dist/agent/compaction/strategies/slidingWindowStrategy.js.map +1 -0
- package/dist/agent/compaction/tokenEstimator.d.ts +78 -0
- package/dist/agent/compaction/tokenEstimator.d.ts.map +1 -0
- package/dist/agent/compaction/tokenEstimator.js +203 -0
- package/dist/agent/compaction/tokenEstimator.js.map +1 -0
- package/dist/agent/config/decisionThresholdManifest.d.ts +72 -0
- package/dist/agent/config/decisionThresholdManifest.d.ts.map +1 -0
- package/dist/agent/config/decisionThresholdManifest.js +77 -0
- package/dist/agent/config/decisionThresholdManifest.js.map +1 -0
- package/dist/agent/config/domainManifest.d.ts +77 -0
- package/dist/agent/config/domainManifest.d.ts.map +1 -0
- package/dist/agent/config/domainManifest.js +269 -0
- package/dist/agent/config/domainManifest.js.map +1 -0
- package/dist/agent/config/drillDownRegistry.d.ts +19 -0
- package/dist/agent/config/drillDownRegistry.d.ts.map +1 -0
- package/dist/agent/config/drillDownRegistry.js +118 -0
- package/dist/agent/config/drillDownRegistry.js.map +1 -0
- package/dist/agent/context/contextBuilder.d.ts +79 -0
- package/dist/agent/context/contextBuilder.d.ts.map +1 -0
- package/dist/agent/context/contextBuilder.js +273 -0
- package/dist/agent/context/contextBuilder.js.map +1 -0
- package/dist/agent/context/contextTypes.d.ts +121 -0
- package/dist/agent/context/contextTypes.d.ts.map +1 -0
- package/dist/agent/context/contextTypes.js +14 -0
- package/dist/agent/context/contextTypes.js.map +1 -0
- package/dist/agent/context/enhancedSessionContext.d.ts +283 -0
- package/dist/agent/context/enhancedSessionContext.d.ts.map +1 -0
- package/dist/agent/context/enhancedSessionContext.js +1636 -0
- package/dist/agent/context/enhancedSessionContext.js.map +1 -0
- package/dist/agent/context/entityStore.d.ts +374 -0
- package/dist/agent/context/entityStore.d.ts.map +1 -0
- package/dist/agent/context/entityStore.js +621 -0
- package/dist/agent/context/entityStore.js.map +1 -0
- package/dist/agent/context/focusStore.d.ts +229 -0
- package/dist/agent/context/focusStore.d.ts.map +1 -0
- package/dist/agent/context/focusStore.js +528 -0
- package/dist/agent/context/focusStore.js.map +1 -0
- package/dist/agent/context/index.d.ts +10 -0
- package/dist/agent/context/index.d.ts.map +1 -0
- package/dist/agent/context/index.js +42 -0
- package/dist/agent/context/index.js.map +1 -0
- package/dist/agent/context/policies/evaluatorPolicy.d.ts +22 -0
- package/dist/agent/context/policies/evaluatorPolicy.d.ts.map +1 -0
- package/dist/agent/context/policies/evaluatorPolicy.js +82 -0
- package/dist/agent/context/policies/evaluatorPolicy.js.map +1 -0
- package/dist/agent/context/policies/index.d.ts +7 -0
- package/dist/agent/context/policies/index.d.ts.map +1 -0
- package/dist/agent/context/policies/index.js +18 -0
- package/dist/agent/context/policies/index.js.map +1 -0
- package/dist/agent/context/policies/plannerPolicy.d.ts +27 -0
- package/dist/agent/context/policies/plannerPolicy.d.ts.map +1 -0
- package/dist/agent/context/policies/plannerPolicy.js +67 -0
- package/dist/agent/context/policies/plannerPolicy.js.map +1 -0
- package/dist/agent/context/policies/workerPolicy.d.ts +29 -0
- package/dist/agent/context/policies/workerPolicy.d.ts.map +1 -0
- package/dist/agent/context/policies/workerPolicy.js +99 -0
- package/dist/agent/context/policies/workerPolicy.js.map +1 -0
- package/dist/agent/core/circuitBreaker.d.ts +150 -0
- package/dist/agent/core/circuitBreaker.d.ts.map +1 -0
- package/dist/agent/core/circuitBreaker.js +500 -0
- package/dist/agent/core/circuitBreaker.js.map +1 -0
- package/dist/agent/core/conclusionContract.d.ts +61 -0
- package/dist/agent/core/conclusionContract.d.ts.map +1 -0
- package/dist/agent/core/conclusionContract.js +6 -0
- package/dist/agent/core/conclusionContract.js.map +1 -0
- package/dist/agent/core/conclusionGenerator.d.ts +42 -0
- package/dist/agent/core/conclusionGenerator.d.ts.map +1 -0
- package/dist/agent/core/conclusionGenerator.js +4109 -0
- package/dist/agent/core/conclusionGenerator.js.map +1 -0
- package/dist/agent/core/conclusionSceneTemplates.d.ts +8 -0
- package/dist/agent/core/conclusionSceneTemplates.d.ts.map +1 -0
- package/dist/agent/core/conclusionSceneTemplates.js +31 -0
- package/dist/agent/core/conclusionSceneTemplates.js.map +1 -0
- package/dist/agent/core/drillDownResolver.d.ts +67 -0
- package/dist/agent/core/drillDownResolver.d.ts.map +1 -0
- package/dist/agent/core/drillDownResolver.js +583 -0
- package/dist/agent/core/drillDownResolver.js.map +1 -0
- package/dist/agent/core/emittedEnvelopeRegistry.d.ts +75 -0
- package/dist/agent/core/emittedEnvelopeRegistry.d.ts.map +1 -0
- package/dist/agent/core/emittedEnvelopeRegistry.js +164 -0
- package/dist/agent/core/emittedEnvelopeRegistry.js.map +1 -0
- package/dist/agent/core/entityCapture.d.ts +53 -0
- package/dist/agent/core/entityCapture.d.ts.map +1 -0
- package/dist/agent/core/entityCapture.js +522 -0
- package/dist/agent/core/entityCapture.js.map +1 -0
- package/dist/agent/core/entityRegistry.d.ts +19 -0
- package/dist/agent/core/entityRegistry.d.ts.map +1 -0
- package/dist/agent/core/entityRegistry.js +102 -0
- package/dist/agent/core/entityRegistry.js.map +1 -0
- package/dist/agent/core/executors/analysisExecutor.d.ts +21 -0
- package/dist/agent/core/executors/analysisExecutor.d.ts.map +1 -0
- package/dist/agent/core/executors/analysisExecutor.js +6 -0
- package/dist/agent/core/executors/analysisExecutor.js.map +1 -0
- package/dist/agent/core/executors/clarifyExecutor.d.ts +42 -0
- package/dist/agent/core/executors/clarifyExecutor.d.ts.map +1 -0
- package/dist/agent/core/executors/clarifyExecutor.js +316 -0
- package/dist/agent/core/executors/clarifyExecutor.js.map +1 -0
- package/dist/agent/core/executors/comparisonExecutor.d.ts +39 -0
- package/dist/agent/core/executors/comparisonExecutor.d.ts.map +1 -0
- package/dist/agent/core/executors/comparisonExecutor.js +404 -0
- package/dist/agent/core/executors/comparisonExecutor.js.map +1 -0
- package/dist/agent/core/executors/directDrillDownExecutor.d.ts +56 -0
- package/dist/agent/core/executors/directDrillDownExecutor.d.ts.map +1 -0
- package/dist/agent/core/executors/directDrillDownExecutor.js +665 -0
- package/dist/agent/core/executors/directDrillDownExecutor.js.map +1 -0
- package/dist/agent/core/executors/directSkillExecutor.d.ts +106 -0
- package/dist/agent/core/executors/directSkillExecutor.d.ts.map +1 -0
- package/dist/agent/core/executors/directSkillExecutor.js +633 -0
- package/dist/agent/core/executors/directSkillExecutor.js.map +1 -0
- package/dist/agent/core/executors/extendExecutor.d.ts +50 -0
- package/dist/agent/core/executors/extendExecutor.d.ts.map +1 -0
- package/dist/agent/core/executors/extendExecutor.js +402 -0
- package/dist/agent/core/executors/extendExecutor.js.map +1 -0
- package/dist/agent/core/executors/hypothesisExecutor.d.ts +52 -0
- package/dist/agent/core/executors/hypothesisExecutor.d.ts.map +1 -0
- package/dist/agent/core/executors/hypothesisExecutor.js +564 -0
- package/dist/agent/core/executors/hypothesisExecutor.js.map +1 -0
- package/dist/agent/core/executors/index.d.ts +9 -0
- package/dist/agent/core/executors/index.d.ts.map +1 -0
- package/dist/agent/core/executors/index.js +15 -0
- package/dist/agent/core/executors/index.js.map +1 -0
- package/dist/agent/core/executors/strategy/strategyFrameEnvelopeCoordinator.d.ts +12 -0
- package/dist/agent/core/executors/strategy/strategyFrameEnvelopeCoordinator.d.ts.map +1 -0
- package/dist/agent/core/executors/strategy/strategyFrameEnvelopeCoordinator.js +186 -0
- package/dist/agent/core/executors/strategy/strategyFrameEnvelopeCoordinator.js.map +1 -0
- package/dist/agent/core/executors/strategy/strategyFrameMechanismCollector.d.ts +9 -0
- package/dist/agent/core/executors/strategy/strategyFrameMechanismCollector.d.ts.map +1 -0
- package/dist/agent/core/executors/strategy/strategyFrameMechanismCollector.js +123 -0
- package/dist/agent/core/executors/strategy/strategyFrameMechanismCollector.js.map +1 -0
- package/dist/agent/core/executors/strategy/strategyStagePlanner.d.ts +18 -0
- package/dist/agent/core/executors/strategy/strategyStagePlanner.d.ts.map +1 -0
- package/dist/agent/core/executors/strategy/strategyStagePlanner.js +69 -0
- package/dist/agent/core/executors/strategy/strategyStagePlanner.js.map +1 -0
- package/dist/agent/core/executors/strategy/strategyStageTaskBuilder.d.ts +14 -0
- package/dist/agent/core/executors/strategy/strategyStageTaskBuilder.d.ts.map +1 -0
- package/dist/agent/core/executors/strategy/strategyStageTaskBuilder.js +129 -0
- package/dist/agent/core/executors/strategy/strategyStageTaskBuilder.js.map +1 -0
- package/dist/agent/core/executors/strategyExecutor.d.ts +16 -0
- package/dist/agent/core/executors/strategyExecutor.d.ts.map +1 -0
- package/dist/agent/core/executors/strategyExecutor.js +377 -0
- package/dist/agent/core/executors/strategyExecutor.js.map +1 -0
- package/dist/agent/core/executors/traceConfigDetector.d.ts +28 -0
- package/dist/agent/core/executors/traceConfigDetector.d.ts.map +1 -0
- package/dist/agent/core/executors/traceConfigDetector.js +156 -0
- package/dist/agent/core/executors/traceConfigDetector.js.map +1 -0
- package/dist/agent/core/feedbackSynthesizer.d.ts +28 -0
- package/dist/agent/core/feedbackSynthesizer.d.ts.map +1 -0
- package/dist/agent/core/feedbackSynthesizer.js +841 -0
- package/dist/agent/core/feedbackSynthesizer.js.map +1 -0
- package/dist/agent/core/followUpHandler.d.ts +36 -0
- package/dist/agent/core/followUpHandler.d.ts.map +1 -0
- package/dist/agent/core/followUpHandler.js +413 -0
- package/dist/agent/core/followUpHandler.js.map +1 -0
- package/dist/agent/core/hypothesisGenerator.d.ts +45 -0
- package/dist/agent/core/hypothesisGenerator.d.ts.map +1 -0
- package/dist/agent/core/hypothesisGenerator.js +257 -0
- package/dist/agent/core/hypothesisGenerator.js.map +1 -0
- package/dist/agent/core/incrementalAnalyzer.d.ts +164 -0
- package/dist/agent/core/incrementalAnalyzer.d.ts.map +1 -0
- package/dist/agent/core/incrementalAnalyzer.js +382 -0
- package/dist/agent/core/incrementalAnalyzer.js.map +1 -0
- package/dist/agent/core/index.d.ts +25 -0
- package/dist/agent/core/index.d.ts.map +1 -0
- package/dist/agent/core/index.js +61 -0
- package/dist/agent/core/index.js.map +1 -0
- package/dist/agent/core/intentUnderstanding.d.ts +28 -0
- package/dist/agent/core/intentUnderstanding.d.ts.map +1 -0
- package/dist/agent/core/intentUnderstanding.js +451 -0
- package/dist/agent/core/intentUnderstanding.js.map +1 -0
- package/dist/agent/core/interventionController.d.ts +211 -0
- package/dist/agent/core/interventionController.d.ts.map +1 -0
- package/dist/agent/core/interventionController.js +477 -0
- package/dist/agent/core/interventionController.js.map +1 -0
- package/dist/agent/core/jankCauseSummarizer.d.ts +87 -0
- package/dist/agent/core/jankCauseSummarizer.d.ts.map +1 -0
- package/dist/agent/core/jankCauseSummarizer.js +432 -0
- package/dist/agent/core/jankCauseSummarizer.js.map +1 -0
- package/dist/agent/core/modelRouter.d.ts +164 -0
- package/dist/agent/core/modelRouter.d.ts.map +1 -0
- package/dist/agent/core/modelRouter.js +1169 -0
- package/dist/agent/core/modelRouter.js.map +1 -0
- package/dist/agent/core/modelRouterSingleton.d.ts +4 -0
- package/dist/agent/core/modelRouterSingleton.d.ts.map +1 -0
- package/dist/agent/core/modelRouterSingleton.js +20 -0
- package/dist/agent/core/modelRouterSingleton.js.map +1 -0
- package/dist/agent/core/orchestratorTypes.d.ts +506 -0
- package/dist/agent/core/orchestratorTypes.d.ts.map +1 -0
- package/dist/agent/core/orchestratorTypes.js +91 -0
- package/dist/agent/core/orchestratorTypes.js.map +1 -0
- package/dist/agent/core/pipelineExecutor.d.ts +154 -0
- package/dist/agent/core/pipelineExecutor.d.ts.map +1 -0
- package/dist/agent/core/pipelineExecutor.js +677 -0
- package/dist/agent/core/pipelineExecutor.js.map +1 -0
- package/dist/agent/core/scenePolicy.d.ts +3 -0
- package/dist/agent/core/scenePolicy.d.ts.map +1 -0
- package/dist/agent/core/scenePolicy.js +49 -0
- package/dist/agent/core/scenePolicy.js.map +1 -0
- package/dist/agent/core/sceneRouter.d.ts +8 -0
- package/dist/agent/core/sceneRouter.d.ts.map +1 -0
- package/dist/agent/core/sceneRouter.js +122 -0
- package/dist/agent/core/sceneRouter.js.map +1 -0
- package/dist/agent/core/sceneTaxonomy.d.ts +6 -0
- package/dist/agent/core/sceneTaxonomy.d.ts.map +1 -0
- package/dist/agent/core/sceneTaxonomy.js +83 -0
- package/dist/agent/core/sceneTaxonomy.js.map +1 -0
- package/dist/agent/core/sceneTemplateStore.d.ts +10 -0
- package/dist/agent/core/sceneTemplateStore.d.ts.map +1 -0
- package/dist/agent/core/sceneTemplateStore.js +244 -0
- package/dist/agent/core/sceneTemplateStore.js.map +1 -0
- package/dist/agent/core/sceneTemplateValidator.d.ts +22 -0
- package/dist/agent/core/sceneTemplateValidator.d.ts.map +1 -0
- package/dist/agent/core/sceneTemplateValidator.js +226 -0
- package/dist/agent/core/sceneTemplateValidator.js.map +1 -0
- package/dist/agent/core/sceneTypes.d.ts +53 -0
- package/dist/agent/core/sceneTypes.d.ts.map +1 -0
- package/dist/agent/core/sceneTypes.js +6 -0
- package/dist/agent/core/sceneTypes.js.map +1 -0
- package/dist/agent/core/stateMachine.d.ts +135 -0
- package/dist/agent/core/stateMachine.d.ts.map +1 -0
- package/dist/agent/core/stateMachine.js +516 -0
- package/dist/agent/core/stateMachine.js.map +1 -0
- package/dist/agent/core/strategySelector.d.ts +121 -0
- package/dist/agent/core/strategySelector.d.ts.map +1 -0
- package/dist/agent/core/strategySelector.js +344 -0
- package/dist/agent/core/strategySelector.js.map +1 -0
- package/dist/agent/core/taskGraphExecutor.d.ts +30 -0
- package/dist/agent/core/taskGraphExecutor.d.ts.map +1 -0
- package/dist/agent/core/taskGraphExecutor.js +142 -0
- package/dist/agent/core/taskGraphExecutor.js.map +1 -0
- package/dist/agent/core/taskGraphPlanner.d.ts +33 -0
- package/dist/agent/core/taskGraphPlanner.d.ts.map +1 -0
- package/dist/agent/core/taskGraphPlanner.js +312 -0
- package/dist/agent/core/taskGraphPlanner.js.map +1 -0
- package/dist/agent/decision/decisionTreeExecutor.d.ts +55 -0
- package/dist/agent/decision/decisionTreeExecutor.d.ts.map +1 -0
- package/dist/agent/decision/decisionTreeExecutor.js +250 -0
- package/dist/agent/decision/decisionTreeExecutor.js.map +1 -0
- package/dist/agent/decision/decisionTreeStageExecutor.d.ts +65 -0
- package/dist/agent/decision/decisionTreeStageExecutor.d.ts.map +1 -0
- package/dist/agent/decision/decisionTreeStageExecutor.js +286 -0
- package/dist/agent/decision/decisionTreeStageExecutor.js.map +1 -0
- package/dist/agent/decision/index.d.ts +27 -0
- package/dist/agent/decision/index.d.ts.map +1 -0
- package/dist/agent/decision/index.js +70 -0
- package/dist/agent/decision/index.js.map +1 -0
- package/dist/agent/decision/skillExecutorAdapter.d.ts +89 -0
- package/dist/agent/decision/skillExecutorAdapter.d.ts.map +1 -0
- package/dist/agent/decision/skillExecutorAdapter.js +447 -0
- package/dist/agent/decision/skillExecutorAdapter.js.map +1 -0
- package/dist/agent/decision/trees/index.d.ts +8 -0
- package/dist/agent/decision/trees/index.d.ts.map +1 -0
- package/dist/agent/decision/trees/index.js +16 -0
- package/dist/agent/decision/trees/index.js.map +1 -0
- package/dist/agent/decision/trees/launchDecisionTree.d.ts +7 -0
- package/dist/agent/decision/trees/launchDecisionTree.d.ts.map +1 -0
- package/dist/agent/decision/trees/launchDecisionTree.js +670 -0
- package/dist/agent/decision/trees/launchDecisionTree.js.map +1 -0
- package/dist/agent/decision/trees/scrollingDecisionTree.d.ts +7 -0
- package/dist/agent/decision/trees/scrollingDecisionTree.d.ts.map +1 -0
- package/dist/agent/decision/trees/scrollingDecisionTree.js +698 -0
- package/dist/agent/decision/trees/scrollingDecisionTree.js.map +1 -0
- package/dist/agent/decision/types.d.ts +191 -0
- package/dist/agent/decision/types.d.ts.map +1 -0
- package/dist/agent/decision/types.js +6 -0
- package/dist/agent/decision/types.js.map +1 -0
- package/dist/agent/detectors/architectureDetector.d.ts +31 -0
- package/dist/agent/detectors/architectureDetector.d.ts.map +1 -0
- package/dist/agent/detectors/architectureDetector.js +190 -0
- package/dist/agent/detectors/architectureDetector.js.map +1 -0
- package/dist/agent/detectors/index.d.ts +11 -0
- package/dist/agent/detectors/index.d.ts.map +1 -0
- package/dist/agent/detectors/index.js +36 -0
- package/dist/agent/detectors/index.js.map +1 -0
- package/dist/agent/detectors/types.d.ts +113 -0
- package/dist/agent/detectors/types.d.ts.map +1 -0
- package/dist/agent/detectors/types.js +6 -0
- package/dist/agent/detectors/types.js.map +1 -0
- package/dist/agent/evalSystem.d.ts +61 -0
- package/dist/agent/evalSystem.d.ts.map +1 -0
- package/dist/agent/evalSystem.js +210 -0
- package/dist/agent/evalSystem.js.map +1 -0
- package/dist/agent/experts/base/baseExpert.d.ts +108 -0
- package/dist/agent/experts/base/baseExpert.d.ts.map +1 -0
- package/dist/agent/experts/base/baseExpert.js +359 -0
- package/dist/agent/experts/base/baseExpert.js.map +1 -0
- package/dist/agent/experts/base/index.d.ts +9 -0
- package/dist/agent/experts/base/index.d.ts.map +1 -0
- package/dist/agent/experts/base/index.js +15 -0
- package/dist/agent/experts/base/index.js.map +1 -0
- package/dist/agent/experts/base/types.d.ts +202 -0
- package/dist/agent/experts/base/types.d.ts.map +1 -0
- package/dist/agent/experts/base/types.js +6 -0
- package/dist/agent/experts/base/types.js.map +1 -0
- package/dist/agent/experts/crossDomain/baseCrossDomainExpert.d.ts +113 -0
- package/dist/agent/experts/crossDomain/baseCrossDomainExpert.d.ts.map +1 -0
- package/dist/agent/experts/crossDomain/baseCrossDomainExpert.js +412 -0
- package/dist/agent/experts/crossDomain/baseCrossDomainExpert.js.map +1 -0
- package/dist/agent/experts/crossDomain/dialogueProtocol.d.ts +164 -0
- package/dist/agent/experts/crossDomain/dialogueProtocol.d.ts.map +1 -0
- package/dist/agent/experts/crossDomain/dialogueProtocol.js +390 -0
- package/dist/agent/experts/crossDomain/dialogueProtocol.js.map +1 -0
- package/dist/agent/experts/crossDomain/experts/performanceExpert.d.ts +119 -0
- package/dist/agent/experts/crossDomain/experts/performanceExpert.d.ts.map +1 -0
- package/dist/agent/experts/crossDomain/experts/performanceExpert.js +736 -0
- package/dist/agent/experts/crossDomain/experts/performanceExpert.js.map +1 -0
- package/dist/agent/experts/crossDomain/hypothesisManager.d.ts +105 -0
- package/dist/agent/experts/crossDomain/hypothesisManager.d.ts.map +1 -0
- package/dist/agent/experts/crossDomain/hypothesisManager.js +283 -0
- package/dist/agent/experts/crossDomain/hypothesisManager.js.map +1 -0
- package/dist/agent/experts/crossDomain/index.d.ts +18 -0
- package/dist/agent/experts/crossDomain/index.d.ts.map +1 -0
- package/dist/agent/experts/crossDomain/index.js +28 -0
- package/dist/agent/experts/crossDomain/index.js.map +1 -0
- package/dist/agent/experts/crossDomain/moduleCatalog.d.ts +97 -0
- package/dist/agent/experts/crossDomain/moduleCatalog.d.ts.map +1 -0
- package/dist/agent/experts/crossDomain/moduleCatalog.js +453 -0
- package/dist/agent/experts/crossDomain/moduleCatalog.js.map +1 -0
- package/dist/agent/experts/crossDomain/moduleExpertInvoker.d.ts +149 -0
- package/dist/agent/experts/crossDomain/moduleExpertInvoker.d.ts.map +1 -0
- package/dist/agent/experts/crossDomain/moduleExpertInvoker.js +582 -0
- package/dist/agent/experts/crossDomain/moduleExpertInvoker.js.map +1 -0
- package/dist/agent/experts/crossDomain/types.d.ts +369 -0
- package/dist/agent/experts/crossDomain/types.d.ts.map +1 -0
- package/dist/agent/experts/crossDomain/types.js +6 -0
- package/dist/agent/experts/crossDomain/types.js.map +1 -0
- package/dist/agent/experts/index.d.ts +81 -0
- package/dist/agent/experts/index.d.ts.map +1 -0
- package/dist/agent/experts/index.js +222 -0
- package/dist/agent/experts/index.js.map +1 -0
- package/dist/agent/experts/interactionExpert.d.ts +66 -0
- package/dist/agent/experts/interactionExpert.d.ts.map +1 -0
- package/dist/agent/experts/interactionExpert.js +280 -0
- package/dist/agent/experts/interactionExpert.js.map +1 -0
- package/dist/agent/experts/launchExpert.d.ts +73 -0
- package/dist/agent/experts/launchExpert.d.ts.map +1 -0
- package/dist/agent/experts/launchExpert.js +411 -0
- package/dist/agent/experts/launchExpert.js.map +1 -0
- package/dist/agent/experts/systemExpert.d.ts +81 -0
- package/dist/agent/experts/systemExpert.d.ts.map +1 -0
- package/dist/agent/experts/systemExpert.js +507 -0
- package/dist/agent/experts/systemExpert.js.map +1 -0
- package/dist/agent/fork/forkManager.d.ts +161 -0
- package/dist/agent/fork/forkManager.d.ts.map +1 -0
- package/dist/agent/fork/forkManager.js +721 -0
- package/dist/agent/fork/forkManager.js.map +1 -0
- package/dist/agent/fork/forkTypes.d.ts +274 -0
- package/dist/agent/fork/forkTypes.d.ts.map +1 -0
- package/dist/agent/fork/forkTypes.js +18 -0
- package/dist/agent/fork/forkTypes.js.map +1 -0
- package/dist/agent/fork/index.d.ts +10 -0
- package/dist/agent/fork/index.d.ts.map +1 -0
- package/dist/agent/fork/index.js +47 -0
- package/dist/agent/fork/index.js.map +1 -0
- package/dist/agent/fork/mergeStrategies.d.ts +115 -0
- package/dist/agent/fork/mergeStrategies.d.ts.map +1 -0
- package/dist/agent/fork/mergeStrategies.js +404 -0
- package/dist/agent/fork/mergeStrategies.js.map +1 -0
- package/dist/agent/fork/sessionTree.d.ts +141 -0
- package/dist/agent/fork/sessionTree.d.ts.map +1 -0
- package/dist/agent/fork/sessionTree.js +443 -0
- package/dist/agent/fork/sessionTree.js.map +1 -0
- package/dist/agent/hooks/hookContext.d.ts +19 -0
- package/dist/agent/hooks/hookContext.d.ts.map +1 -0
- package/dist/agent/hooks/hookContext.js +67 -0
- package/dist/agent/hooks/hookContext.js.map +1 -0
- package/dist/agent/hooks/hookRegistry.d.ts +73 -0
- package/dist/agent/hooks/hookRegistry.d.ts.map +1 -0
- package/dist/agent/hooks/hookRegistry.js +271 -0
- package/dist/agent/hooks/hookRegistry.js.map +1 -0
- package/dist/agent/hooks/hookTypes.d.ts +186 -0
- package/dist/agent/hooks/hookTypes.d.ts.map +1 -0
- package/dist/agent/hooks/hookTypes.js +24 -0
- package/dist/agent/hooks/hookTypes.js.map +1 -0
- package/dist/agent/hooks/index.d.ts +10 -0
- package/dist/agent/hooks/index.d.ts.map +1 -0
- package/dist/agent/hooks/index.js +41 -0
- package/dist/agent/hooks/index.js.map +1 -0
- package/dist/agent/hooks/middleware/index.d.ts +6 -0
- package/dist/agent/hooks/middleware/index.d.ts.map +1 -0
- package/dist/agent/hooks/middleware/index.js +17 -0
- package/dist/agent/hooks/middleware/index.js.map +1 -0
- package/dist/agent/hooks/middleware/loggingMiddleware.d.ts +27 -0
- package/dist/agent/hooks/middleware/loggingMiddleware.d.ts.map +1 -0
- package/dist/agent/hooks/middleware/loggingMiddleware.js +104 -0
- package/dist/agent/hooks/middleware/loggingMiddleware.js.map +1 -0
- package/dist/agent/hooks/middleware/timingMiddleware.d.ts +56 -0
- package/dist/agent/hooks/middleware/timingMiddleware.d.ts.map +1 -0
- package/dist/agent/hooks/middleware/timingMiddleware.js +171 -0
- package/dist/agent/hooks/middleware/timingMiddleware.js.map +1 -0
- package/dist/agent/index.d.ts +15 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +88 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/llmAdapter.d.ts +33 -0
- package/dist/agent/llmAdapter.d.ts.map +1 -0
- package/dist/agent/llmAdapter.js +257 -0
- package/dist/agent/llmAdapter.js.map +1 -0
- package/dist/agent/scene/sceneAnalysisJobRunner.d.ts +106 -0
- package/dist/agent/scene/sceneAnalysisJobRunner.d.ts.map +1 -0
- package/dist/agent/scene/sceneAnalysisJobRunner.js +201 -0
- package/dist/agent/scene/sceneAnalysisJobRunner.js.map +1 -0
- package/dist/agent/scene/sceneCostEstimator.d.ts +33 -0
- package/dist/agent/scene/sceneCostEstimator.d.ts.map +1 -0
- package/dist/agent/scene/sceneCostEstimator.js +42 -0
- package/dist/agent/scene/sceneCostEstimator.js.map +1 -0
- package/dist/agent/scene/sceneIntervalBuilder.d.ts +37 -0
- package/dist/agent/scene/sceneIntervalBuilder.d.ts.map +1 -0
- package/dist/agent/scene/sceneIntervalBuilder.js +748 -0
- package/dist/agent/scene/sceneIntervalBuilder.js.map +1 -0
- package/dist/agent/scene/sceneStage1Runner.d.ts +47 -0
- package/dist/agent/scene/sceneStage1Runner.d.ts.map +1 -0
- package/dist/agent/scene/sceneStage1Runner.js +49 -0
- package/dist/agent/scene/sceneStage1Runner.js.map +1 -0
- package/dist/agent/scene/sceneStage3Summarizer.d.ts +11 -0
- package/dist/agent/scene/sceneStage3Summarizer.d.ts.map +1 -0
- package/dist/agent/scene/sceneStage3Summarizer.js +155 -0
- package/dist/agent/scene/sceneStage3Summarizer.js.map +1 -0
- package/dist/agent/scene/sceneStoryService.d.ts +168 -0
- package/dist/agent/scene/sceneStoryService.d.ts.map +1 -0
- package/dist/agent/scene/sceneStoryService.js +623 -0
- package/dist/agent/scene/sceneStoryService.js.map +1 -0
- package/dist/agent/scene/sceneTraceDurationProbe.d.ts +16 -0
- package/dist/agent/scene/sceneTraceDurationProbe.d.ts.map +1 -0
- package/dist/agent/scene/sceneTraceDurationProbe.js +22 -0
- package/dist/agent/scene/sceneTraceDurationProbe.js.map +1 -0
- package/dist/agent/scene/traceHash.d.ts +23 -0
- package/dist/agent/scene/traceHash.d.ts.map +1 -0
- package/dist/agent/scene/traceHash.js +65 -0
- package/dist/agent/scene/traceHash.js.map +1 -0
- package/dist/agent/scene/types.d.ts +199 -0
- package/dist/agent/scene/types.d.ts.map +1 -0
- package/dist/agent/scene/types.js +6 -0
- package/dist/agent/scene/types.js.map +1 -0
- package/dist/agent/state/checkpointManager.d.ts +85 -0
- package/dist/agent/state/checkpointManager.d.ts.map +1 -0
- package/dist/agent/state/checkpointManager.js +339 -0
- package/dist/agent/state/checkpointManager.js.map +1 -0
- package/dist/agent/state/index.d.ts +11 -0
- package/dist/agent/state/index.d.ts.map +1 -0
- package/dist/agent/state/index.js +21 -0
- package/dist/agent/state/index.js.map +1 -0
- package/dist/agent/state/sessionStore.d.ts +126 -0
- package/dist/agent/state/sessionStore.d.ts.map +1 -0
- package/dist/agent/state/sessionStore.js +440 -0
- package/dist/agent/state/sessionStore.js.map +1 -0
- package/dist/agent/state/traceAgentState.d.ts +125 -0
- package/dist/agent/state/traceAgentState.d.ts.map +1 -0
- package/dist/agent/state/traceAgentState.js +173 -0
- package/dist/agent/state/traceAgentState.js.map +1 -0
- package/dist/agent/strategies/helpers.d.ts +44 -0
- package/dist/agent/strategies/helpers.d.ts.map +1 -0
- package/dist/agent/strategies/helpers.js +138 -0
- package/dist/agent/strategies/helpers.js.map +1 -0
- package/dist/agent/strategies/index.d.ts +15 -0
- package/dist/agent/strategies/index.d.ts.map +1 -0
- package/dist/agent/strategies/index.js +23 -0
- package/dist/agent/strategies/index.js.map +1 -0
- package/dist/agent/strategies/interactionStrategy.d.ts +3 -0
- package/dist/agent/strategies/interactionStrategy.d.ts.map +1 -0
- package/dist/agent/strategies/interactionStrategy.js +242 -0
- package/dist/agent/strategies/interactionStrategy.js.map +1 -0
- package/dist/agent/strategies/registry.d.ts +110 -0
- package/dist/agent/strategies/registry.d.ts.map +1 -0
- package/dist/agent/strategies/registry.js +264 -0
- package/dist/agent/strategies/registry.js.map +1 -0
- package/dist/agent/strategies/sceneReconstructionStrategy.d.ts +4 -0
- package/dist/agent/strategies/sceneReconstructionStrategy.d.ts.map +1 -0
- package/dist/agent/strategies/sceneReconstructionStrategy.js +593 -0
- package/dist/agent/strategies/sceneReconstructionStrategy.js.map +1 -0
- package/dist/agent/strategies/scrollingStrategy.d.ts +3 -0
- package/dist/agent/strategies/scrollingStrategy.d.ts.map +1 -0
- package/dist/agent/strategies/scrollingStrategy.js +414 -0
- package/dist/agent/strategies/scrollingStrategy.js.map +1 -0
- package/dist/agent/strategies/startupStrategy.d.ts +3 -0
- package/dist/agent/strategies/startupStrategy.d.ts.map +1 -0
- package/dist/agent/strategies/startupStrategy.js +495 -0
- package/dist/agent/strategies/startupStrategy.js.map +1 -0
- package/dist/agent/strategies/types.d.ts +156 -0
- package/dist/agent/strategies/types.d.ts.map +1 -0
- package/dist/agent/strategies/types.js +6 -0
- package/dist/agent/strategies/types.js.map +1 -0
- package/dist/agent/toolRegistry.d.ts +4 -0
- package/dist/agent/toolRegistry.d.ts.map +1 -0
- package/dist/agent/toolRegistry.js +45 -0
- package/dist/agent/toolRegistry.js.map +1 -0
- package/dist/agent/tools/dataStats.d.ts +23 -0
- package/dist/agent/tools/dataStats.d.ts.map +1 -0
- package/dist/agent/tools/dataStats.js +123 -0
- package/dist/agent/tools/dataStats.js.map +1 -0
- package/dist/agent/tools/frameAnalyzer.d.ts +45 -0
- package/dist/agent/tools/frameAnalyzer.d.ts.map +1 -0
- package/dist/agent/tools/frameAnalyzer.js +338 -0
- package/dist/agent/tools/frameAnalyzer.js.map +1 -0
- package/dist/agent/tools/index.d.ts +6 -0
- package/dist/agent/tools/index.d.ts.map +1 -0
- package/dist/agent/tools/index.js +31 -0
- package/dist/agent/tools/index.js.map +1 -0
- package/dist/agent/tools/skillInvoker.d.ts +50 -0
- package/dist/agent/tools/skillInvoker.d.ts.map +1 -0
- package/dist/agent/tools/skillInvoker.js +279 -0
- package/dist/agent/tools/skillInvoker.js.map +1 -0
- package/dist/agent/tools/sqlExecutor.d.ts +12 -0
- package/dist/agent/tools/sqlExecutor.d.ts.map +1 -0
- package/dist/agent/tools/sqlExecutor.js +193 -0
- package/dist/agent/tools/sqlExecutor.js.map +1 -0
- package/dist/agent/tools/sqlGenerator.d.ts +154 -0
- package/dist/agent/tools/sqlGenerator.d.ts.map +1 -0
- package/dist/agent/tools/sqlGenerator.js +449 -0
- package/dist/agent/tools/sqlGenerator.js.map +1 -0
- package/dist/agent/tools/sqlValidator.d.ts +149 -0
- package/dist/agent/tools/sqlValidator.d.ts.map +1 -0
- package/dist/agent/tools/sqlValidator.js +376 -0
- package/dist/agent/tools/sqlValidator.js.map +1 -0
- package/dist/agent/traceRecorder.d.ts +42 -0
- package/dist/agent/traceRecorder.d.ts.map +1 -0
- package/dist/agent/traceRecorder.js +122 -0
- package/dist/agent/traceRecorder.js.map +1 -0
- package/dist/agent/types/agentProtocol.d.ts +377 -0
- package/dist/agent/types/agentProtocol.d.ts.map +1 -0
- package/dist/agent/types/agentProtocol.js +102 -0
- package/dist/agent/types/agentProtocol.js.map +1 -0
- package/dist/agent/types/jankCause.d.ts +47 -0
- package/dist/agent/types/jankCause.d.ts.map +1 -0
- package/dist/agent/types/jankCause.js +6 -0
- package/dist/agent/types/jankCause.js.map +1 -0
- package/dist/agent/types.d.ts +725 -0
- package/dist/agent/types.d.ts.map +1 -0
- package/dist/agent/types.js +63 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/agentOpenAI/index.d.ts +4 -0
- package/dist/agentOpenAI/index.d.ts.map +1 -0
- package/dist/agentOpenAI/index.js +17 -0
- package/dist/agentOpenAI/index.js.map +1 -0
- package/dist/agentOpenAI/mimoReasoningCompat.d.ts +9 -0
- package/dist/agentOpenAI/mimoReasoningCompat.d.ts.map +1 -0
- package/dist/agentOpenAI/mimoReasoningCompat.js +367 -0
- package/dist/agentOpenAI/mimoReasoningCompat.js.map +1 -0
- package/dist/agentOpenAI/openAiComplexityClassifier.d.ts +18 -0
- package/dist/agentOpenAI/openAiComplexityClassifier.d.ts.map +1 -0
- package/dist/agentOpenAI/openAiComplexityClassifier.js +102 -0
- package/dist/agentOpenAI/openAiComplexityClassifier.js.map +1 -0
- package/dist/agentOpenAI/openAiConfig.d.ts +38 -0
- package/dist/agentOpenAI/openAiConfig.d.ts.map +1 -0
- package/dist/agentOpenAI/openAiConfig.js +104 -0
- package/dist/agentOpenAI/openAiConfig.js.map +1 -0
- package/dist/agentOpenAI/openAiRuntime.d.ts +99 -0
- package/dist/agentOpenAI/openAiRuntime.d.ts.map +1 -0
- package/dist/agentOpenAI/openAiRuntime.js +1440 -0
- package/dist/agentOpenAI/openAiRuntime.js.map +1 -0
- package/dist/agentOpenAI/openAiToolAdapter.d.ts +9 -0
- package/dist/agentOpenAI/openAiToolAdapter.d.ts.map +1 -0
- package/dist/agentOpenAI/openAiToolAdapter.js +111 -0
- package/dist/agentOpenAI/openAiToolAdapter.js.map +1 -0
- package/dist/agentRuntime/envCredentialSources.d.ts +6 -0
- package/dist/agentRuntime/envCredentialSources.d.ts.map +1 -0
- package/dist/agentRuntime/envCredentialSources.js +104 -0
- package/dist/agentRuntime/envCredentialSources.js.map +1 -0
- package/dist/agentRuntime/index.d.ts +2 -0
- package/dist/agentRuntime/index.d.ts.map +1 -0
- package/dist/agentRuntime/index.js +10 -0
- package/dist/agentRuntime/index.js.map +1 -0
- package/dist/agentRuntime/runtimeHealth.d.ts +65 -0
- package/dist/agentRuntime/runtimeHealth.d.ts.map +1 -0
- package/dist/agentRuntime/runtimeHealth.js +58 -0
- package/dist/agentRuntime/runtimeHealth.js.map +1 -0
- package/dist/agentRuntime/runtimeSelection.d.ts +25 -0
- package/dist/agentRuntime/runtimeSelection.d.ts.map +1 -0
- package/dist/agentRuntime/runtimeSelection.js +66 -0
- package/dist/agentRuntime/runtimeSelection.js.map +1 -0
- package/dist/agentv3/__mocks__/claude-agent-sdk.d.ts +25 -0
- package/dist/agentv3/__mocks__/claude-agent-sdk.d.ts.map +1 -0
- package/dist/agentv3/__mocks__/claude-agent-sdk.js +48 -0
- package/dist/agentv3/__mocks__/claude-agent-sdk.js.map +1 -0
- package/dist/agentv3/activePhaseReminder.d.ts +12 -0
- package/dist/agentv3/activePhaseReminder.d.ts.map +1 -0
- package/dist/agentv3/activePhaseReminder.js +73 -0
- package/dist/agentv3/activePhaseReminder.js.map +1 -0
- package/dist/agentv3/agentMetrics.d.ts +114 -0
- package/dist/agentv3/agentMetrics.d.ts.map +1 -0
- package/dist/agentv3/agentMetrics.js +262 -0
- package/dist/agentv3/agentMetrics.js.map +1 -0
- package/dist/agentv3/analysisPatternMemory.d.ts +146 -0
- package/dist/agentv3/analysisPatternMemory.d.ts.map +1 -0
- package/dist/agentv3/analysisPatternMemory.js +860 -0
- package/dist/agentv3/analysisPatternMemory.js.map +1 -0
- package/dist/agentv3/analysisTermination.d.ts +21 -0
- package/dist/agentv3/analysisTermination.d.ts.map +1 -0
- package/dist/agentv3/analysisTermination.js +97 -0
- package/dist/agentv3/analysisTermination.js.map +1 -0
- package/dist/agentv3/artifactStore.d.ts +131 -0
- package/dist/agentv3/artifactStore.d.ts.map +1 -0
- package/dist/agentv3/artifactStore.js +208 -0
- package/dist/agentv3/artifactStore.js.map +1 -0
- package/dist/agentv3/claudeAgentDefinitions.d.ts +44 -0
- package/dist/agentv3/claudeAgentDefinitions.d.ts.map +1 -0
- package/dist/agentv3/claudeAgentDefinitions.js +209 -0
- package/dist/agentv3/claudeAgentDefinitions.js.map +1 -0
- package/dist/agentv3/claudeConfig.d.ts +156 -0
- package/dist/agentv3/claudeConfig.d.ts.map +1 -0
- package/dist/agentv3/claudeConfig.js +553 -0
- package/dist/agentv3/claudeConfig.js.map +1 -0
- package/dist/agentv3/claudeFindingExtractor.d.ts +15 -0
- package/dist/agentv3/claudeFindingExtractor.d.ts.map +1 -0
- package/dist/agentv3/claudeFindingExtractor.js +150 -0
- package/dist/agentv3/claudeFindingExtractor.js.map +1 -0
- package/dist/agentv3/claudeMcpServer.d.ts +89 -0
- package/dist/agentv3/claudeMcpServer.d.ts.map +1 -0
- package/dist/agentv3/claudeMcpServer.js +3785 -0
- package/dist/agentv3/claudeMcpServer.js.map +1 -0
- package/dist/agentv3/claudeRuntime.d.ts +137 -0
- package/dist/agentv3/claudeRuntime.d.ts.map +1 -0
- package/dist/agentv3/claudeRuntime.js +2541 -0
- package/dist/agentv3/claudeRuntime.js.map +1 -0
- package/dist/agentv3/claudeSseBridge.d.ts +23 -0
- package/dist/agentv3/claudeSseBridge.d.ts.map +1 -0
- package/dist/agentv3/claudeSseBridge.js +385 -0
- package/dist/agentv3/claudeSseBridge.js.map +1 -0
- package/dist/agentv3/claudeSystemPrompt.d.ts +65 -0
- package/dist/agentv3/claudeSystemPrompt.d.ts.map +1 -0
- package/dist/agentv3/claudeSystemPrompt.js +486 -0
- package/dist/agentv3/claudeSystemPrompt.js.map +1 -0
- package/dist/agentv3/claudeVerifier.d.ts +82 -0
- package/dist/agentv3/claudeVerifier.d.ts.map +1 -0
- package/dist/agentv3/claudeVerifier.js +1047 -0
- package/dist/agentv3/claudeVerifier.js.map +1 -0
- package/dist/agentv3/contextTokenMeter.d.ts +78 -0
- package/dist/agentv3/contextTokenMeter.d.ts.map +1 -0
- package/dist/agentv3/contextTokenMeter.js +88 -0
- package/dist/agentv3/contextTokenMeter.js.map +1 -0
- package/dist/agentv3/focusAppDetector.d.ts +22 -0
- package/dist/agentv3/focusAppDetector.d.ts.map +1 -0
- package/dist/agentv3/focusAppDetector.js +208 -0
- package/dist/agentv3/focusAppDetector.js.map +1 -0
- package/dist/agentv3/index.d.ts +6 -0
- package/dist/agentv3/index.d.ts.map +1 -0
- package/dist/agentv3/index.js +16 -0
- package/dist/agentv3/index.js.map +1 -0
- package/dist/agentv3/mcpToolRegistry.d.ts +90 -0
- package/dist/agentv3/mcpToolRegistry.d.ts.map +1 -0
- package/dist/agentv3/mcpToolRegistry.js +152 -0
- package/dist/agentv3/mcpToolRegistry.js.map +1 -0
- package/dist/agentv3/outputLanguage.d.ts +6 -0
- package/dist/agentv3/outputLanguage.d.ts.map +1 -0
- package/dist/agentv3/outputLanguage.js +37 -0
- package/dist/agentv3/outputLanguage.js.map +1 -0
- package/dist/agentv3/phaseHintMatcher.d.ts +36 -0
- package/dist/agentv3/phaseHintMatcher.d.ts.map +1 -0
- package/dist/agentv3/phaseHintMatcher.js +48 -0
- package/dist/agentv3/phaseHintMatcher.js.map +1 -0
- package/dist/agentv3/projectMemory.d.ts +80 -0
- package/dist/agentv3/projectMemory.d.ts.map +1 -0
- package/dist/agentv3/projectMemory.js +334 -0
- package/dist/agentv3/projectMemory.js.map +1 -0
- package/dist/agentv3/queryComplexityClassifier.d.ts +21 -0
- package/dist/agentv3/queryComplexityClassifier.d.ts.map +1 -0
- package/dist/agentv3/queryComplexityClassifier.js +196 -0
- package/dist/agentv3/queryComplexityClassifier.js.map +1 -0
- package/dist/agentv3/rawSqlNormalizer.d.ts +11 -0
- package/dist/agentv3/rawSqlNormalizer.d.ts.map +1 -0
- package/dist/agentv3/rawSqlNormalizer.js +649 -0
- package/dist/agentv3/rawSqlNormalizer.js.map +1 -0
- package/dist/agentv3/recoveryNoteBuilder.d.ts +51 -0
- package/dist/agentv3/recoveryNoteBuilder.d.ts.map +1 -0
- package/dist/agentv3/recoveryNoteBuilder.js +84 -0
- package/dist/agentv3/recoveryNoteBuilder.js.map +1 -0
- package/dist/agentv3/sceneClassifier.d.ts +11 -0
- package/dist/agentv3/sceneClassifier.d.ts.map +1 -0
- package/dist/agentv3/sceneClassifier.js +46 -0
- package/dist/agentv3/sceneClassifier.js.map +1 -0
- package/dist/agentv3/scenePlanTemplates.d.ts +80 -0
- package/dist/agentv3/scenePlanTemplates.d.ts.map +1 -0
- package/dist/agentv3/scenePlanTemplates.js +164 -0
- package/dist/agentv3/scenePlanTemplates.js.map +1 -0
- package/dist/agentv3/selfImprove/contentScanner.d.ts +44 -0
- package/dist/agentv3/selfImprove/contentScanner.d.ts.map +1 -0
- package/dist/agentv3/selfImprove/contentScanner.js +112 -0
- package/dist/agentv3/selfImprove/contentScanner.js.map +1 -0
- package/dist/agentv3/selfImprove/failureTaxonomy.d.ts +38 -0
- package/dist/agentv3/selfImprove/failureTaxonomy.d.ts.map +1 -0
- package/dist/agentv3/selfImprove/failureTaxonomy.js +102 -0
- package/dist/agentv3/selfImprove/failureTaxonomy.js.map +1 -0
- package/dist/agentv3/selfImprove/feedbackEnricher.d.ts +69 -0
- package/dist/agentv3/selfImprove/feedbackEnricher.d.ts.map +1 -0
- package/dist/agentv3/selfImprove/feedbackEnricher.js +135 -0
- package/dist/agentv3/selfImprove/feedbackEnricher.js.map +1 -0
- package/dist/agentv3/selfImprove/feedbackPipeline.d.ts +63 -0
- package/dist/agentv3/selfImprove/feedbackPipeline.d.ts.map +1 -0
- package/dist/agentv3/selfImprove/feedbackPipeline.js +239 -0
- package/dist/agentv3/selfImprove/feedbackPipeline.js.map +1 -0
- package/dist/agentv3/selfImprove/hintFingerprint.d.ts +14 -0
- package/dist/agentv3/selfImprove/hintFingerprint.d.ts.map +1 -0
- package/dist/agentv3/selfImprove/hintFingerprint.js +47 -0
- package/dist/agentv3/selfImprove/hintFingerprint.js.map +1 -0
- package/dist/agentv3/selfImprove/metricsAggregator.d.ts +46 -0
- package/dist/agentv3/selfImprove/metricsAggregator.d.ts.map +1 -0
- package/dist/agentv3/selfImprove/metricsAggregator.js +195 -0
- package/dist/agentv3/selfImprove/metricsAggregator.js.map +1 -0
- package/dist/agentv3/selfImprove/migrateFailureModeHash.d.ts +31 -0
- package/dist/agentv3/selfImprove/migrateFailureModeHash.d.ts.map +1 -0
- package/dist/agentv3/selfImprove/migrateFailureModeHash.js +220 -0
- package/dist/agentv3/selfImprove/migrateFailureModeHash.js.map +1 -0
- package/dist/agentv3/selfImprove/phaseHintsRenderer.d.ts +56 -0
- package/dist/agentv3/selfImprove/phaseHintsRenderer.d.ts.map +1 -0
- package/dist/agentv3/selfImprove/phaseHintsRenderer.js +202 -0
- package/dist/agentv3/selfImprove/phaseHintsRenderer.js.map +1 -0
- package/dist/agentv3/selfImprove/promoteSkillNote.d.ts +17 -0
- package/dist/agentv3/selfImprove/promoteSkillNote.d.ts.map +1 -0
- package/dist/agentv3/selfImprove/promoteSkillNote.js +146 -0
- package/dist/agentv3/selfImprove/promoteSkillNote.js.map +1 -0
- package/dist/agentv3/selfImprove/proposeStrategyPatch.d.ts +40 -0
- package/dist/agentv3/selfImprove/proposeStrategyPatch.d.ts.map +1 -0
- package/dist/agentv3/selfImprove/proposeStrategyPatch.js +115 -0
- package/dist/agentv3/selfImprove/proposeStrategyPatch.js.map +1 -0
- package/dist/agentv3/selfImprove/reviewAgentSdk.d.ts +32 -0
- package/dist/agentv3/selfImprove/reviewAgentSdk.d.ts.map +1 -0
- package/dist/agentv3/selfImprove/reviewAgentSdk.js +173 -0
- package/dist/agentv3/selfImprove/reviewAgentSdk.js.map +1 -0
- package/dist/agentv3/selfImprove/reviewOutbox.d.ts +128 -0
- package/dist/agentv3/selfImprove/reviewOutbox.d.ts.map +1 -0
- package/dist/agentv3/selfImprove/reviewOutbox.js +313 -0
- package/dist/agentv3/selfImprove/reviewOutbox.js.map +1 -0
- package/dist/agentv3/selfImprove/reviewWorker.d.ts +95 -0
- package/dist/agentv3/selfImprove/reviewWorker.d.ts.map +1 -0
- package/dist/agentv3/selfImprove/reviewWorker.js +172 -0
- package/dist/agentv3/selfImprove/reviewWorker.js.map +1 -0
- package/dist/agentv3/selfImprove/skillNotesInjector.d.ts +71 -0
- package/dist/agentv3/selfImprove/skillNotesInjector.d.ts.map +1 -0
- package/dist/agentv3/selfImprove/skillNotesInjector.js +214 -0
- package/dist/agentv3/selfImprove/skillNotesInjector.js.map +1 -0
- package/dist/agentv3/selfImprove/skillNotesWriter.d.ts +89 -0
- package/dist/agentv3/selfImprove/skillNotesWriter.d.ts.map +1 -0
- package/dist/agentv3/selfImprove/skillNotesWriter.js +274 -0
- package/dist/agentv3/selfImprove/skillNotesWriter.js.map +1 -0
- package/dist/agentv3/selfImprove/strategyFingerprint.d.ts +85 -0
- package/dist/agentv3/selfImprove/strategyFingerprint.d.ts.map +1 -0
- package/dist/agentv3/selfImprove/strategyFingerprint.js +189 -0
- package/dist/agentv3/selfImprove/strategyFingerprint.js.map +1 -0
- package/dist/agentv3/selfImprove/strategyPatchApplier.d.ts +15 -0
- package/dist/agentv3/selfImprove/strategyPatchApplier.d.ts.map +1 -0
- package/dist/agentv3/selfImprove/strategyPatchApplier.js +138 -0
- package/dist/agentv3/selfImprove/strategyPatchApplier.js.map +1 -0
- package/dist/agentv3/selfImprove/supersedeStore.d.ts +136 -0
- package/dist/agentv3/selfImprove/supersedeStore.d.ts.map +1 -0
- package/dist/agentv3/selfImprove/supersedeStore.js +386 -0
- package/dist/agentv3/selfImprove/supersedeStore.js.map +1 -0
- package/dist/agentv3/selfImprove/worktreeRunner.d.ts +49 -0
- package/dist/agentv3/selfImprove/worktreeRunner.d.ts.map +1 -0
- package/dist/agentv3/selfImprove/worktreeRunner.js +153 -0
- package/dist/agentv3/selfImprove/worktreeRunner.js.map +1 -0
- package/dist/agentv3/sessionStateSnapshot.d.ts +166 -0
- package/dist/agentv3/sessionStateSnapshot.d.ts.map +1 -0
- package/dist/agentv3/sessionStateSnapshot.js +6 -0
- package/dist/agentv3/sessionStateSnapshot.js.map +1 -0
- package/dist/agentv3/sqlIncludeInjector.d.ts +24 -0
- package/dist/agentv3/sqlIncludeInjector.d.ts.map +1 -0
- package/dist/agentv3/sqlIncludeInjector.js +78 -0
- package/dist/agentv3/sqlIncludeInjector.js.map +1 -0
- package/dist/agentv3/sqlSummarizer.d.ts +38 -0
- package/dist/agentv3/sqlSummarizer.d.ts.map +1 -0
- package/dist/agentv3/sqlSummarizer.js +101 -0
- package/dist/agentv3/sqlSummarizer.js.map +1 -0
- package/dist/agentv3/standaloneMcpServer.d.ts +96 -0
- package/dist/agentv3/standaloneMcpServer.d.ts.map +1 -0
- package/dist/agentv3/standaloneMcpServer.js +244 -0
- package/dist/agentv3/standaloneMcpServer.js.map +1 -0
- package/dist/agentv3/strategyLoader.d.ts +96 -0
- package/dist/agentv3/strategyLoader.d.ts.map +1 -0
- package/dist/agentv3/strategyLoader.js +204 -0
- package/dist/agentv3/strategyLoader.js.map +1 -0
- package/dist/agentv3/toolCallSummary.d.ts +15 -0
- package/dist/agentv3/toolCallSummary.d.ts.map +1 -0
- package/dist/agentv3/toolCallSummary.js +66 -0
- package/dist/agentv3/toolCallSummary.js.map +1 -0
- package/dist/agentv3/toolNarration.d.ts +4 -0
- package/dist/agentv3/toolNarration.d.ts.map +1 -0
- package/dist/agentv3/toolNarration.js +371 -0
- package/dist/agentv3/toolNarration.js.map +1 -0
- package/dist/agentv3/traceCompletenessProber.d.ts +56 -0
- package/dist/agentv3/traceCompletenessProber.d.ts.map +1 -0
- package/dist/agentv3/traceCompletenessProber.js +337 -0
- package/dist/agentv3/traceCompletenessProber.js.map +1 -0
- package/dist/agentv3/types.d.ts +443 -0
- package/dist/agentv3/types.d.ts.map +1 -0
- package/dist/agentv3/types.js +37 -0
- package/dist/agentv3/types.js.map +1 -0
- package/dist/assistant/application/agentAnalyzeSessionService.d.ts +130 -0
- package/dist/assistant/application/agentAnalyzeSessionService.d.ts.map +1 -0
- package/dist/assistant/application/agentAnalyzeSessionService.js +433 -0
- package/dist/assistant/application/agentAnalyzeSessionService.js.map +1 -0
- package/dist/assistant/application/assistantApplicationService.d.ts +39 -0
- package/dist/assistant/application/assistantApplicationService.d.ts.map +1 -0
- package/dist/assistant/application/assistantApplicationService.js +88 -0
- package/dist/assistant/application/assistantApplicationService.js.map +1 -0
- package/dist/assistant/contracts/assistantResultContract.d.ts +41 -0
- package/dist/assistant/contracts/assistantResultContract.d.ts.map +1 -0
- package/dist/assistant/contracts/assistantResultContract.js +145 -0
- package/dist/assistant/contracts/assistantResultContract.js.map +1 -0
- package/dist/assistant/stream/sessionSseReplay.d.ts +10 -0
- package/dist/assistant/stream/sessionSseReplay.d.ts.map +1 -0
- package/dist/assistant/stream/sessionSseReplay.js +42 -0
- package/dist/assistant/stream/sessionSseReplay.js.map +1 -0
- package/dist/assistant/stream/streamProjector.d.ts +53 -0
- package/dist/assistant/stream/streamProjector.d.ts.map +1 -0
- package/dist/assistant/stream/streamProjector.js +150 -0
- package/dist/assistant/stream/streamProjector.js.map +1 -0
- package/dist/cli/commands/coverage.d.ts +12 -0
- package/dist/cli/commands/coverage.d.ts.map +1 -0
- package/dist/cli/commands/coverage.js +106 -0
- package/dist/cli/commands/coverage.js.map +1 -0
- package/dist/cli/commands/list.d.ts +11 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +169 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/smoke.d.ts +11 -0
- package/dist/cli/commands/smoke.d.ts.map +1 -0
- package/dist/cli/commands/smoke.js +215 -0
- package/dist/cli/commands/smoke.js.map +1 -0
- package/dist/cli/commands/test.d.ts +11 -0
- package/dist/cli/commands/test.d.ts.map +1 -0
- package/dist/cli/commands/test.js +183 -0
- package/dist/cli/commands/test.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +26 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +918 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +29 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli-user/bin.d.ts +3 -0
- package/dist/cli-user/bin.d.ts.map +1 -0
- package/dist/cli-user/bin.js +490 -0
- package/dist/cli-user/bin.js.map +1 -0
- package/dist/cli-user/bootstrap.d.ts +12 -0
- package/dist/cli-user/bootstrap.d.ts.map +1 -0
- package/dist/cli-user/bootstrap.js +165 -0
- package/dist/cli-user/bootstrap.js.map +1 -0
- package/dist/cli-user/commands/analyze.d.ts +12 -0
- package/dist/cli-user/commands/analyze.d.ts.map +1 -0
- package/dist/cli-user/commands/analyze.js +83 -0
- package/dist/cli-user/commands/analyze.js.map +1 -0
- package/dist/cli-user/commands/capture.d.ts +12 -0
- package/dist/cli-user/commands/capture.d.ts.map +1 -0
- package/dist/cli-user/commands/capture.js +155 -0
- package/dist/cli-user/commands/capture.js.map +1 -0
- package/dist/cli-user/commands/compare.d.ts +13 -0
- package/dist/cli-user/commands/compare.d.ts.map +1 -0
- package/dist/cli-user/commands/compare.js +74 -0
- package/dist/cli-user/commands/compare.js.map +1 -0
- package/dist/cli-user/commands/config.d.ts +9 -0
- package/dist/cli-user/commands/config.d.ts.map +1 -0
- package/dist/cli-user/commands/config.js +109 -0
- package/dist/cli-user/commands/config.js.map +1 -0
- package/dist/cli-user/commands/doctor.d.ts +8 -0
- package/dist/cli-user/commands/doctor.d.ts.map +1 -0
- package/dist/cli-user/commands/doctor.js +37 -0
- package/dist/cli-user/commands/doctor.js.map +1 -0
- package/dist/cli-user/commands/list.d.ts +10 -0
- package/dist/cli-user/commands/list.d.ts.map +1 -0
- package/dist/cli-user/commands/list.js +79 -0
- package/dist/cli-user/commands/list.js.map +1 -0
- package/dist/cli-user/commands/provider.d.ts +12 -0
- package/dist/cli-user/commands/provider.d.ts.map +1 -0
- package/dist/cli-user/commands/provider.js +121 -0
- package/dist/cli-user/commands/provider.js.map +1 -0
- package/dist/cli-user/commands/query.d.ts +10 -0
- package/dist/cli-user/commands/query.d.ts.map +1 -0
- package/dist/cli-user/commands/query.js +128 -0
- package/dist/cli-user/commands/query.js.map +1 -0
- package/dist/cli-user/commands/report.d.ts +18 -0
- package/dist/cli-user/commands/report.d.ts.map +1 -0
- package/dist/cli-user/commands/report.js +225 -0
- package/dist/cli-user/commands/report.js.map +1 -0
- package/dist/cli-user/commands/resume.d.ts +12 -0
- package/dist/cli-user/commands/resume.d.ts.map +1 -0
- package/dist/cli-user/commands/resume.js +48 -0
- package/dist/cli-user/commands/resume.js.map +1 -0
- package/dist/cli-user/commands/rm.d.ts +8 -0
- package/dist/cli-user/commands/rm.d.ts.map +1 -0
- package/dist/cli-user/commands/rm.js +91 -0
- package/dist/cli-user/commands/rm.js.map +1 -0
- package/dist/cli-user/commands/show.d.ts +8 -0
- package/dist/cli-user/commands/show.d.ts.map +1 -0
- package/dist/cli-user/commands/show.js +84 -0
- package/dist/cli-user/commands/show.js.map +1 -0
- package/dist/cli-user/commands/skill.d.ts +11 -0
- package/dist/cli-user/commands/skill.d.ts.map +1 -0
- package/dist/cli-user/commands/skill.js +118 -0
- package/dist/cli-user/commands/skill.js.map +1 -0
- package/dist/cli-user/constants.d.ts +10 -0
- package/dist/cli-user/constants.d.ts.map +1 -0
- package/dist/cli-user/constants.js +16 -0
- package/dist/cli-user/constants.js.map +1 -0
- package/dist/cli-user/io/indexJson.d.ts +11 -0
- package/dist/cli-user/io/indexJson.d.ts.map +1 -0
- package/dist/cli-user/io/indexJson.js +79 -0
- package/dist/cli-user/io/indexJson.js.map +1 -0
- package/dist/cli-user/io/openFile.d.ts +8 -0
- package/dist/cli-user/io/openFile.d.ts.map +1 -0
- package/dist/cli-user/io/openFile.js +34 -0
- package/dist/cli-user/io/openFile.js.map +1 -0
- package/dist/cli-user/io/paths.d.ts +33 -0
- package/dist/cli-user/io/paths.d.ts.map +1 -0
- package/dist/cli-user/io/paths.js +149 -0
- package/dist/cli-user/io/paths.js.map +1 -0
- package/dist/cli-user/io/sessionStore.d.ts +17 -0
- package/dist/cli-user/io/sessionStore.d.ts.map +1 -0
- package/dist/cli-user/io/sessionStore.js +101 -0
- package/dist/cli-user/io/sessionStore.js.map +1 -0
- package/dist/cli-user/io/stdio.d.ts +8 -0
- package/dist/cli-user/io/stdio.d.ts.map +1 -0
- package/dist/cli-user/io/stdio.js +25 -0
- package/dist/cli-user/io/stdio.js.map +1 -0
- package/dist/cli-user/io/transcriptWriter.d.ts +5 -0
- package/dist/cli-user/io/transcriptWriter.d.ts.map +1 -0
- package/dist/cli-user/io/transcriptWriter.js +60 -0
- package/dist/cli-user/io/transcriptWriter.js.map +1 -0
- package/dist/cli-user/repl/index.d.ts +14 -0
- package/dist/cli-user/repl/index.d.ts.map +1 -0
- package/dist/cli-user/repl/index.js +301 -0
- package/dist/cli-user/repl/index.js.map +1 -0
- package/dist/cli-user/repl/renderer.d.ts +43 -0
- package/dist/cli-user/repl/renderer.d.ts.map +1 -0
- package/dist/cli-user/repl/renderer.js +210 -0
- package/dist/cli-user/repl/renderer.js.map +1 -0
- package/dist/cli-user/repl/slashCommands.d.ts +49 -0
- package/dist/cli-user/repl/slashCommands.d.ts.map +1 -0
- package/dist/cli-user/repl/slashCommands.js +65 -0
- package/dist/cli-user/repl/slashCommands.js.map +1 -0
- package/dist/cli-user/services/cliAnalyzeService.d.ts +73 -0
- package/dist/cli-user/services/cliAnalyzeService.d.ts.map +1 -0
- package/dist/cli-user/services/cliAnalyzeService.js +393 -0
- package/dist/cli-user/services/cliAnalyzeService.js.map +1 -0
- package/dist/cli-user/services/runtimeGuard.d.ts +46 -0
- package/dist/cli-user/services/runtimeGuard.d.ts.map +1 -0
- package/dist/cli-user/services/runtimeGuard.js +188 -0
- package/dist/cli-user/services/runtimeGuard.js.map +1 -0
- package/dist/cli-user/services/traceProcessorInstaller.d.ts +2 -0
- package/dist/cli-user/services/traceProcessorInstaller.d.ts.map +1 -0
- package/dist/cli-user/services/traceProcessorInstaller.js +241 -0
- package/dist/cli-user/services/traceProcessorInstaller.js.map +1 -0
- package/dist/cli-user/services/turnPersistence.d.ts +41 -0
- package/dist/cli-user/services/turnPersistence.d.ts.map +1 -0
- package/dist/cli-user/services/turnPersistence.js +55 -0
- package/dist/cli-user/services/turnPersistence.js.map +1 -0
- package/dist/cli-user/services/turnRunner.d.ts +49 -0
- package/dist/cli-user/services/turnRunner.d.ts.map +1 -0
- package/dist/cli-user/services/turnRunner.js +436 -0
- package/dist/cli-user/services/turnRunner.js.map +1 -0
- package/dist/cli-user/types.d.ts +62 -0
- package/dist/cli-user/types.d.ts.map +1 -0
- package/dist/cli-user/types.js +6 -0
- package/dist/cli-user/types.js.map +1 -0
- package/dist/config/index.d.ts +393 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +334 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/prompts.d.ts +20 -0
- package/dist/config/prompts.d.ts.map +1 -0
- package/dist/config/prompts.js +74 -0
- package/dist/config/prompts.js.map +1 -0
- package/dist/config/teaching.config.d.ts +253 -0
- package/dist/config/teaching.config.d.ts.map +1 -0
- package/dist/config/teaching.config.js +203 -0
- package/dist/config/teaching.config.js.map +1 -0
- package/dist/config/thresholds.d.ts +300 -0
- package/dist/config/thresholds.d.ts.map +1 -0
- package/dist/config/thresholds.js +338 -0
- package/dist/config/thresholds.js.map +1 -0
- package/dist/controllers/skillAdminController.d.ts +62 -0
- package/dist/controllers/skillAdminController.d.ts.map +1 -0
- package/dist/controllers/skillAdminController.js +482 -0
- package/dist/controllers/skillAdminController.js.map +1 -0
- package/dist/controllers/skillController.d.ts +49 -0
- package/dist/controllers/skillController.d.ts.map +1 -0
- package/dist/controllers/skillController.js +246 -0
- package/dist/controllers/skillController.js.map +1 -0
- package/dist/controllers/sqlController.d.ts +9 -0
- package/dist/controllers/sqlController.d.ts.map +1 -0
- package/dist/controllers/sqlController.js +125 -0
- package/dist/controllers/sqlController.js.map +1 -0
- package/dist/controllers/traceController.d.ts +13 -0
- package/dist/controllers/traceController.d.ts.map +1 -0
- package/dist/controllers/traceController.js +209 -0
- package/dist/controllers/traceController.js.map +1 -0
- package/dist/controllers/traceProcessorController.d.ts +14 -0
- package/dist/controllers/traceProcessorController.d.ts.map +1 -0
- package/dist/controllers/traceProcessorController.js +222 -0
- package/dist/controllers/traceProcessorController.js.map +1 -0
- package/dist/data/perfettoSchema.d.ts +9 -0
- package/dist/data/perfettoSchema.d.ts.map +1 -0
- package/dist/data/perfettoSchema.js +286 -0
- package/dist/data/perfettoSchema.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +251 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/auth.d.ts +37 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +307 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/middleware/legacyAgentApi.d.ts +8 -0
- package/dist/middleware/legacyAgentApi.d.ts.map +1 -0
- package/dist/middleware/legacyAgentApi.js +64 -0
- package/dist/middleware/legacyAgentApi.js.map +1 -0
- package/dist/middleware/workspaceRouteContext.d.ts +4 -0
- package/dist/middleware/workspaceRouteContext.d.ts.map +1 -0
- package/dist/middleware/workspaceRouteContext.js +44 -0
- package/dist/middleware/workspaceRouteContext.js.map +1 -0
- package/dist/models/sessionSchema.d.ts +106 -0
- package/dist/models/sessionSchema.d.ts.map +1 -0
- package/dist/models/sessionSchema.js +6 -0
- package/dist/models/sessionSchema.js.map +1 -0
- package/dist/routes/agentLogsRoutes.d.ts +3 -0
- package/dist/routes/agentLogsRoutes.d.ts.map +1 -0
- package/dist/routes/agentLogsRoutes.js +283 -0
- package/dist/routes/agentLogsRoutes.js.map +1 -0
- package/dist/routes/agentQuickSceneRoutes.d.ts +9 -0
- package/dist/routes/agentQuickSceneRoutes.d.ts.map +1 -0
- package/dist/routes/agentQuickSceneRoutes.js +51 -0
- package/dist/routes/agentQuickSceneRoutes.js.map +1 -0
- package/dist/routes/agentReportRoutes.d.ts +11 -0
- package/dist/routes/agentReportRoutes.d.ts.map +1 -0
- package/dist/routes/agentReportRoutes.js +100 -0
- package/dist/routes/agentReportRoutes.js.map +1 -0
- package/dist/routes/agentResumeRoutes.d.ts +14 -0
- package/dist/routes/agentResumeRoutes.d.ts.map +1 -0
- package/dist/routes/agentResumeRoutes.js +263 -0
- package/dist/routes/agentResumeRoutes.js.map +1 -0
- package/dist/routes/agentRoutes.d.ts +3 -0
- package/dist/routes/agentRoutes.d.ts.map +1 -0
- package/dist/routes/agentRoutes.js +4349 -0
- package/dist/routes/agentRoutes.js.map +1 -0
- package/dist/routes/agentSceneReconstructRoutes.d.ts +68 -0
- package/dist/routes/agentSceneReconstructRoutes.d.ts.map +1 -0
- package/dist/routes/agentSceneReconstructRoutes.js +448 -0
- package/dist/routes/agentSceneReconstructRoutes.js.map +1 -0
- package/dist/routes/agentSessionCatalogRoutes.d.ts +20 -0
- package/dist/routes/agentSessionCatalogRoutes.d.ts.map +1 -0
- package/dist/routes/agentSessionCatalogRoutes.js +90 -0
- package/dist/routes/agentSessionCatalogRoutes.js.map +1 -0
- package/dist/routes/agentTeachingRoutes.d.ts +3 -0
- package/dist/routes/agentTeachingRoutes.d.ts.map +1 -0
- package/dist/routes/agentTeachingRoutes.js +62 -0
- package/dist/routes/agentTeachingRoutes.js.map +1 -0
- package/dist/routes/analysisResultRoutes.d.ts +3 -0
- package/dist/routes/analysisResultRoutes.d.ts.map +1 -0
- package/dist/routes/analysisResultRoutes.js +216 -0
- package/dist/routes/analysisResultRoutes.js.map +1 -0
- package/dist/routes/baselineRoutes.d.ts +29 -0
- package/dist/routes/baselineRoutes.d.ts.map +1 -0
- package/dist/routes/baselineRoutes.js +123 -0
- package/dist/routes/baselineRoutes.js.map +1 -0
- package/dist/routes/caseRoutes.d.ts +29 -0
- package/dist/routes/caseRoutes.d.ts.map +1 -0
- package/dist/routes/caseRoutes.js +194 -0
- package/dist/routes/caseRoutes.js.map +1 -0
- package/dist/routes/ciGateRoutes.d.ts +11 -0
- package/dist/routes/ciGateRoutes.d.ts.map +1 -0
- package/dist/routes/ciGateRoutes.js +363 -0
- package/dist/routes/ciGateRoutes.js.map +1 -0
- package/dist/routes/comparisonRoutes.d.ts +3 -0
- package/dist/routes/comparisonRoutes.d.ts.map +1 -0
- package/dist/routes/comparisonRoutes.js +536 -0
- package/dist/routes/comparisonRoutes.js.map +1 -0
- package/dist/routes/criticalPathRoutes.d.ts +3 -0
- package/dist/routes/criticalPathRoutes.d.ts.map +1 -0
- package/dist/routes/criticalPathRoutes.js +88 -0
- package/dist/routes/criticalPathRoutes.js.map +1 -0
- package/dist/routes/enterpriseApiKeyRoutes.d.ts +9 -0
- package/dist/routes/enterpriseApiKeyRoutes.d.ts.map +1 -0
- package/dist/routes/enterpriseApiKeyRoutes.js +126 -0
- package/dist/routes/enterpriseApiKeyRoutes.js.map +1 -0
- package/dist/routes/enterpriseAuthRoutes.d.ts +18 -0
- package/dist/routes/enterpriseAuthRoutes.d.ts.map +1 -0
- package/dist/routes/enterpriseAuthRoutes.js +160 -0
- package/dist/routes/enterpriseAuthRoutes.js.map +1 -0
- package/dist/routes/enterpriseRuntimeDashboardRoutes.d.ts +6 -0
- package/dist/routes/enterpriseRuntimeDashboardRoutes.d.ts.map +1 -0
- package/dist/routes/enterpriseRuntimeDashboardRoutes.js +32 -0
- package/dist/routes/enterpriseRuntimeDashboardRoutes.js.map +1 -0
- package/dist/routes/enterpriseTenantRoutes.d.ts +4 -0
- package/dist/routes/enterpriseTenantRoutes.d.ts.map +1 -0
- package/dist/routes/enterpriseTenantRoutes.js +313 -0
- package/dist/routes/enterpriseTenantRoutes.js.map +1 -0
- package/dist/routes/exportRoutes.d.ts +3 -0
- package/dist/routes/exportRoutes.d.ts.map +1 -0
- package/dist/routes/exportRoutes.js +196 -0
- package/dist/routes/exportRoutes.js.map +1 -0
- package/dist/routes/flamegraphRoutes.d.ts +3 -0
- package/dist/routes/flamegraphRoutes.d.ts.map +1 -0
- package/dist/routes/flamegraphRoutes.js +99 -0
- package/dist/routes/flamegraphRoutes.js.map +1 -0
- package/dist/routes/memoryRoutes.d.ts +31 -0
- package/dist/routes/memoryRoutes.d.ts.map +1 -0
- package/dist/routes/memoryRoutes.js +150 -0
- package/dist/routes/memoryRoutes.js.map +1 -0
- package/dist/routes/narrativeSanitizer.d.ts +2 -0
- package/dist/routes/narrativeSanitizer.d.ts.map +1 -0
- package/dist/routes/narrativeSanitizer.js +167 -0
- package/dist/routes/narrativeSanitizer.js.map +1 -0
- package/dist/routes/perfettoLocalRoutes.d.ts +3 -0
- package/dist/routes/perfettoLocalRoutes.d.ts.map +1 -0
- package/dist/routes/perfettoLocalRoutes.js +222 -0
- package/dist/routes/perfettoLocalRoutes.js.map +1 -0
- package/dist/routes/perfettoSqlRoutes.d.ts +7 -0
- package/dist/routes/perfettoSqlRoutes.d.ts.map +1 -0
- package/dist/routes/perfettoSqlRoutes.js +738 -0
- package/dist/routes/perfettoSqlRoutes.js.map +1 -0
- package/dist/routes/providerRoutes.d.ts +3 -0
- package/dist/routes/providerRoutes.d.ts.map +1 -0
- package/dist/routes/providerRoutes.js +219 -0
- package/dist/routes/providerRoutes.js.map +1 -0
- package/dist/routes/ragAdminRoutes.d.ts +30 -0
- package/dist/routes/ragAdminRoutes.d.ts.map +1 -0
- package/dist/routes/ragAdminRoutes.js +93 -0
- package/dist/routes/ragAdminRoutes.js.map +1 -0
- package/dist/routes/reportRoutes.d.ts +17 -0
- package/dist/routes/reportRoutes.d.ts.map +1 -0
- package/dist/routes/reportRoutes.js +579 -0
- package/dist/routes/reportRoutes.js.map +1 -0
- package/dist/routes/sessionRoutes.d.ts +3 -0
- package/dist/routes/sessionRoutes.d.ts.map +1 -0
- package/dist/routes/sessionRoutes.js +144 -0
- package/dist/routes/sessionRoutes.js.map +1 -0
- package/dist/routes/simpleTraceRoutes.d.ts +3 -0
- package/dist/routes/simpleTraceRoutes.d.ts.map +1 -0
- package/dist/routes/simpleTraceRoutes.js +1131 -0
- package/dist/routes/simpleTraceRoutes.js.map +1 -0
- package/dist/routes/skillAdminRoutes.d.ts +3 -0
- package/dist/routes/skillAdminRoutes.d.ts.map +1 -0
- package/dist/routes/skillAdminRoutes.js +100 -0
- package/dist/routes/skillAdminRoutes.js.map +1 -0
- package/dist/routes/skillRoutes.d.ts +3 -0
- package/dist/routes/skillRoutes.d.ts.map +1 -0
- package/dist/routes/skillRoutes.js +88 -0
- package/dist/routes/skillRoutes.js.map +1 -0
- package/dist/routes/sql.d.ts +3 -0
- package/dist/routes/sql.d.ts.map +1 -0
- package/dist/routes/sql.js +19 -0
- package/dist/routes/sql.js.map +1 -0
- package/dist/routes/strategyAdminRoutes.d.ts +3 -0
- package/dist/routes/strategyAdminRoutes.d.ts.map +1 -0
- package/dist/routes/strategyAdminRoutes.js +65 -0
- package/dist/routes/strategyAdminRoutes.js.map +1 -0
- package/dist/routes/templateAnalysisRoutes.d.ts +3 -0
- package/dist/routes/templateAnalysisRoutes.d.ts.map +1 -0
- package/dist/routes/templateAnalysisRoutes.js +173 -0
- package/dist/routes/templateAnalysisRoutes.js.map +1 -0
- package/dist/routes/trace.d.ts +3 -0
- package/dist/routes/trace.d.ts.map +1 -0
- package/dist/routes/trace.js +48 -0
- package/dist/routes/trace.js.map +1 -0
- package/dist/routes/traceProcessorProxyRoutes.d.ts +6 -0
- package/dist/routes/traceProcessorProxyRoutes.d.ts.map +1 -0
- package/dist/routes/traceProcessorProxyRoutes.js +607 -0
- package/dist/routes/traceProcessorProxyRoutes.js.map +1 -0
- package/dist/routes/traceProcessorRoutes.d.ts +3 -0
- package/dist/routes/traceProcessorRoutes.d.ts.map +1 -0
- package/dist/routes/traceProcessorRoutes.js +40 -0
- package/dist/routes/traceProcessorRoutes.js.map +1 -0
- package/dist/routes/workspaceWindowRoutes.d.ts +3 -0
- package/dist/routes/workspaceWindowRoutes.d.ts.map +1 -0
- package/dist/routes/workspaceWindowRoutes.js +146 -0
- package/dist/routes/workspaceWindowRoutes.js.map +1 -0
- package/dist/runtimePaths.d.ts +3 -0
- package/dist/runtimePaths.d.ts.map +1 -0
- package/dist/runtimePaths.js +20 -0
- package/dist/runtimePaths.js.map +1 -0
- package/dist/scripts/analyzeComprehensiveTrace.d.ts +2 -0
- package/dist/scripts/analyzeComprehensiveTrace.d.ts.map +1 -0
- package/dist/scripts/analyzeComprehensiveTrace.js +210 -0
- package/dist/scripts/analyzeComprehensiveTrace.js.map +1 -0
- package/dist/scripts/analyzeUserTrace.d.ts +2 -0
- package/dist/scripts/analyzeUserTrace.d.ts.map +1 -0
- package/dist/scripts/analyzeUserTrace.js +170 -0
- package/dist/scripts/analyzeUserTrace.js.map +1 -0
- package/dist/scripts/auditTraceProcessorRssMatrix.d.ts +49 -0
- package/dist/scripts/auditTraceProcessorRssMatrix.d.ts.map +1 -0
- package/dist/scripts/auditTraceProcessorRssMatrix.js +390 -0
- package/dist/scripts/auditTraceProcessorRssMatrix.js.map +1 -0
- package/dist/scripts/benchmarkTraceProcessorRss.d.ts +96 -0
- package/dist/scripts/benchmarkTraceProcessorRss.d.ts.map +1 -0
- package/dist/scripts/benchmarkTraceProcessorRss.js +569 -0
- package/dist/scripts/benchmarkTraceProcessorRss.js.map +1 -0
- package/dist/scripts/captureContextEngineeringBaseline.d.ts +2 -0
- package/dist/scripts/captureContextEngineeringBaseline.d.ts.map +1 -0
- package/dist/scripts/captureContextEngineeringBaseline.js +271 -0
- package/dist/scripts/captureContextEngineeringBaseline.js.map +1 -0
- package/dist/scripts/checkTables.d.ts +2 -0
- package/dist/scripts/checkTables.d.ts.map +1 -0
- package/dist/scripts/checkTables.js +22 -0
- package/dist/scripts/checkTables.js.map +1 -0
- package/dist/scripts/diagnoseJankDetection.d.ts +2 -0
- package/dist/scripts/diagnoseJankDetection.d.ts.map +1 -0
- package/dist/scripts/diagnoseJankDetection.js +314 -0
- package/dist/scripts/diagnoseJankDetection.js.map +1 -0
- package/dist/scripts/diagnoseTrace.d.ts +2 -0
- package/dist/scripts/diagnoseTrace.d.ts.map +1 -0
- package/dist/scripts/diagnoseTrace.js +74 -0
- package/dist/scripts/diagnoseTrace.js.map +1 -0
- package/dist/scripts/enterpriseAcceptanceLoadTest.d.ts +193 -0
- package/dist/scripts/enterpriseAcceptanceLoadTest.d.ts.map +1 -0
- package/dist/scripts/enterpriseAcceptanceLoadTest.js +912 -0
- package/dist/scripts/enterpriseAcceptanceLoadTest.js.map +1 -0
- package/dist/scripts/enterpriseMigrationSnapshot.d.ts +3 -0
- package/dist/scripts/enterpriseMigrationSnapshot.d.ts.map +1 -0
- package/dist/scripts/enterpriseMigrationSnapshot.js +57 -0
- package/dist/scripts/enterpriseMigrationSnapshot.js.map +1 -0
- package/dist/scripts/enterpriseReadinessAudit.d.ts +30 -0
- package/dist/scripts/enterpriseReadinessAudit.d.ts.map +1 -0
- package/dist/scripts/enterpriseReadinessAudit.js +743 -0
- package/dist/scripts/enterpriseReadinessAudit.js.map +1 -0
- package/dist/scripts/enterpriseRssBenchmarkMatrix.d.ts +6 -0
- package/dist/scripts/enterpriseRssBenchmarkMatrix.d.ts.map +1 -0
- package/dist/scripts/enterpriseRssBenchmarkMatrix.js +20 -0
- package/dist/scripts/enterpriseRssBenchmarkMatrix.js.map +1 -0
- package/dist/scripts/enterpriseRuntimeIsolationChecklist.d.ts +22 -0
- package/dist/scripts/enterpriseRuntimeIsolationChecklist.d.ts.map +1 -0
- package/dist/scripts/enterpriseRuntimeIsolationChecklist.js +374 -0
- package/dist/scripts/enterpriseRuntimeIsolationChecklist.js.map +1 -0
- package/dist/scripts/enterpriseSecurityAuditChecklist.d.ts +20 -0
- package/dist/scripts/enterpriseSecurityAuditChecklist.d.ts.map +1 -0
- package/dist/scripts/enterpriseSecurityAuditChecklist.js +113 -0
- package/dist/scripts/enterpriseSecurityAuditChecklist.js.map +1 -0
- package/dist/scripts/probeStdlibSchema.d.ts +2 -0
- package/dist/scripts/probeStdlibSchema.d.ts.map +1 -0
- package/dist/scripts/probeStdlibSchema.js +209 -0
- package/dist/scripts/probeStdlibSchema.js.map +1 -0
- package/dist/scripts/runAgentTest.d.ts +2 -0
- package/dist/scripts/runAgentTest.d.ts.map +1 -0
- package/dist/scripts/runAgentTest.js +149 -0
- package/dist/scripts/runAgentTest.js.map +1 -0
- package/dist/scripts/runScrollingTest.d.ts +2 -0
- package/dist/scripts/runScrollingTest.d.ts.map +1 -0
- package/dist/scripts/runScrollingTest.js +199 -0
- package/dist/scripts/runScrollingTest.js.map +1 -0
- package/dist/scripts/runScrollingTestRealData.d.ts +2 -0
- package/dist/scripts/runScrollingTestRealData.d.ts.map +1 -0
- package/dist/scripts/runScrollingTestRealData.js +121 -0
- package/dist/scripts/runScrollingTestRealData.js.map +1 -0
- package/dist/scripts/testAndroidTrace.d.ts +2 -0
- package/dist/scripts/testAndroidTrace.d.ts.map +1 -0
- package/dist/scripts/testAndroidTrace.js +21 -0
- package/dist/scripts/testAndroidTrace.js.map +1 -0
- package/dist/scripts/testCrossDomainExpert.d.ts +2 -0
- package/dist/scripts/testCrossDomainExpert.d.ts.map +1 -0
- package/dist/scripts/testCrossDomainExpert.js +288 -0
- package/dist/scripts/testCrossDomainExpert.js.map +1 -0
- package/dist/scripts/testCrossDomainIntegration.d.ts +2 -0
- package/dist/scripts/testCrossDomainIntegration.d.ts.map +1 -0
- package/dist/scripts/testCrossDomainIntegration.js +282 -0
- package/dist/scripts/testCrossDomainIntegration.js.map +1 -0
- package/dist/scripts/testDeepLayerFix.d.ts +2 -0
- package/dist/scripts/testDeepLayerFix.d.ts.map +1 -0
- package/dist/scripts/testDeepLayerFix.js +137 -0
- package/dist/scripts/testDeepLayerFix.js.map +1 -0
- package/dist/scripts/testHtmlReportGen.d.ts +2 -0
- package/dist/scripts/testHtmlReportGen.d.ts.map +1 -0
- package/dist/scripts/testHtmlReportGen.js +148 -0
- package/dist/scripts/testHtmlReportGen.js.map +1 -0
- package/dist/scripts/verifyAgentSseScrolling.d.ts +2 -0
- package/dist/scripts/verifyAgentSseScrolling.d.ts.map +1 -0
- package/dist/scripts/verifyAgentSseScrolling.js +558 -0
- package/dist/scripts/verifyAgentSseScrolling.js.map +1 -0
- package/dist/scripts/verifyCriticalPathE2E.d.ts +2 -0
- package/dist/scripts/verifyCriticalPathE2E.d.ts.map +1 -0
- package/dist/scripts/verifyCriticalPathE2E.js +171 -0
- package/dist/scripts/verifyCriticalPathE2E.js.map +1 -0
- package/dist/scripts/verifyEnterpriseMultiTenantWindows.d.ts +24 -0
- package/dist/scripts/verifyEnterpriseMultiTenantWindows.d.ts.map +1 -0
- package/dist/scripts/verifyEnterpriseMultiTenantWindows.js +1363 -0
- package/dist/scripts/verifyEnterpriseMultiTenantWindows.js.map +1 -0
- package/dist/services/adb/adbContextDetector.d.ts +3 -0
- package/dist/services/adb/adbContextDetector.d.ts.map +1 -0
- package/dist/services/adb/adbContextDetector.js +151 -0
- package/dist/services/adb/adbContextDetector.js.map +1 -0
- package/dist/services/adb/adbService.d.ts +28 -0
- package/dist/services/adb/adbService.d.ts.map +1 -0
- package/dist/services/adb/adbService.js +238 -0
- package/dist/services/adb/adbService.js.map +1 -0
- package/dist/services/adb/index.d.ts +5 -0
- package/dist/services/adb/index.d.ts.map +1 -0
- package/dist/services/adb/index.js +24 -0
- package/dist/services/adb/index.js.map +1 -0
- package/dist/services/adb/traceDeviceMatcher.d.ts +12 -0
- package/dist/services/adb/traceDeviceMatcher.d.ts.map +1 -0
- package/dist/services/adb/traceDeviceMatcher.js +149 -0
- package/dist/services/adb/traceDeviceMatcher.js.map +1 -0
- package/dist/services/adb/types.d.ts +69 -0
- package/dist/services/adb/types.d.ts.map +1 -0
- package/dist/services/adb/types.js +6 -0
- package/dist/services/adb/types.js.map +1 -0
- package/dist/services/agentEventStore.d.ts +17 -0
- package/dist/services/agentEventStore.d.ts.map +1 -0
- package/dist/services/agentEventStore.js +139 -0
- package/dist/services/agentEventStore.js.map +1 -0
- package/dist/services/agentReportData.d.ts +42 -0
- package/dist/services/agentReportData.d.ts.map +1 -0
- package/dist/services/agentReportData.js +81 -0
- package/dist/services/agentReportData.js.map +1 -0
- package/dist/services/agentResultNormalizer.d.ts +33 -0
- package/dist/services/agentResultNormalizer.d.ts.map +1 -0
- package/dist/services/agentResultNormalizer.js +92 -0
- package/dist/services/agentResultNormalizer.js.map +1 -0
- package/dist/services/analysisResultSnapshotPipeline.d.ts +24 -0
- package/dist/services/analysisResultSnapshotPipeline.d.ts.map +1 -0
- package/dist/services/analysisResultSnapshotPipeline.js +466 -0
- package/dist/services/analysisResultSnapshotPipeline.js.map +1 -0
- package/dist/services/analysisResultSnapshotStore.d.ts +29 -0
- package/dist/services/analysisResultSnapshotStore.d.ts.map +1 -0
- package/dist/services/analysisResultSnapshotStore.js +457 -0
- package/dist/services/analysisResultSnapshotStore.js.map +1 -0
- package/dist/services/analysisResultWindowStateStore.d.ts +37 -0
- package/dist/services/analysisResultWindowStateStore.d.ts.map +1 -0
- package/dist/services/analysisResultWindowStateStore.js +190 -0
- package/dist/services/analysisResultWindowStateStore.js.map +1 -0
- package/dist/services/analysisRunStore.d.ts +38 -0
- package/dist/services/analysisRunStore.d.ts.map +1 -0
- package/dist/services/analysisRunStore.js +195 -0
- package/dist/services/analysisRunStore.js.map +1 -0
- package/dist/services/analysisTemplates/cpuCoreAnalysis.d.ts +70 -0
- package/dist/services/analysisTemplates/cpuCoreAnalysis.d.ts.map +1 -0
- package/dist/services/analysisTemplates/cpuCoreAnalysis.js +277 -0
- package/dist/services/analysisTemplates/cpuCoreAnalysis.js.map +1 -0
- package/dist/services/analysisTemplates/fourQuadrantAnalysis.d.ts +64 -0
- package/dist/services/analysisTemplates/fourQuadrantAnalysis.d.ts.map +1 -0
- package/dist/services/analysisTemplates/fourQuadrantAnalysis.js +288 -0
- package/dist/services/analysisTemplates/fourQuadrantAnalysis.js.map +1 -0
- package/dist/services/analysisTemplates/frameStatsAnalysis.d.ts +77 -0
- package/dist/services/analysisTemplates/frameStatsAnalysis.d.ts.map +1 -0
- package/dist/services/analysisTemplates/frameStatsAnalysis.js +232 -0
- package/dist/services/analysisTemplates/frameStatsAnalysis.js.map +1 -0
- package/dist/services/analysisTemplates/templateManager.d.ts +70 -0
- package/dist/services/analysisTemplates/templateManager.d.ts.map +1 -0
- package/dist/services/analysisTemplates/templateManager.js +293 -0
- package/dist/services/analysisTemplates/templateManager.js.map +1 -0
- package/dist/services/anonymizer.d.ts +61 -0
- package/dist/services/anonymizer.d.ts.map +1 -0
- package/dist/services/anonymizer.js +232 -0
- package/dist/services/anonymizer.js.map +1 -0
- package/dist/services/aospKnowledgeIngester.d.ts +67 -0
- package/dist/services/aospKnowledgeIngester.d.ts.map +1 -0
- package/dist/services/aospKnowledgeIngester.js +171 -0
- package/dist/services/aospKnowledgeIngester.js.map +1 -0
- package/dist/services/artifactCompression.d.ts +52 -0
- package/dist/services/artifactCompression.d.ts.map +1 -0
- package/dist/services/artifactCompression.js +215 -0
- package/dist/services/artifactCompression.js.map +1 -0
- package/dist/services/baselineDiffer.d.ts +85 -0
- package/dist/services/baselineDiffer.d.ts.map +1 -0
- package/dist/services/baselineDiffer.js +287 -0
- package/dist/services/baselineDiffer.js.map +1 -0
- package/dist/services/baselineStore.d.ts +52 -0
- package/dist/services/baselineStore.d.ts.map +1 -0
- package/dist/services/baselineStore.js +224 -0
- package/dist/services/baselineStore.js.map +1 -0
- package/dist/services/binderRootCauseChain.d.ts +38 -0
- package/dist/services/binderRootCauseChain.d.ts.map +1 -0
- package/dist/services/binderRootCauseChain.js +74 -0
- package/dist/services/binderRootCauseChain.js.map +1 -0
- package/dist/services/blogKnowledgeIngester.d.ts +89 -0
- package/dist/services/blogKnowledgeIngester.d.ts.map +1 -0
- package/dist/services/blogKnowledgeIngester.js +192 -0
- package/dist/services/blogKnowledgeIngester.js.map +1 -0
- package/dist/services/caseGraph.d.ts +55 -0
- package/dist/services/caseGraph.d.ts.map +1 -0
- package/dist/services/caseGraph.js +260 -0
- package/dist/services/caseGraph.js.map +1 -0
- package/dist/services/caseLibrary.d.ts +61 -0
- package/dist/services/caseLibrary.d.ts.map +1 -0
- package/dist/services/caseLibrary.js +269 -0
- package/dist/services/caseLibrary.js.map +1 -0
- package/dist/services/ciGateRunStore.d.ts +39 -0
- package/dist/services/ciGateRunStore.d.ts.map +1 -0
- package/dist/services/ciGateRunStore.js +208 -0
- package/dist/services/ciGateRunStore.js.map +1 -0
- package/dist/services/comparisonAiConclusionService.d.ts +23 -0
- package/dist/services/comparisonAiConclusionService.d.ts.map +1 -0
- package/dist/services/comparisonAiConclusionService.js +207 -0
- package/dist/services/comparisonAiConclusionService.js.map +1 -0
- package/dist/services/comparisonAppendixService.d.ts +50 -0
- package/dist/services/comparisonAppendixService.d.ts.map +1 -0
- package/dist/services/comparisonAppendixService.js +276 -0
- package/dist/services/comparisonAppendixService.js.map +1 -0
- package/dist/services/comparisonHtmlReportService.d.ts +20 -0
- package/dist/services/comparisonHtmlReportService.d.ts.map +1 -0
- package/dist/services/comparisonHtmlReportService.js +214 -0
- package/dist/services/comparisonHtmlReportService.js.map +1 -0
- package/dist/services/comparisonMatrixService.d.ts +7 -0
- package/dist/services/comparisonMatrixService.d.ts.map +1 -0
- package/dist/services/comparisonMatrixService.js +211 -0
- package/dist/services/comparisonMatrixService.js.map +1 -0
- package/dist/services/comparisonResultService.d.ts +13 -0
- package/dist/services/comparisonResultService.d.ts.map +1 -0
- package/dist/services/comparisonResultService.js +99 -0
- package/dist/services/comparisonResultService.js.map +1 -0
- package/dist/services/comparisonSignificance.d.ts +3 -0
- package/dist/services/comparisonSignificance.d.ts.map +1 -0
- package/dist/services/comparisonSignificance.js +42 -0
- package/dist/services/comparisonSignificance.js.map +1 -0
- package/dist/services/cpuThermalPmu.d.ts +38 -0
- package/dist/services/cpuThermalPmu.d.ts.map +1 -0
- package/dist/services/cpuThermalPmu.js +141 -0
- package/dist/services/cpuThermalPmu.js.map +1 -0
- package/dist/services/criticalPathAiSummary.d.ts +29 -0
- package/dist/services/criticalPathAiSummary.d.ts.map +1 -0
- package/dist/services/criticalPathAiSummary.js +310 -0
- package/dist/services/criticalPathAiSummary.js.map +1 -0
- package/dist/services/criticalPathAnalyzer.d.ts +108 -0
- package/dist/services/criticalPathAnalyzer.d.ts.map +1 -0
- package/dist/services/criticalPathAnalyzer.js +880 -0
- package/dist/services/criticalPathAnalyzer.js.map +1 -0
- package/dist/services/criticalPathQuantify.d.ts +70 -0
- package/dist/services/criticalPathQuantify.d.ts.map +1 -0
- package/dist/services/criticalPathQuantify.js +214 -0
- package/dist/services/criticalPathQuantify.js.map +1 -0
- package/dist/services/criticalPathSemantics.d.ts +95 -0
- package/dist/services/criticalPathSemantics.d.ts.map +1 -0
- package/dist/services/criticalPathSemantics.js +453 -0
- package/dist/services/criticalPathSemantics.js.map +1 -0
- package/dist/services/criticalPathWakerChain.d.ts +38 -0
- package/dist/services/criticalPathWakerChain.d.ts.map +1 -0
- package/dist/services/criticalPathWakerChain.js +144 -0
- package/dist/services/criticalPathWakerChain.js.map +1 -0
- package/dist/services/domainSkillEvalHarness.d.ts +51 -0
- package/dist/services/domainSkillEvalHarness.d.ts.map +1 -0
- package/dist/services/domainSkillEvalHarness.js +141 -0
- package/dist/services/domainSkillEvalHarness.js.map +1 -0
- package/dist/services/enhancedAIService.d.ts +81 -0
- package/dist/services/enhancedAIService.d.ts.map +1 -0
- package/dist/services/enhancedAIService.js +277 -0
- package/dist/services/enhancedAIService.js.map +1 -0
- package/dist/services/enterpriseAdminControlPlaneService.d.ts +124 -0
- package/dist/services/enterpriseAdminControlPlaneService.d.ts.map +1 -0
- package/dist/services/enterpriseAdminControlPlaneService.js +323 -0
- package/dist/services/enterpriseAdminControlPlaneService.js.map +1 -0
- package/dist/services/enterpriseApiKeyService.d.ts +56 -0
- package/dist/services/enterpriseApiKeyService.d.ts.map +1 -0
- package/dist/services/enterpriseApiKeyService.js +260 -0
- package/dist/services/enterpriseApiKeyService.js.map +1 -0
- package/dist/services/enterpriseAuditService.d.ts +30 -0
- package/dist/services/enterpriseAuditService.d.ts.map +1 -0
- package/dist/services/enterpriseAuditService.js +73 -0
- package/dist/services/enterpriseAuditService.js.map +1 -0
- package/dist/services/enterpriseDb.d.ts +5 -0
- package/dist/services/enterpriseDb.d.ts.map +1 -0
- package/dist/services/enterpriseDb.js +33 -0
- package/dist/services/enterpriseDb.js.map +1 -0
- package/dist/services/enterpriseMigration.d.ts +89 -0
- package/dist/services/enterpriseMigration.d.ts.map +1 -0
- package/dist/services/enterpriseMigration.js +506 -0
- package/dist/services/enterpriseMigration.js.map +1 -0
- package/dist/services/enterpriseOidcClient.d.ts +36 -0
- package/dist/services/enterpriseOidcClient.d.ts.map +1 -0
- package/dist/services/enterpriseOidcClient.js +124 -0
- package/dist/services/enterpriseOidcClient.js.map +1 -0
- package/dist/services/enterpriseQuotaPolicyService.d.ts +37 -0
- package/dist/services/enterpriseQuotaPolicyService.d.ts.map +1 -0
- package/dist/services/enterpriseQuotaPolicyService.js +198 -0
- package/dist/services/enterpriseQuotaPolicyService.js.map +1 -0
- package/dist/services/enterpriseRepository.d.ts +36 -0
- package/dist/services/enterpriseRepository.d.ts.map +1 -0
- package/dist/services/enterpriseRepository.js +208 -0
- package/dist/services/enterpriseRepository.js.map +1 -0
- package/dist/services/enterpriseRuntimeDashboardService.d.ts +114 -0
- package/dist/services/enterpriseRuntimeDashboardService.d.ts.map +1 -0
- package/dist/services/enterpriseRuntimeDashboardService.js +205 -0
- package/dist/services/enterpriseRuntimeDashboardService.js.map +1 -0
- package/dist/services/enterpriseSchema.d.ts +7 -0
- package/dist/services/enterpriseSchema.d.ts.map +1 -0
- package/dist/services/enterpriseSchema.js +688 -0
- package/dist/services/enterpriseSchema.js.map +1 -0
- package/dist/services/enterpriseSsoService.d.ts +99 -0
- package/dist/services/enterpriseSsoService.d.ts.map +1 -0
- package/dist/services/enterpriseSsoService.js +538 -0
- package/dist/services/enterpriseSsoService.js.map +1 -0
- package/dist/services/enterpriseTenantExportService.d.ts +58 -0
- package/dist/services/enterpriseTenantExportService.d.ts.map +1 -0
- package/dist/services/enterpriseTenantExportService.js +339 -0
- package/dist/services/enterpriseTenantExportService.js.map +1 -0
- package/dist/services/enterpriseTenantLifecycleService.d.ts +52 -0
- package/dist/services/enterpriseTenantLifecycleService.d.ts.map +1 -0
- package/dist/services/enterpriseTenantLifecycleService.js +323 -0
- package/dist/services/enterpriseTenantLifecycleService.js.map +1 -0
- package/dist/services/flamegraphAiSummary.d.ts +4 -0
- package/dist/services/flamegraphAiSummary.d.ts.map +1 -0
- package/dist/services/flamegraphAiSummary.js +172 -0
- package/dist/services/flamegraphAiSummary.js.map +1 -0
- package/dist/services/flamegraphAnalyzer.d.ts +14 -0
- package/dist/services/flamegraphAnalyzer.d.ts.map +1 -0
- package/dist/services/flamegraphAnalyzer.js +607 -0
- package/dist/services/flamegraphAnalyzer.js.map +1 -0
- package/dist/services/flamegraphTypes.d.ts +106 -0
- package/dist/services/flamegraphTypes.d.ts.map +1 -0
- package/dist/services/flamegraphTypes.js +6 -0
- package/dist/services/flamegraphTypes.js.map +1 -0
- package/dist/services/gpuSurfaceFlinger.d.ts +27 -0
- package/dist/services/gpuSurfaceFlinger.d.ts.map +1 -0
- package/dist/services/gpuSurfaceFlinger.js +68 -0
- package/dist/services/gpuSurfaceFlinger.js.map +1 -0
- package/dist/services/htmlReportGenerator.d.ts +425 -0
- package/dist/services/htmlReportGenerator.d.ts.map +1 -0
- package/dist/services/htmlReportGenerator.js +5110 -0
- package/dist/services/htmlReportGenerator.js.map +1 -0
- package/dist/services/ioNetworkWakeup.d.ts +27 -0
- package/dist/services/ioNetworkWakeup.d.ts.map +1 -0
- package/dist/services/ioNetworkWakeup.js +68 -0
- package/dist/services/ioNetworkWakeup.js.map +1 -0
- package/dist/services/jankDecisionTree.d.ts +39 -0
- package/dist/services/jankDecisionTree.d.ts.map +1 -0
- package/dist/services/jankDecisionTree.js +230 -0
- package/dist/services/jankDecisionTree.js.map +1 -0
- package/dist/services/legacyApiTelemetry.d.ts +28 -0
- package/dist/services/legacyApiTelemetry.d.ts.map +1 -0
- package/dist/services/legacyApiTelemetry.js +157 -0
- package/dist/services/legacyApiTelemetry.js.map +1 -0
- package/dist/services/memoryRootCause.d.ts +24 -0
- package/dist/services/memoryRootCause.d.ts.map +1 -0
- package/dist/services/memoryRootCause.js +70 -0
- package/dist/services/memoryRootCause.js.map +1 -0
- package/dist/services/multiTraceComparisonStore.d.ts +28 -0
- package/dist/services/multiTraceComparisonStore.d.ts.map +1 -0
- package/dist/services/multiTraceComparisonStore.js +220 -0
- package/dist/services/multiTraceComparisonStore.js.map +1 -0
- package/dist/services/oemSdkKnowledgeIngester.d.ts +62 -0
- package/dist/services/oemSdkKnowledgeIngester.d.ts.map +1 -0
- package/dist/services/oemSdkKnowledgeIngester.js +154 -0
- package/dist/services/oemSdkKnowledgeIngester.js.map +1 -0
- package/dist/services/perfettoLocalService.d.ts +25 -0
- package/dist/services/perfettoLocalService.d.ts.map +1 -0
- package/dist/services/perfettoLocalService.js +213 -0
- package/dist/services/perfettoLocalService.js.map +1 -0
- package/dist/services/perfettoService.d.ts +39 -0
- package/dist/services/perfettoService.d.ts.map +1 -0
- package/dist/services/perfettoService.js +330 -0
- package/dist/services/perfettoService.js.map +1 -0
- package/dist/services/perfettoSqlDocs.d.ts +94 -0
- package/dist/services/perfettoSqlDocs.d.ts.map +1 -0
- package/dist/services/perfettoSqlDocs.js +222 -0
- package/dist/services/perfettoSqlDocs.js.map +1 -0
- package/dist/services/perfettoSqlSkill.d.ts +263 -0
- package/dist/services/perfettoSqlSkill.d.ts.map +1 -0
- package/dist/services/perfettoSqlSkill.js +3731 -0
- package/dist/services/perfettoSqlSkill.js.map +1 -0
- package/dist/services/perfettoStdlibScanner.d.ts +66 -0
- package/dist/services/perfettoStdlibScanner.d.ts.map +1 -0
- package/dist/services/perfettoStdlibScanner.js +345 -0
- package/dist/services/perfettoStdlibScanner.js.map +1 -0
- package/dist/services/persistAgentSession.d.ts +43 -0
- package/dist/services/persistAgentSession.d.ts.map +1 -0
- package/dist/services/persistAgentSession.js +146 -0
- package/dist/services/persistAgentSession.js.map +1 -0
- package/dist/services/pipelineDocService.d.ts +83 -0
- package/dist/services/pipelineDocService.d.ts.map +1 -0
- package/dist/services/pipelineDocService.js +417 -0
- package/dist/services/pipelineDocService.js.map +1 -0
- package/dist/services/pipelineSkillLoader.d.ts +173 -0
- package/dist/services/pipelineSkillLoader.d.ts.map +1 -0
- package/dist/services/pipelineSkillLoader.js +301 -0
- package/dist/services/pipelineSkillLoader.js.map +1 -0
- package/dist/services/portPool.d.ts +85 -0
- package/dist/services/portPool.d.ts.map +1 -0
- package/dist/services/portPool.js +221 -0
- package/dist/services/portPool.js.map +1 -0
- package/dist/services/processIdentity/identityGate.d.ts +27 -0
- package/dist/services/processIdentity/identityGate.d.ts.map +1 -0
- package/dist/services/processIdentity/identityGate.js +284 -0
- package/dist/services/processIdentity/identityGate.js.map +1 -0
- package/dist/services/processIdentity/types.d.ts +49 -0
- package/dist/services/processIdentity/types.d.ts.map +1 -0
- package/dist/services/processIdentity/types.js +16 -0
- package/dist/services/processIdentity/types.js.map +1 -0
- package/dist/services/processRss.d.ts +10 -0
- package/dist/services/processRss.d.ts.map +1 -0
- package/dist/services/processRss.js +78 -0
- package/dist/services/processRss.js.map +1 -0
- package/dist/services/promptTemplateService.d.ts +68 -0
- package/dist/services/promptTemplateService.d.ts.map +1 -0
- package/dist/services/promptTemplateService.js +196 -0
- package/dist/services/promptTemplateService.js.map +1 -0
- package/dist/services/providerManager/connectionTester.d.ts +3 -0
- package/dist/services/providerManager/connectionTester.d.ts.map +1 -0
- package/dist/services/providerManager/connectionTester.js +479 -0
- package/dist/services/providerManager/connectionTester.js.map +1 -0
- package/dist/services/providerManager/envIsolation.d.ts +3 -0
- package/dist/services/providerManager/envIsolation.d.ts.map +1 -0
- package/dist/services/providerManager/envIsolation.js +31 -0
- package/dist/services/providerManager/envIsolation.js.map +1 -0
- package/dist/services/providerManager/index.d.ts +9 -0
- package/dist/services/providerManager/index.d.ts.map +1 -0
- package/dist/services/providerManager/index.js +40 -0
- package/dist/services/providerManager/index.js.map +1 -0
- package/dist/services/providerManager/localSecretStore.d.ts +32 -0
- package/dist/services/providerManager/localSecretStore.d.ts.map +1 -0
- package/dist/services/providerManager/localSecretStore.js +338 -0
- package/dist/services/providerManager/localSecretStore.js.map +1 -0
- package/dist/services/providerManager/providerService.d.ts +31 -0
- package/dist/services/providerManager/providerService.d.ts.map +1 -0
- package/dist/services/providerManager/providerService.js +460 -0
- package/dist/services/providerManager/providerService.js.map +1 -0
- package/dist/services/providerManager/providerSnapshot.d.ts +30 -0
- package/dist/services/providerManager/providerSnapshot.d.ts.map +1 -0
- package/dist/services/providerManager/providerSnapshot.js +224 -0
- package/dist/services/providerManager/providerSnapshot.js.map +1 -0
- package/dist/services/providerManager/providerStore.d.ts +31 -0
- package/dist/services/providerManager/providerStore.d.ts.map +1 -0
- package/dist/services/providerManager/providerStore.js +553 -0
- package/dist/services/providerManager/providerStore.js.map +1 -0
- package/dist/services/providerManager/templates.d.ts +3 -0
- package/dist/services/providerManager/templates.d.ts.map +1 -0
- package/dist/services/providerManager/templates.js +328 -0
- package/dist/services/providerManager/templates.js.map +1 -0
- package/dist/services/providerManager/types.d.ts +119 -0
- package/dist/services/providerManager/types.d.ts.map +1 -0
- package/dist/services/providerManager/types.js +5 -0
- package/dist/services/providerManager/types.js.map +1 -0
- package/dist/services/ragStore.d.ts +60 -0
- package/dist/services/ragStore.d.ts.map +1 -0
- package/dist/services/ragStore.js +297 -0
- package/dist/services/ragStore.js.map +1 -0
- package/dist/services/rbac.d.ts +19 -0
- package/dist/services/rbac.d.ts.map +1 -0
- package/dist/services/rbac.js +153 -0
- package/dist/services/rbac.js.map +1 -0
- package/dist/services/renderingPipelineDetectionSkillGenerator.d.ts +3 -0
- package/dist/services/renderingPipelineDetectionSkillGenerator.d.ts.map +1 -0
- package/dist/services/renderingPipelineDetectionSkillGenerator.js +1120 -0
- package/dist/services/renderingPipelineDetectionSkillGenerator.js.map +1 -0
- package/dist/services/renderingPipelineTeachingService.d.ts +33 -0
- package/dist/services/renderingPipelineTeachingService.d.ts.map +1 -0
- package/dist/services/renderingPipelineTeachingService.js +1312 -0
- package/dist/services/renderingPipelineTeachingService.js.map +1 -0
- package/dist/services/reportCausalMapAssets.d.ts +3 -0
- package/dist/services/reportCausalMapAssets.d.ts.map +1 -0
- package/dist/services/reportCausalMapAssets.js +898 -0
- package/dist/services/reportCausalMapAssets.js.map +1 -0
- package/dist/services/reportGenerator.d.ts +54 -0
- package/dist/services/reportGenerator.d.ts.map +1 -0
- package/dist/services/reportGenerator.js +241 -0
- package/dist/services/reportGenerator.js.map +1 -0
- package/dist/services/resourceOwnership.d.ts +21 -0
- package/dist/services/resourceOwnership.d.ts.map +1 -0
- package/dist/services/resourceOwnership.js +50 -0
- package/dist/services/resourceOwnership.js.map +1 -0
- package/dist/services/resultExportService.d.ts +66 -0
- package/dist/services/resultExportService.d.ts.map +1 -0
- package/dist/services/resultExportService.js +170 -0
- package/dist/services/resultExportService.js.map +1 -0
- package/dist/services/runtimeSnapshotStore.d.ts +19 -0
- package/dist/services/runtimeSnapshotStore.d.ts.map +1 -0
- package/dist/services/runtimeSnapshotStore.js +222 -0
- package/dist/services/runtimeSnapshotStore.js.map +1 -0
- package/dist/services/sceneReport/sceneReportMemoryCache.d.ts +38 -0
- package/dist/services/sceneReport/sceneReportMemoryCache.d.ts.map +1 -0
- package/dist/services/sceneReport/sceneReportMemoryCache.js +55 -0
- package/dist/services/sceneReport/sceneReportMemoryCache.js.map +1 -0
- package/dist/services/sceneReport/sceneReportStore.d.ts +41 -0
- package/dist/services/sceneReport/sceneReportStore.d.ts.map +1 -0
- package/dist/services/sceneReport/sceneReportStore.js +248 -0
- package/dist/services/sceneReport/sceneReportStore.js.map +1 -0
- package/dist/services/scopedKnowledgeStore.d.ts +45 -0
- package/dist/services/scopedKnowledgeStore.d.ts.map +1 -0
- package/dist/services/scopedKnowledgeStore.js +225 -0
- package/dist/services/scopedKnowledgeStore.js.map +1 -0
- package/dist/services/sessionLogger.d.ts +142 -0
- package/dist/services/sessionLogger.d.ts.map +1 -0
- package/dist/services/sessionLogger.js +566 -0
- package/dist/services/sessionLogger.js.map +1 -0
- package/dist/services/sessionPersistenceService.d.ts +190 -0
- package/dist/services/sessionPersistenceService.d.ts.map +1 -0
- package/dist/services/sessionPersistenceService.js +737 -0
- package/dist/services/sessionPersistenceService.js.map +1 -0
- package/dist/services/skillEngine/answerGenerator.d.ts +102 -0
- package/dist/services/skillEngine/answerGenerator.d.ts.map +1 -0
- package/dist/services/skillEngine/answerGenerator.js +508 -0
- package/dist/services/skillEngine/answerGenerator.js.map +1 -0
- package/dist/services/skillEngine/displayContractValidator.d.ts +26 -0
- package/dist/services/skillEngine/displayContractValidator.d.ts.map +1 -0
- package/dist/services/skillEngine/displayContractValidator.js +232 -0
- package/dist/services/skillEngine/displayContractValidator.js.map +1 -0
- package/dist/services/skillEngine/eventCollector.d.ts +96 -0
- package/dist/services/skillEngine/eventCollector.d.ts.map +1 -0
- package/dist/services/skillEngine/eventCollector.js +226 -0
- package/dist/services/skillEngine/eventCollector.js.map +1 -0
- package/dist/services/skillEngine/expressionUtils.d.ts +25 -0
- package/dist/services/skillEngine/expressionUtils.d.ts.map +1 -0
- package/dist/services/skillEngine/expressionUtils.js +66 -0
- package/dist/services/skillEngine/expressionUtils.js.map +1 -0
- package/dist/services/skillEngine/index.d.ts +25 -0
- package/dist/services/skillEngine/index.d.ts.map +1 -0
- package/dist/services/skillEngine/index.js +98 -0
- package/dist/services/skillEngine/index.js.map +1 -0
- package/dist/services/skillEngine/skillAnalysisAdapter.d.ts +149 -0
- package/dist/services/skillEngine/skillAnalysisAdapter.d.ts.map +1 -0
- package/dist/services/skillEngine/skillAnalysisAdapter.js +752 -0
- package/dist/services/skillEngine/skillAnalysisAdapter.js.map +1 -0
- package/dist/services/skillEngine/skillExecutor.d.ts +371 -0
- package/dist/services/skillEngine/skillExecutor.d.ts.map +1 -0
- package/dist/services/skillEngine/skillExecutor.js +4129 -0
- package/dist/services/skillEngine/skillExecutor.js.map +1 -0
- package/dist/services/skillEngine/skillLoader.d.ts +163 -0
- package/dist/services/skillEngine/skillLoader.d.ts.map +1 -0
- package/dist/services/skillEngine/skillLoader.js +840 -0
- package/dist/services/skillEngine/skillLoader.js.map +1 -0
- package/dist/services/skillEngine/skillValidator.d.ts +53 -0
- package/dist/services/skillEngine/skillValidator.d.ts.map +1 -0
- package/dist/services/skillEngine/skillValidator.js +274 -0
- package/dist/services/skillEngine/skillValidator.js.map +1 -0
- package/dist/services/skillEngine/smartSummaryGenerator.d.ts +70 -0
- package/dist/services/skillEngine/smartSummaryGenerator.d.ts.map +1 -0
- package/dist/services/skillEngine/smartSummaryGenerator.js +324 -0
- package/dist/services/skillEngine/smartSummaryGenerator.js.map +1 -0
- package/dist/services/skillEngine/types.d.ts +584 -0
- package/dist/services/skillEngine/types.d.ts.map +1 -0
- package/dist/services/skillEngine/types.js +6 -0
- package/dist/services/skillEngine/types.js.map +1 -0
- package/dist/services/smartperfettoSqlPackage.d.ts +11 -0
- package/dist/services/smartperfettoSqlPackage.d.ts.map +1 -0
- package/dist/services/smartperfettoSqlPackage.js +168 -0
- package/dist/services/smartperfettoSqlPackage.js.map +1 -0
- package/dist/services/sqlGuardrailAnalyzer.d.ts +24 -0
- package/dist/services/sqlGuardrailAnalyzer.d.ts.map +1 -0
- package/dist/services/sqlGuardrailAnalyzer.js +362 -0
- package/dist/services/sqlGuardrailAnalyzer.js.map +1 -0
- package/dist/services/sqlKnowledgeBase.d.ts +236 -0
- package/dist/services/sqlKnowledgeBase.d.ts.map +1 -0
- package/dist/services/sqlKnowledgeBase.js +1109 -0
- package/dist/services/sqlKnowledgeBase.js.map +1 -0
- package/dist/services/sqlStdlibDependencyAnalyzer.d.ts +26 -0
- package/dist/services/sqlStdlibDependencyAnalyzer.d.ts.map +1 -0
- package/dist/services/sqlStdlibDependencyAnalyzer.js +486 -0
- package/dist/services/sqlStdlibDependencyAnalyzer.js.map +1 -0
- package/dist/services/sqlTemplateEngine.d.ts +134 -0
- package/dist/services/sqlTemplateEngine.d.ts.map +1 -0
- package/dist/services/sqlTemplateEngine.js +430 -0
- package/dist/services/sqlTemplateEngine.js.map +1 -0
- package/dist/services/sqlValidator.d.ts +21 -0
- package/dist/services/sqlValidator.d.ts.map +1 -0
- package/dist/services/sqlValidator.js +175 -0
- package/dist/services/sqlValidator.js.map +1 -0
- package/dist/services/standardMetricBackfillService.d.ts +23 -0
- package/dist/services/standardMetricBackfillService.d.ts.map +1 -0
- package/dist/services/standardMetricBackfillService.js +196 -0
- package/dist/services/standardMetricBackfillService.js.map +1 -0
- package/dist/services/startupAnrMethodGraph.d.ts +20 -0
- package/dist/services/startupAnrMethodGraph.d.ts.map +1 -0
- package/dist/services/startupAnrMethodGraph.js +70 -0
- package/dist/services/startupAnrMethodGraph.js.map +1 -0
- package/dist/services/stdlibSkillCoverage.d.ts +23 -0
- package/dist/services/stdlibSkillCoverage.d.ts.map +1 -0
- package/dist/services/stdlibSkillCoverage.js +289 -0
- package/dist/services/stdlibSkillCoverage.js.map +1 -0
- package/dist/services/threadSchedContext.d.ts +49 -0
- package/dist/services/threadSchedContext.d.ts.map +1 -0
- package/dist/services/threadSchedContext.js +84 -0
- package/dist/services/threadSchedContext.js.map +1 -0
- package/dist/services/timelineBinning.d.ts +44 -0
- package/dist/services/timelineBinning.d.ts.map +1 -0
- package/dist/services/timelineBinning.js +150 -0
- package/dist/services/timelineBinning.js.map +1 -0
- package/dist/services/traceConfigGenerator.d.ts +36 -0
- package/dist/services/traceConfigGenerator.d.ts.map +1 -0
- package/dist/services/traceConfigGenerator.js +110 -0
- package/dist/services/traceConfigGenerator.js.map +1 -0
- package/dist/services/traceFormatDetector.d.ts +39 -0
- package/dist/services/traceFormatDetector.d.ts.map +1 -0
- package/dist/services/traceFormatDetector.js +287 -0
- package/dist/services/traceFormatDetector.js.map +1 -0
- package/dist/services/traceMetadataStore.d.ts +32 -0
- package/dist/services/traceMetadataStore.d.ts.map +1 -0
- package/dist/services/traceMetadataStore.js +375 -0
- package/dist/services/traceMetadataStore.js.map +1 -0
- package/dist/services/traceProcessorConnectionModel.d.ts +32 -0
- package/dist/services/traceProcessorConnectionModel.d.ts.map +1 -0
- package/dist/services/traceProcessorConnectionModel.js +38 -0
- package/dist/services/traceProcessorConnectionModel.js.map +1 -0
- package/dist/services/traceProcessorHttpRpcClient.d.ts +22 -0
- package/dist/services/traceProcessorHttpRpcClient.d.ts.map +1 -0
- package/dist/services/traceProcessorHttpRpcClient.js +89 -0
- package/dist/services/traceProcessorHttpRpcClient.js.map +1 -0
- package/dist/services/traceProcessorLeaseModeDecision.d.ts +52 -0
- package/dist/services/traceProcessorLeaseModeDecision.d.ts.map +1 -0
- package/dist/services/traceProcessorLeaseModeDecision.js +150 -0
- package/dist/services/traceProcessorLeaseModeDecision.js.map +1 -0
- package/dist/services/traceProcessorLeaseStore.d.ts +88 -0
- package/dist/services/traceProcessorLeaseStore.d.ts.map +1 -0
- package/dist/services/traceProcessorLeaseStore.js +463 -0
- package/dist/services/traceProcessorLeaseStore.js.map +1 -0
- package/dist/services/traceProcessorProtobuf.d.ts +56 -0
- package/dist/services/traceProcessorProtobuf.d.ts.map +1 -0
- package/dist/services/traceProcessorProtobuf.js +442 -0
- package/dist/services/traceProcessorProtobuf.js.map +1 -0
- package/dist/services/traceProcessorRamBudget.d.ts +55 -0
- package/dist/services/traceProcessorRamBudget.d.ts.map +1 -0
- package/dist/services/traceProcessorRamBudget.js +140 -0
- package/dist/services/traceProcessorRamBudget.js.map +1 -0
- package/dist/services/traceProcessorService.d.ts +223 -0
- package/dist/services/traceProcessorService.d.ts.map +1 -0
- package/dist/services/traceProcessorService.js +838 -0
- package/dist/services/traceProcessorService.js.map +1 -0
- package/dist/services/traceProcessorSqlWorker.d.ts +49 -0
- package/dist/services/traceProcessorSqlWorker.d.ts.map +1 -0
- package/dist/services/traceProcessorSqlWorker.js +218 -0
- package/dist/services/traceProcessorSqlWorker.js.map +1 -0
- package/dist/services/traceProcessorSqlWorkerThread.d.ts +2 -0
- package/dist/services/traceProcessorSqlWorkerThread.d.ts.map +1 -0
- package/dist/services/traceProcessorSqlWorkerThread.js +35 -0
- package/dist/services/traceProcessorSqlWorkerThread.js.map +1 -0
- package/dist/services/traceSummaryV2.d.ts +47 -0
- package/dist/services/traceSummaryV2.d.ts.map +1 -0
- package/dist/services/traceSummaryV2.js +241 -0
- package/dist/services/traceSummaryV2.js.map +1 -0
- package/dist/services/traceUploadLimit.d.ts +3 -0
- package/dist/services/traceUploadLimit.d.ts.map +1 -0
- package/dist/services/traceUploadLimit.js +24 -0
- package/dist/services/traceUploadLimit.js.map +1 -0
- package/dist/services/workingTraceProcessor.d.ts +226 -0
- package/dist/services/workingTraceProcessor.d.ts.map +1 -0
- package/dist/services/workingTraceProcessor.js +1093 -0
- package/dist/services/workingTraceProcessor.js.map +1 -0
- package/dist/trace-processor-pin.env +39 -0
- package/dist/types/analysis.d.ts +511 -0
- package/dist/types/analysis.d.ts.map +1 -0
- package/dist/types/analysis.js +112 -0
- package/dist/types/analysis.js.map +1 -0
- package/dist/types/ciGateContracts.d.ts +63 -0
- package/dist/types/ciGateContracts.d.ts.map +1 -0
- package/dist/types/ciGateContracts.js +6 -0
- package/dist/types/ciGateContracts.js.map +1 -0
- package/dist/types/dataContract.d.ts +624 -0
- package/dist/types/dataContract.d.ts.map +1 -0
- package/dist/types/dataContract.js +775 -0
- package/dist/types/dataContract.js.map +1 -0
- package/dist/types/index.d.ts +40 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +21 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/multiTraceComparison.d.ts +215 -0
- package/dist/types/multiTraceComparison.d.ts.map +1 -0
- package/dist/types/multiTraceComparison.js +33 -0
- package/dist/types/multiTraceComparison.js.map +1 -0
- package/dist/types/perfettoSql.d.ts +596 -0
- package/dist/types/perfettoSql.d.ts.map +1 -0
- package/dist/types/perfettoSql.js +28 -0
- package/dist/types/perfettoSql.js.map +1 -0
- package/dist/types/sparkContracts.d.ts +1642 -0
- package/dist/types/sparkContracts.d.ts.map +1 -0
- package/dist/types/sparkContracts.js +25 -0
- package/dist/types/sparkContracts.js.map +1 -0
- package/dist/types/teaching.types.d.ts +395 -0
- package/dist/types/teaching.types.d.ts.map +1 -0
- package/dist/types/teaching.types.js +300 -0
- package/dist/types/teaching.types.js.map +1 -0
- package/dist/utils/analysisNarrative.d.ts +24 -0
- package/dist/utils/analysisNarrative.d.ts.map +1 -0
- package/dist/utils/analysisNarrative.js +101 -0
- package/dist/utils/analysisNarrative.js.map +1 -0
- package/dist/utils/atomicFileWriter.d.ts +5 -0
- package/dist/utils/atomicFileWriter.d.ts.map +1 -0
- package/dist/utils/atomicFileWriter.js +90 -0
- package/dist/utils/atomicFileWriter.js.map +1 -0
- package/dist/utils/epipeGuard.d.ts +10 -0
- package/dist/utils/epipeGuard.d.ts.map +1 -0
- package/dist/utils/epipeGuard.js +40 -0
- package/dist/utils/epipeGuard.js.map +1 -0
- package/dist/utils/httpValue.d.ts +2 -0
- package/dist/utils/httpValue.d.ts.map +1 -0
- package/dist/utils/httpValue.js +24 -0
- package/dist/utils/httpValue.js.map +1 -0
- package/dist/utils/llmJson.d.ts +33 -0
- package/dist/utils/llmJson.d.ts.map +1 -0
- package/dist/utils/llmJson.js +148 -0
- package/dist/utils/llmJson.js.map +1 -0
- package/dist/utils/llmPrivacy.d.ts +15 -0
- package/dist/utils/llmPrivacy.d.ts.map +1 -0
- package/dist/utils/llmPrivacy.js +126 -0
- package/dist/utils/llmPrivacy.js.map +1 -0
- package/dist/utils/logger.d.ts +24 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +68 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/traceProcessorRowUtils.d.ts +11 -0
- package/dist/utils/traceProcessorRowUtils.d.ts.map +1 -0
- package/dist/utils/traceProcessorRowUtils.js +64 -0
- package/dist/utils/traceProcessorRowUtils.js.map +1 -0
- package/dist/utils/uuid.d.ts +3 -0
- package/dist/utils/uuid.d.ts.map +1 -0
- package/dist/utils/uuid.js +7 -0
- package/dist/utils/uuid.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +53 -0
- package/dist/version.js.map +1 -0
- package/package.json +128 -0
- package/prebuilts/trace_processor/README.md +20 -0
- package/prebuilts/trace_processor/darwin-arm64/trace_processor_shell +0 -0
- package/prebuilts/trace_processor/linux-x64/trace_processor_shell +0 -0
- package/prebuilts/trace_processor/win32-x64/trace_processor_shell.exe +0 -0
- package/skills/README.md +686 -0
- package/skills/_template/README.md +43 -0
- package/skills/_template/atomic_A_template.skill.yaml +79 -0
- package/skills/_template/atomic_B_template.skill.yaml +61 -0
- package/skills/_template/atomic_S_template.skill.yaml +92 -0
- package/skills/_template/composite_S_template.skill.yaml +198 -0
- package/skills/_template/vendor_override_template.yaml +72 -0
- package/skills/atomic/android_bitmap_memory_per_process.skill.yaml +203 -0
- package/skills/atomic/android_dvfs_counter_stats.skill.yaml +60 -0
- package/skills/atomic/android_gpu_work_period_track.skill.yaml +55 -0
- package/skills/atomic/android_heap_graph_summary.skill.yaml +232 -0
- package/skills/atomic/android_job_scheduler_events.skill.yaml +58 -0
- package/skills/atomic/android_kernel_wakelock_summary.skill.yaml +57 -0
- package/skills/atomic/anr_context_in_range.skill.yaml +99 -0
- package/skills/atomic/anr_main_thread_blocking.skill.yaml +513 -0
- package/skills/atomic/app_frame_production.skill.yaml +147 -0
- package/skills/atomic/app_lifecycle_in_range.skill.yaml +142 -0
- package/skills/atomic/app_process_starts_summary.skill.yaml +75 -0
- package/skills/atomic/battery_charge_timeline.skill.yaml +72 -0
- package/skills/atomic/battery_doze_state_timeline.skill.yaml +83 -0
- package/skills/atomic/binder_blocking_in_range.skill.yaml +99 -0
- package/skills/atomic/binder_in_range.skill.yaml +86 -0
- package/skills/atomic/binder_root_cause.skill.yaml +191 -0
- package/skills/atomic/binder_storm_detection.skill.yaml +394 -0
- package/skills/atomic/blocking_chain_analysis.skill.yaml +316 -0
- package/skills/atomic/buffer_transaction_lifecycle.skill.yaml +256 -0
- package/skills/atomic/cache_miss_impact.skill.yaml +115 -0
- package/skills/atomic/chrome_scroll_jank_frame_timeline.skill.yaml +337 -0
- package/skills/atomic/compose_recomposition_hotspot.skill.yaml +403 -0
- package/skills/atomic/consumer_jank_detection.skill.yaml +556 -0
- package/skills/atomic/cpu_cluster_load_in_range.skill.yaml +138 -0
- package/skills/atomic/cpu_cluster_mapping_view.skill.yaml +47 -0
- package/skills/atomic/cpu_freq_timeline.skill.yaml +143 -0
- package/skills/atomic/cpu_idle_analysis.skill.yaml +101 -0
- package/skills/atomic/cpu_idle_state_residency.skill.yaml +54 -0
- package/skills/atomic/cpu_load_in_range.skill.yaml +145 -0
- package/skills/atomic/cpu_process_utilization_period.skill.yaml +51 -0
- package/skills/atomic/cpu_slice_analysis.skill.yaml +118 -0
- package/skills/atomic/cpu_thread_utilization_period.skill.yaml +68 -0
- package/skills/atomic/cpu_throttling_in_range.skill.yaml +131 -0
- package/skills/atomic/cpu_time_per_frame.skill.yaml +59 -0
- package/skills/atomic/cpu_topology_detection.skill.yaml +233 -0
- package/skills/atomic/cpu_topology_view.skill.yaml +272 -0
- package/skills/atomic/cpu_utilization_per_period.skill.yaml +55 -0
- package/skills/atomic/device_state_snapshot.skill.yaml +171 -0
- package/skills/atomic/device_state_timeline.skill.yaml +308 -0
- package/skills/atomic/fence_wait_decomposition.skill.yaml +314 -0
- package/skills/atomic/fpsgo_analysis.skill.yaml +80 -0
- package/skills/atomic/frame_blocking_calls.skill.yaml +215 -0
- package/skills/atomic/frame_overrun_summary.skill.yaml +68 -0
- package/skills/atomic/frame_pipeline_variance.skill.yaml +124 -0
- package/skills/atomic/frame_production_gap.skill.yaml +337 -0
- package/skills/atomic/frame_ui_time_breakdown.skill.yaml +58 -0
- package/skills/atomic/futex_wait_distribution.skill.yaml +117 -0
- package/skills/atomic/game_fps_analysis.skill.yaml +385 -0
- package/skills/atomic/game_main_loop_jank.skill.yaml +309 -0
- package/skills/atomic/gc_events_in_range.skill.yaml +118 -0
- package/skills/atomic/gl_standalone_swap_jank.skill.yaml +259 -0
- package/skills/atomic/gpu_freq_in_range.skill.yaml +99 -0
- package/skills/atomic/gpu_frequency_analysis.skill.yaml +94 -0
- package/skills/atomic/gpu_metrics.skill.yaml +411 -0
- package/skills/atomic/gpu_power_state_analysis.skill.yaml +117 -0
- package/skills/atomic/gpu_render_in_range.skill.yaml +104 -0
- package/skills/atomic/input_events_in_range.skill.yaml +130 -0
- package/skills/atomic/input_to_frame_latency.skill.yaml +436 -0
- package/skills/atomic/linux_irq_summary.skill.yaml +66 -0
- package/skills/atomic/linux_perf_counter_hotspots.skill.yaml +108 -0
- package/skills/atomic/linux_process_rss_swap_timeline.skill.yaml +96 -0
- package/skills/atomic/linux_runqueue_depth_timeline.skill.yaml +132 -0
- package/skills/atomic/linux_sched_latency_distribution.skill.yaml +130 -0
- package/skills/atomic/lmk_kill_attribution.skill.yaml +72 -0
- package/skills/atomic/lock_contention_in_range.skill.yaml +402 -0
- package/skills/atomic/logcat_analysis.skill.yaml +85 -0
- package/skills/atomic/main_thread_file_io_in_range.skill.yaml +116 -0
- package/skills/atomic/main_thread_sched_latency_in_range.skill.yaml +91 -0
- package/skills/atomic/main_thread_slices_in_range.skill.yaml +129 -0
- package/skills/atomic/main_thread_states_in_range.skill.yaml +105 -0
- package/skills/atomic/mali_gpu_power_state.skill.yaml +54 -0
- package/skills/atomic/media_codec_activity.skill.yaml +236 -0
- package/skills/atomic/memory_growth_detector.skill.yaml +146 -0
- package/skills/atomic/memory_pressure_in_range.skill.yaml +382 -0
- package/skills/atomic/memory_rss_high_watermark.skill.yaml +62 -0
- package/skills/atomic/native_heap_breakdown.skill.yaml +80 -0
- package/skills/atomic/oom_adjuster_score_timeline.skill.yaml +77 -0
- package/skills/atomic/page_fault_in_range.skill.yaml +113 -0
- package/skills/atomic/pipeline_4feature_scoring.skill.yaml +299 -0
- package/skills/atomic/pipeline_key_slices_overlay.skill.yaml +108 -0
- package/skills/atomic/present_fence_timing.skill.yaml +156 -0
- package/skills/atomic/process_identity_resolver.skill.yaml +503 -0
- package/skills/atomic/render_pipeline_latency.skill.yaml +120 -0
- package/skills/atomic/render_thread_slices.skill.yaml +107 -0
- package/skills/atomic/rendering_pipeline_detection.skill.yaml +770 -0
- package/skills/atomic/rn_bridge_to_frame_jank.skill.yaml +209 -0
- package/skills/atomic/rn_fabric_render_jank.skill.yaml +213 -0
- package/skills/atomic/sched_latency_in_range.skill.yaml +94 -0
- package/skills/atomic/scheduling_analysis.skill.yaml +103 -0
- package/skills/atomic/scroll_response_latency.skill.yaml +131 -0
- package/skills/atomic/sf_composition_in_range.skill.yaml +99 -0
- package/skills/atomic/sf_frame_consumption.skill.yaml +133 -0
- package/skills/atomic/sf_layer_count_in_range.skill.yaml +155 -0
- package/skills/atomic/startup_binder_in_range.skill.yaml +106 -0
- package/skills/atomic/startup_binder_pool_analysis.skill.yaml +115 -0
- package/skills/atomic/startup_breakdown_in_range.skill.yaml +115 -0
- package/skills/atomic/startup_class_loading_in_range.skill.yaml +93 -0
- package/skills/atomic/startup_cpu_placement_timeline.skill.yaml +135 -0
- package/skills/atomic/startup_critical_tasks.skill.yaml +247 -0
- package/skills/atomic/startup_events_in_range.skill.yaml +251 -0
- package/skills/atomic/startup_freq_rampup.skill.yaml +110 -0
- package/skills/atomic/startup_gc_in_range.skill.yaml +97 -0
- package/skills/atomic/startup_hot_slice_states.skill.yaml +116 -0
- package/skills/atomic/startup_jit_analysis.skill.yaml +158 -0
- package/skills/atomic/startup_main_thread_binder_blocking_in_range.skill.yaml +114 -0
- package/skills/atomic/startup_main_thread_file_io_in_range.skill.yaml +117 -0
- package/skills/atomic/startup_main_thread_slices_in_range.skill.yaml +138 -0
- package/skills/atomic/startup_main_thread_states_in_range.skill.yaml +100 -0
- package/skills/atomic/startup_main_thread_sync_binder_in_range.skill.yaml +103 -0
- package/skills/atomic/startup_sched_latency_in_range.skill.yaml +93 -0
- package/skills/atomic/startup_slow_reasons.skill.yaml +625 -0
- package/skills/atomic/startup_thread_blocking_graph.skill.yaml +181 -0
- package/skills/atomic/system_load_in_range.skill.yaml +95 -0
- package/skills/atomic/task_migration_in_range.skill.yaml +115 -0
- package/skills/atomic/textureview_producer_frame_timing.skill.yaml +302 -0
- package/skills/atomic/thermal_predictor.skill.yaml +182 -0
- package/skills/atomic/thread_affinity_violation.skill.yaml +139 -0
- package/skills/atomic/touch_to_display_latency.skill.yaml +130 -0
- package/skills/atomic/util_tracking_analysis.skill.yaml +89 -0
- package/skills/atomic/vrr_detection.skill.yaml +301 -0
- package/skills/atomic/vsync_alignment_in_range.skill.yaml +116 -0
- package/skills/atomic/vsync_config.skill.yaml +147 -0
- package/skills/atomic/vsync_period_detection.skill.yaml +178 -0
- package/skills/atomic/vsync_phase_alignment.skill.yaml +255 -0
- package/skills/atomic/wakelock_tracking.skill.yaml +276 -0
- package/skills/atomic/wattson_app_startup_power.skill.yaml +66 -0
- package/skills/atomic/wattson_rails_power_breakdown.skill.yaml +70 -0
- package/skills/atomic/wattson_thread_power_attribution.skill.yaml +74 -0
- package/skills/atomic/webview_v8_analysis.skill.yaml +297 -0
- package/skills/comparison/multi_trace_result_comparison.skill.yaml +60 -0
- package/skills/composite/anr_analysis.skill.yaml +889 -0
- package/skills/composite/anr_detail.skill.yaml +796 -0
- package/skills/composite/battery_drain_attribution.skill.yaml +134 -0
- package/skills/composite/binder_analysis.skill.yaml +742 -0
- package/skills/composite/binder_detail.skill.yaml +388 -0
- package/skills/composite/block_io_analysis.skill.yaml +559 -0
- package/skills/composite/click_response_analysis.skill.yaml +915 -0
- package/skills/composite/click_response_detail.skill.yaml +800 -0
- package/skills/composite/cpu_analysis.skill.yaml +960 -0
- package/skills/composite/dmabuf_analysis.skill.yaml +622 -0
- package/skills/composite/flutter_scrolling_analysis.skill.yaml +443 -0
- package/skills/composite/gc_analysis.skill.yaml +744 -0
- package/skills/composite/global_trace_sanity_check.skill.yaml +716 -0
- package/skills/composite/gpu_analysis.skill.yaml +700 -0
- package/skills/composite/io_pressure.skill.yaml +654 -0
- package/skills/composite/irq_analysis.skill.yaml +696 -0
- package/skills/composite/jank_frame_detail.skill.yaml +2065 -0
- package/skills/composite/lmk_analysis.skill.yaml +626 -0
- package/skills/composite/lock_binder_wait.skill.yaml +95 -0
- package/skills/composite/lock_contention_analysis.skill.yaml +878 -0
- package/skills/composite/memory_analysis.skill.yaml +718 -0
- package/skills/composite/navigation_analysis.skill.yaml +901 -0
- package/skills/composite/network_analysis.skill.yaml +760 -0
- package/skills/composite/power_consumption_overview.skill.yaml +143 -0
- package/skills/composite/scene_reconstruction.skill.yaml +2788 -0
- package/skills/composite/scroll_session_analysis.skill.yaml +496 -0
- package/skills/composite/scrolling_analysis.skill.yaml +3295 -0
- package/skills/composite/startup_analysis.skill.yaml +1172 -0
- package/skills/composite/startup_detail.skill.yaml +1339 -0
- package/skills/composite/state_timeline.skill.yaml +1021 -0
- package/skills/composite/surfaceflinger_analysis.skill.yaml +808 -0
- package/skills/composite/suspend_wakeup_analysis.skill.yaml +698 -0
- package/skills/composite/thermal_throttling.skill.yaml +964 -0
- package/skills/composite/thermal_throttling_chain.skill.yaml +147 -0
- package/skills/composite/webview_drawfunctor_jank_chain.skill.yaml +343 -0
- package/skills/config/conclusion_scene_templates.base.yaml +181 -0
- package/skills/config/conclusion_scene_templates.yaml +17 -0
- package/skills/deep/callstack_analysis.skill.yaml +436 -0
- package/skills/deep/cpu_profiling.skill.yaml +617 -0
- package/skills/docs/scrolling.sop.md +312 -0
- package/skills/docs/startup.sop.md +382 -0
- package/skills/docs/upstream-perfetto-ai-skill-translation.sop.md +50 -0
- package/skills/fragments/target_threads.sql +34 -0
- package/skills/fragments/thread_states_quadrant.sql +26 -0
- package/skills/fragments/vsync_config.sql +32 -0
- package/skills/modules/app/launcher_module.skill.yaml +473 -0
- package/skills/modules/app/systemui_module.skill.yaml +565 -0
- package/skills/modules/app/third_party_module.skill.yaml +275 -0
- package/skills/modules/framework/ams_module.skill.yaml +239 -0
- package/skills/modules/framework/art_module.skill.yaml +266 -0
- package/skills/modules/framework/choreographer_module.skill.yaml +419 -0
- package/skills/modules/framework/input_module.skill.yaml +219 -0
- package/skills/modules/framework/surfaceflinger_module.skill.yaml +343 -0
- package/skills/modules/framework/wms_module.skill.yaml +356 -0
- package/skills/modules/hardware/cpu_module.skill.yaml +300 -0
- package/skills/modules/hardware/gpu_module.skill.yaml +229 -0
- package/skills/modules/hardware/memory_module.skill.yaml +443 -0
- package/skills/modules/hardware/power_module.skill.yaml +377 -0
- package/skills/modules/hardware/thermal_module.skill.yaml +410 -0
- package/skills/modules/kernel/binder_module.skill.yaml +223 -0
- package/skills/modules/kernel/filesystem_module.skill.yaml +423 -0
- package/skills/modules/kernel/lock_contention_module.skill.yaml +424 -0
- package/skills/modules/kernel/scheduler_module.skill.yaml +247 -0
- package/skills/pipelines/_base.skill.yaml +103 -0
- package/skills/pipelines/android_pip_freeform.skill.yaml +224 -0
- package/skills/pipelines/android_view_mixed.skill.yaml +305 -0
- package/skills/pipelines/android_view_multi_window.skill.yaml +271 -0
- package/skills/pipelines/android_view_software.skill.yaml +172 -0
- package/skills/pipelines/android_view_standard_blast.skill.yaml +357 -0
- package/skills/pipelines/android_view_standard_legacy.skill.yaml +233 -0
- package/skills/pipelines/angle_gles_vulkan.skill.yaml +178 -0
- package/skills/pipelines/camera_pipeline.skill.yaml +215 -0
- package/skills/pipelines/chrome_browser_viz.skill.yaml +288 -0
- package/skills/pipelines/compose_standard.skill.yaml +250 -0
- package/skills/pipelines/flutter_surfaceview_impeller.skill.yaml +233 -0
- package/skills/pipelines/flutter_surfaceview_skia.skill.yaml +194 -0
- package/skills/pipelines/flutter_textureview.skill.yaml +219 -0
- package/skills/pipelines/game_engine.skill.yaml +311 -0
- package/skills/pipelines/hardware_buffer_renderer.skill.yaml +205 -0
- package/skills/pipelines/imagereader_pipeline.skill.yaml +237 -0
- package/skills/pipelines/index.yaml +122 -0
- package/skills/pipelines/opengl_es.skill.yaml +185 -0
- package/skills/pipelines/rn_new_arch.skill.yaml +126 -0
- package/skills/pipelines/rn_old_arch.skill.yaml +137 -0
- package/skills/pipelines/rn_skia.skill.yaml +115 -0
- package/skills/pipelines/software_compositing.skill.yaml +203 -0
- package/skills/pipelines/surface_control_api.skill.yaml +208 -0
- package/skills/pipelines/surfaceview_blast.skill.yaml +210 -0
- package/skills/pipelines/textureview_standard.skill.yaml +301 -0
- package/skills/pipelines/variable_refresh_rate.skill.yaml +264 -0
- package/skills/pipelines/video_overlay_hwc.skill.yaml +193 -0
- package/skills/pipelines/vulkan_native.skill.yaml +215 -0
- package/skills/pipelines/webview_gl_functor.skill.yaml +232 -0
- package/skills/pipelines/webview_surface_control.skill.yaml +187 -0
- package/skills/pipelines/webview_surfaceview_wrapper.skill.yaml +196 -0
- package/skills/pipelines/webview_textureview_custom.skill.yaml +201 -0
- package/skills/vendors/honor/startup.override.yaml +117 -0
- package/skills/vendors/mtk/startup.override.yaml +133 -0
- package/skills/vendors/oppo/startup.override.yaml +188 -0
- package/skills/vendors/pixel/startup.override.yaml +163 -0
- package/skills/vendors/qualcomm/startup.override.yaml +175 -0
- package/skills/vendors/samsung/startup.override.yaml +161 -0
- package/skills/vendors/vivo/startup.override.yaml +144 -0
- package/skills/vendors/xiaomi/startup.override.yaml +120 -0
- package/sql/smartperfetto/PACKAGE.json +24 -0
- package/sql/smartperfetto/binder/victim_to_server.sql +36 -0
- package/sql/smartperfetto/scrolling/jank_frames.sql +55 -0
- package/strategies/anr.strategy.md +200 -0
- package/strategies/arch-compose.template.md +10 -0
- package/strategies/arch-flutter.template.md +17 -0
- package/strategies/arch-standard.template.md +31 -0
- package/strategies/arch-webview.template.md +9 -0
- package/strategies/comparison-conclusion.template.md +36 -0
- package/strategies/comparison-methodology.template.md +41 -0
- package/strategies/comparison-result-methodology.template.md +35 -0
- package/strategies/game.strategy.md +121 -0
- package/strategies/general.strategy.md +48 -0
- package/strategies/interaction.strategy.md +149 -0
- package/strategies/knowledge-binder-ipc.template.md +59 -0
- package/strategies/knowledge-cpu-scheduler.template.md +67 -0
- package/strategies/knowledge-data-sources.template.md +738 -0
- package/strategies/knowledge-gc-dynamics.template.md +65 -0
- package/strategies/knowledge-harmonyos-rendering.template.md +54 -0
- package/strategies/knowledge-harmonyos-tools.template.md +73 -0
- package/strategies/knowledge-lock-contention.template.md +61 -0
- package/strategies/knowledge-pipeline-anchors.template.md +136 -0
- package/strategies/knowledge-pipeline-fences.template.md +158 -0
- package/strategies/knowledge-rendering-pipeline.template.md +170 -0
- package/strategies/knowledge-startup-root-causes.template.md +951 -0
- package/strategies/knowledge-thermal-throttling.template.md +53 -0
- package/strategies/linux.strategy.md +86 -0
- package/strategies/media.strategy.md +75 -0
- package/strategies/memory.strategy.md +94 -0
- package/strategies/multi-trace-result-comparison.strategy.md +96 -0
- package/strategies/network.strategy.md +80 -0
- package/strategies/overview.strategy.md +139 -0
- package/strategies/phase_hint_templates/misdiagnosis_vsync_vrr.template.yaml +37 -0
- package/strategies/pipeline.strategy.md +208 -0
- package/strategies/power.strategy.md +165 -0
- package/strategies/prompt-complexity-classifier.template.md +26 -0
- package/strategies/prompt-language-en.template.md +9 -0
- package/strategies/prompt-language-zh.template.md +8 -0
- package/strategies/prompt-methodology.template.md +183 -0
- package/strategies/prompt-output-format.template.md +115 -0
- package/strategies/prompt-quick.template.md +44 -0
- package/strategies/prompt-role.template.md +13 -0
- package/strategies/runtime-correctness.strategy.md +73 -0
- package/strategies/scroll-response.strategy.md +236 -0
- package/strategies/scrolling.strategy.md +467 -0
- package/strategies/selection-area.template.md +46 -0
- package/strategies/selection-slice.template.md +126 -0
- package/strategies/startup.strategy.md +694 -0
- package/strategies/teaching.strategy.md +176 -0
- package/strategies/touch-tracking.strategy.md +213 -0
|
@@ -0,0 +1,3295 @@
|
|
|
1
|
+
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
# Copyright (C) 2024-2026 Gracker (Chris)
|
|
3
|
+
# This file is part of SmartPerfetto. See LICENSE for details.
|
|
4
|
+
|
|
5
|
+
name: scrolling_analysis
|
|
6
|
+
version: "2.0" # v2.0: refactored to use shared _cpu_topology VIEW
|
|
7
|
+
type: composite
|
|
8
|
+
tier: S
|
|
9
|
+
|
|
10
|
+
meta:
|
|
11
|
+
display_name: "滑动性能分析"
|
|
12
|
+
description: "基于 Perfetto FrameTimeline 的滑动分析,分层展示:概览 → 区间 → 帧详情"
|
|
13
|
+
icon: "swipe"
|
|
14
|
+
tags: [scrolling, jank, fps, frames, layered]
|
|
15
|
+
|
|
16
|
+
triggers:
|
|
17
|
+
keywords:
|
|
18
|
+
zh: [滑动, 卡顿, 帧率, 掉帧, 丢帧, FPS, 流畅度, 列表滑动, fling]
|
|
19
|
+
en: [scroll, jank, fps, frame, fling, stutter, smoothness, list]
|
|
20
|
+
patterns:
|
|
21
|
+
- ".*滑动.*卡.*"
|
|
22
|
+
- ".*scroll.*jank.*"
|
|
23
|
+
- ".*帧率.*"
|
|
24
|
+
|
|
25
|
+
prerequisites:
|
|
26
|
+
modules:
|
|
27
|
+
- android.frames.timeline
|
|
28
|
+
- android.binder
|
|
29
|
+
- android.garbage_collection
|
|
30
|
+
- android.monitor_contention
|
|
31
|
+
|
|
32
|
+
inputs:
|
|
33
|
+
- name: package
|
|
34
|
+
type: string
|
|
35
|
+
required: false
|
|
36
|
+
description: "应用包名(可选,不填则分析所有应用)"
|
|
37
|
+
- name: start_ts
|
|
38
|
+
type: timestamp
|
|
39
|
+
required: false
|
|
40
|
+
description: "分析起始时间戳(纳秒,可选)"
|
|
41
|
+
- name: end_ts
|
|
42
|
+
type: timestamp
|
|
43
|
+
required: false
|
|
44
|
+
description: "分析结束时间戳(纳秒,可选)"
|
|
45
|
+
- name: enable_frame_details
|
|
46
|
+
type: boolean
|
|
47
|
+
required: false
|
|
48
|
+
description: "是否执行逐帧详情分析(L4,默认不执行)"
|
|
49
|
+
- name: max_frames_per_session
|
|
50
|
+
type: number
|
|
51
|
+
required: false
|
|
52
|
+
description: "每个滑动区间最多返回的掉帧帧数(默认 200,配合 batch_frame_root_cause 批量分类)"
|
|
53
|
+
- name: enable_expert_probes
|
|
54
|
+
type: boolean
|
|
55
|
+
required: false
|
|
56
|
+
default: true
|
|
57
|
+
description: "是否启用专家探针(帧方差等)"
|
|
58
|
+
- name: frame_variance_probe_min_janky_frames
|
|
59
|
+
type: number
|
|
60
|
+
required: false
|
|
61
|
+
default: 5
|
|
62
|
+
description: "触发帧方差探针的最小掉帧数"
|
|
63
|
+
- name: frame_variance_transition_threshold_ms
|
|
64
|
+
type: number
|
|
65
|
+
required: false
|
|
66
|
+
default: 8
|
|
67
|
+
description: "帧间高抖动阈值(ms)"
|
|
68
|
+
|
|
69
|
+
identity:
|
|
70
|
+
policy: verify_if_present
|
|
71
|
+
scope: process
|
|
72
|
+
aliases: [package, process_name]
|
|
73
|
+
rewriteTo: recommended_process_name_param
|
|
74
|
+
|
|
75
|
+
steps:
|
|
76
|
+
# ==========================================================================
|
|
77
|
+
# Step 0: 初始化共享 CPU 拓扑视图
|
|
78
|
+
# ==========================================================================
|
|
79
|
+
- id: init_cpu_topology
|
|
80
|
+
type: skill
|
|
81
|
+
name: "初始化 CPU 拓扑"
|
|
82
|
+
skill: cpu_topology_view
|
|
83
|
+
display:
|
|
84
|
+
level: hidden
|
|
85
|
+
optional: true
|
|
86
|
+
|
|
87
|
+
# ==========================================================================
|
|
88
|
+
# L0: 数据源检测 - FrameTimeline 是否可用
|
|
89
|
+
# ==========================================================================
|
|
90
|
+
- id: frame_timeline_check
|
|
91
|
+
type: atomic
|
|
92
|
+
name: "FrameTimeline 数据源检测"
|
|
93
|
+
display: false
|
|
94
|
+
sql: |
|
|
95
|
+
SELECT
|
|
96
|
+
CASE
|
|
97
|
+
WHEN EXISTS (
|
|
98
|
+
SELECT 1 FROM sqlite_master
|
|
99
|
+
WHERE type = 'table' AND name = 'actual_frame_timeline_slice'
|
|
100
|
+
) THEN 1
|
|
101
|
+
ELSE 0
|
|
102
|
+
END as has_frame_timeline
|
|
103
|
+
save_as: frame_timeline
|
|
104
|
+
|
|
105
|
+
# ==========================================================================
|
|
106
|
+
# L1: 环境配置检测 - Vsync/刷新率
|
|
107
|
+
# ==========================================================================
|
|
108
|
+
- id: vsync_config
|
|
109
|
+
type: atomic
|
|
110
|
+
name: "Vsync 配置"
|
|
111
|
+
display:
|
|
112
|
+
level: summary
|
|
113
|
+
layer: overview
|
|
114
|
+
title: "显示配置"
|
|
115
|
+
columns:
|
|
116
|
+
- name: refresh_rate_hz
|
|
117
|
+
label: "刷新率"
|
|
118
|
+
type: number
|
|
119
|
+
format: compact
|
|
120
|
+
- name: vsync_period_ms
|
|
121
|
+
label: "VSync 周期"
|
|
122
|
+
type: duration
|
|
123
|
+
format: duration_ms
|
|
124
|
+
unit: ms
|
|
125
|
+
- name: vsync_source
|
|
126
|
+
label: "来源"
|
|
127
|
+
type: string
|
|
128
|
+
- name: total_frames
|
|
129
|
+
label: "总帧数"
|
|
130
|
+
type: number
|
|
131
|
+
format: compact
|
|
132
|
+
sql: |
|
|
133
|
+
WITH
|
|
134
|
+
-- VSync 周期:VSYNC-sf 中位数 + 标准刷新率吸附(30/60/90/120/144/165Hz)
|
|
135
|
+
sf_vsync_intervals AS (
|
|
136
|
+
SELECT c.ts - LAG(c.ts) OVER (ORDER BY c.ts) AS interval_ns
|
|
137
|
+
FROM counter c
|
|
138
|
+
JOIN counter_track t ON c.track_id = t.id
|
|
139
|
+
WHERE t.name = 'VSYNC-sf'
|
|
140
|
+
AND (${start_ts} IS NULL OR c.ts >= ${start_ts})
|
|
141
|
+
AND (${end_ts} IS NULL OR c.ts < ${end_ts})
|
|
142
|
+
),
|
|
143
|
+
vsync_median AS (
|
|
144
|
+
SELECT
|
|
145
|
+
CASE
|
|
146
|
+
WHEN raw_period BETWEEN 5500000 AND 6500000 THEN 6060606
|
|
147
|
+
WHEN raw_period BETWEEN 6500001 AND 7500000 THEN 6944444
|
|
148
|
+
WHEN raw_period BETWEEN 7500001 AND 9500000 THEN 8333333
|
|
149
|
+
WHEN raw_period BETWEEN 9500001 AND 12500000 THEN 11111111
|
|
150
|
+
WHEN raw_period BETWEEN 12500001 AND 20000000 THEN 16666667
|
|
151
|
+
WHEN raw_period BETWEEN 20000001 AND 35000000 THEN 33333333
|
|
152
|
+
ELSE raw_period
|
|
153
|
+
END AS vsync_period_ns,
|
|
154
|
+
source
|
|
155
|
+
FROM (
|
|
156
|
+
SELECT
|
|
157
|
+
COALESCE(
|
|
158
|
+
(SELECT CAST(PERCENTILE(interval_ns, 0.5) AS INTEGER)
|
|
159
|
+
FROM sf_vsync_intervals
|
|
160
|
+
WHERE interval_ns > 5500000 AND interval_ns < 50000000),
|
|
161
|
+
(SELECT CAST(PERCENTILE(dur, 0.5) AS INTEGER)
|
|
162
|
+
FROM expected_frame_timeline_slice
|
|
163
|
+
WHERE dur > 5000000 AND dur < 50000000
|
|
164
|
+
AND (${start_ts} IS NULL OR ts >= ${start_ts})
|
|
165
|
+
AND (${end_ts} IS NULL OR ts < ${end_ts})),
|
|
166
|
+
16666667
|
|
167
|
+
) AS raw_period,
|
|
168
|
+
CASE
|
|
169
|
+
WHEN (SELECT COUNT(*) FROM sf_vsync_intervals WHERE interval_ns > 5500000 AND interval_ns < 50000000) > 0 THEN 'sf_vsync_counter'
|
|
170
|
+
WHEN (SELECT COUNT(*) FROM expected_frame_timeline_slice WHERE dur > 5000000 AND dur < 50000000) > 0 THEN 'expected_frame'
|
|
171
|
+
ELSE 'default'
|
|
172
|
+
END AS source
|
|
173
|
+
)
|
|
174
|
+
),
|
|
175
|
+
frame_count AS (
|
|
176
|
+
SELECT COUNT(*) as total_frames
|
|
177
|
+
FROM actual_frame_timeline_slice a
|
|
178
|
+
LEFT JOIN process p ON a.upid = p.upid
|
|
179
|
+
WHERE (p.name GLOB '${package}*' OR '${package}' = '')
|
|
180
|
+
AND p.name NOT LIKE '/system/%'
|
|
181
|
+
AND (${start_ts} IS NULL OR a.ts >= ${start_ts})
|
|
182
|
+
AND (${end_ts} IS NULL OR a.ts < ${end_ts})
|
|
183
|
+
AND COALESCE(a.display_frame_token, a.surface_frame_token) IS NOT NULL
|
|
184
|
+
)
|
|
185
|
+
SELECT
|
|
186
|
+
vsync_period_ns,
|
|
187
|
+
CAST(ROUND(1e9 / vsync_period_ns) AS INTEGER) as refresh_rate_hz,
|
|
188
|
+
ROUND(vsync_period_ns / 1e6, 2) as vsync_period_ms,
|
|
189
|
+
source as vsync_source,
|
|
190
|
+
(SELECT total_frames FROM frame_count) as total_frames,
|
|
191
|
+
CASE WHEN (SELECT total_frames FROM frame_count) > 0 THEN 1 ELSE 0 END as has_data
|
|
192
|
+
FROM vsync_median
|
|
193
|
+
save_as: environment
|
|
194
|
+
condition: "frame_timeline.data[0]?.has_frame_timeline === 1"
|
|
195
|
+
|
|
196
|
+
# ==========================================================================
|
|
197
|
+
# L1: 帧性能汇总 (双信号混合检测掉帧)
|
|
198
|
+
# ==========================================================================
|
|
199
|
+
# 核心原理:
|
|
200
|
+
# - 非 BS 帧:present_type IN ('Late Present', 'Dropped Frame') 为权威信号
|
|
201
|
+
# - BS 帧:present_type 始终为 Late Present,需用 present_ts 间隔二次验证
|
|
202
|
+
# 间隔 > 1.5x vsync = 真实掉帧;否则 = 管线背压(非感知掉帧)
|
|
203
|
+
# - vsync_missed 用 present_ts 间隔估算严重度(辅助信号)
|
|
204
|
+
# - jank_type 用于判断责任归属(App vs SF)
|
|
205
|
+
- id: performance_summary
|
|
206
|
+
type: atomic
|
|
207
|
+
name: "帧性能汇总"
|
|
208
|
+
synthesize:
|
|
209
|
+
role: overview
|
|
210
|
+
fields:
|
|
211
|
+
- key: total_frames
|
|
212
|
+
label: 总帧数
|
|
213
|
+
- key: perceived_jank_frames
|
|
214
|
+
label: 感知掉帧
|
|
215
|
+
format: "{{value}} ({{jank_rate}}%)"
|
|
216
|
+
- key: buffer_stuffing_frames
|
|
217
|
+
label: Buffer Stuffing
|
|
218
|
+
format: "{{value}} ({{buffer_stuffing_rate}}%)"
|
|
219
|
+
- key: avg_fps
|
|
220
|
+
label: 平均 FPS
|
|
221
|
+
- key: app_jank
|
|
222
|
+
label: App 侧掉帧
|
|
223
|
+
- key: sf_jank
|
|
224
|
+
label: SF 侧掉帧
|
|
225
|
+
insights:
|
|
226
|
+
- condition: "jank_rate > 10"
|
|
227
|
+
template: "感知掉帧率 {{jank_rate}}% 较高,需要优化"
|
|
228
|
+
- condition: "buffer_stuffing_rate > 50"
|
|
229
|
+
template: "Buffer Stuffing 占比 {{buffer_stuffing_rate}}%,管线背压显著(非 App 问题)"
|
|
230
|
+
- condition: "app_jank > sf_jank"
|
|
231
|
+
template: "App 侧掉帧 ({{app_jank}}) 多于 SF 侧 ({{sf_jank}})"
|
|
232
|
+
display:
|
|
233
|
+
level: summary
|
|
234
|
+
layer: overview
|
|
235
|
+
title: "滑动性能概览"
|
|
236
|
+
columns:
|
|
237
|
+
- name: total_frames
|
|
238
|
+
label: "总帧数"
|
|
239
|
+
type: number
|
|
240
|
+
format: compact
|
|
241
|
+
- name: perceived_jank_frames
|
|
242
|
+
label: "感知掉帧"
|
|
243
|
+
type: number
|
|
244
|
+
format: compact
|
|
245
|
+
- name: jank_rate
|
|
246
|
+
label: "感知掉帧率"
|
|
247
|
+
type: percentage
|
|
248
|
+
format: percentage
|
|
249
|
+
- name: buffer_stuffing_frames
|
|
250
|
+
label: "Buffer Stuffing"
|
|
251
|
+
type: number
|
|
252
|
+
format: compact
|
|
253
|
+
- name: buffer_stuffing_rate
|
|
254
|
+
label: "BS 占比"
|
|
255
|
+
type: percentage
|
|
256
|
+
format: percentage
|
|
257
|
+
hidden: true
|
|
258
|
+
- name: app_janky_frames
|
|
259
|
+
label: "App 侧掉帧"
|
|
260
|
+
type: number
|
|
261
|
+
format: compact
|
|
262
|
+
- name: sf_jank_count
|
|
263
|
+
label: "SF 侧掉帧"
|
|
264
|
+
type: number
|
|
265
|
+
format: compact
|
|
266
|
+
- name: actual_fps
|
|
267
|
+
label: "实际 FPS"
|
|
268
|
+
type: number
|
|
269
|
+
- name: refresh_rate
|
|
270
|
+
label: "刷新率"
|
|
271
|
+
type: number
|
|
272
|
+
- name: avg_frame_dur
|
|
273
|
+
label: "平均呈现间隔"
|
|
274
|
+
type: duration
|
|
275
|
+
format: duration_ms
|
|
276
|
+
unit: ns
|
|
277
|
+
- name: p95_frame_dur
|
|
278
|
+
label: "P95 呈现间隔"
|
|
279
|
+
type: duration
|
|
280
|
+
format: duration_ms
|
|
281
|
+
unit: ns
|
|
282
|
+
- name: rating
|
|
283
|
+
label: "评级"
|
|
284
|
+
type: string
|
|
285
|
+
sql: |
|
|
286
|
+
WITH
|
|
287
|
+
-- 获取 VSync 周期(从 VSYNC-sf 信号计算,限定在分析区间内)
|
|
288
|
+
vsync_intervals AS (
|
|
289
|
+
SELECT
|
|
290
|
+
c.ts - LAG(c.ts) OVER (ORDER BY c.ts) as interval_ns
|
|
291
|
+
FROM counter c
|
|
292
|
+
JOIN counter_track t ON c.track_id = t.id
|
|
293
|
+
WHERE t.name = 'VSYNC-sf'
|
|
294
|
+
AND (${start_ts} IS NULL OR c.ts >= ${start_ts})
|
|
295
|
+
AND (${end_ts} IS NULL OR c.ts < ${end_ts})
|
|
296
|
+
),
|
|
297
|
+
timing_config AS (
|
|
298
|
+
SELECT CASE
|
|
299
|
+
WHEN raw_ns BETWEEN 5500000 AND 6500000 THEN 6060606
|
|
300
|
+
WHEN raw_ns BETWEEN 6500001 AND 7500000 THEN 6944444
|
|
301
|
+
WHEN raw_ns BETWEEN 7500001 AND 9500000 THEN 8333333
|
|
302
|
+
WHEN raw_ns BETWEEN 9500001 AND 12500000 THEN 11111111
|
|
303
|
+
WHEN raw_ns BETWEEN 12500001 AND 20000000 THEN 16666667
|
|
304
|
+
WHEN raw_ns BETWEEN 20000001 AND 35000000 THEN 33333333
|
|
305
|
+
ELSE raw_ns
|
|
306
|
+
END AS vsync_period_ns
|
|
307
|
+
FROM (
|
|
308
|
+
SELECT CAST(COALESCE(
|
|
309
|
+
(SELECT PERCENTILE(interval_ns, 0.5)
|
|
310
|
+
FROM vsync_intervals
|
|
311
|
+
WHERE interval_ns > 5500000 AND interval_ns < 50000000),
|
|
312
|
+
16666667
|
|
313
|
+
) AS INTEGER) AS raw_ns
|
|
314
|
+
)
|
|
315
|
+
),
|
|
316
|
+
time_range AS (
|
|
317
|
+
SELECT
|
|
318
|
+
MIN(a.ts) as start_ts,
|
|
319
|
+
MAX(a.ts + a.dur) as end_ts,
|
|
320
|
+
MAX(a.ts + a.dur) - MIN(a.ts) as duration_ns
|
|
321
|
+
FROM actual_frame_timeline_slice a
|
|
322
|
+
LEFT JOIN process p ON a.upid = p.upid
|
|
323
|
+
WHERE (p.name GLOB '${package}*' OR '${package}' = '')
|
|
324
|
+
AND p.name NOT LIKE '/system/%'
|
|
325
|
+
AND (${start_ts} IS NULL OR a.ts >= ${start_ts})
|
|
326
|
+
AND (${end_ts} IS NULL OR a.ts < ${end_ts})
|
|
327
|
+
AND COALESCE(a.display_frame_token, a.surface_frame_token) IS NOT NULL
|
|
328
|
+
),
|
|
329
|
+
app_frame_intervals AS (
|
|
330
|
+
SELECT
|
|
331
|
+
a.ts + CASE WHEN a.dur > 0 THEN a.dur ELSE 0 END as present_ts,
|
|
332
|
+
LAG(a.ts + CASE WHEN a.dur > 0 THEN a.dur ELSE 0 END)
|
|
333
|
+
OVER (PARTITION BY a.layer_name ORDER BY a.ts, COALESCE(a.display_frame_token, a.surface_frame_token)) as prev_present_ts
|
|
334
|
+
FROM actual_frame_timeline_slice a
|
|
335
|
+
LEFT JOIN process p ON a.upid = p.upid
|
|
336
|
+
WHERE (p.name GLOB '${package}*' OR '${package}' = '')
|
|
337
|
+
AND p.name NOT LIKE '/system/%'
|
|
338
|
+
AND (${start_ts} IS NULL OR a.ts >= ${start_ts})
|
|
339
|
+
AND (${end_ts} IS NULL OR a.ts < ${end_ts})
|
|
340
|
+
AND COALESCE(a.display_frame_token, a.surface_frame_token) IS NOT NULL
|
|
341
|
+
),
|
|
342
|
+
valid_frame_intervals AS (
|
|
343
|
+
SELECT
|
|
344
|
+
present_ts - prev_present_ts as frame_interval_ns
|
|
345
|
+
FROM app_frame_intervals
|
|
346
|
+
WHERE prev_present_ts IS NOT NULL
|
|
347
|
+
AND present_ts > prev_present_ts
|
|
348
|
+
AND present_ts - prev_present_ts >= (SELECT vsync_period_ns FROM timing_config) * 0.5
|
|
349
|
+
AND present_ts - prev_present_ts <= (SELECT vsync_period_ns FROM timing_config) * 6
|
|
350
|
+
),
|
|
351
|
+
-- App 报告的掉帧(旧逻辑,仅供参考)
|
|
352
|
+
app_stats AS (
|
|
353
|
+
SELECT
|
|
354
|
+
COUNT(*) as total,
|
|
355
|
+
SUM(CASE WHEN jank_type != 'None' THEN 1 ELSE 0 END) as app_janky_frames,
|
|
356
|
+
COALESCE(
|
|
357
|
+
(SELECT CAST(ROUND(AVG(frame_interval_ns)) AS INTEGER) FROM valid_frame_intervals),
|
|
358
|
+
CAST(ROUND(AVG(CASE WHEN dur > 0 THEN dur ELSE NULL END)) AS INTEGER),
|
|
359
|
+
0
|
|
360
|
+
) as avg_present_interval,
|
|
361
|
+
COALESCE(
|
|
362
|
+
(SELECT CAST(MAX(frame_interval_ns) AS INTEGER) FROM valid_frame_intervals),
|
|
363
|
+
MAX(CASE WHEN dur > 0 THEN dur ELSE NULL END),
|
|
364
|
+
0
|
|
365
|
+
) as max_present_interval,
|
|
366
|
+
COALESCE(
|
|
367
|
+
(SELECT CAST(ROUND(PERCENTILE(frame_interval_ns, 0.5)) AS INTEGER) FROM valid_frame_intervals),
|
|
368
|
+
CAST(ROUND(PERCENTILE(CASE WHEN dur > 0 THEN dur ELSE NULL END, 0.5)) AS INTEGER),
|
|
369
|
+
0
|
|
370
|
+
) as median_present_interval,
|
|
371
|
+
COALESCE(
|
|
372
|
+
(SELECT CAST(ROUND(PERCENTILE(frame_interval_ns, 0.95)) AS INTEGER) FROM valid_frame_intervals),
|
|
373
|
+
CAST(ROUND(PERCENTILE(CASE WHEN dur > 0 THEN dur ELSE NULL END, 0.95)) AS INTEGER),
|
|
374
|
+
0
|
|
375
|
+
) as p95_present_interval,
|
|
376
|
+
COALESCE(
|
|
377
|
+
(SELECT CAST(ROUND(PERCENTILE(frame_interval_ns, 0.99)) AS INTEGER) FROM valid_frame_intervals),
|
|
378
|
+
CAST(ROUND(PERCENTILE(CASE WHEN dur > 0 THEN dur ELSE NULL END, 0.99)) AS INTEGER),
|
|
379
|
+
0
|
|
380
|
+
) as p99_present_interval
|
|
381
|
+
FROM actual_frame_timeline_slice a
|
|
382
|
+
LEFT JOIN process p ON a.upid = p.upid
|
|
383
|
+
WHERE (p.name GLOB '${package}*' OR '${package}' = '')
|
|
384
|
+
AND p.name NOT LIKE '/system/%'
|
|
385
|
+
AND (${start_ts} IS NULL OR a.ts >= ${start_ts})
|
|
386
|
+
AND (${end_ts} IS NULL OR a.ts < ${end_ts})
|
|
387
|
+
AND COALESCE(a.display_frame_token, a.surface_frame_token) IS NOT NULL
|
|
388
|
+
),
|
|
389
|
+
-- Per-layer 帧序列:双信号混合检测基础数据
|
|
390
|
+
-- present_type = SurfaceFlinger 的消费状态(非 BS 帧的权威信号)
|
|
391
|
+
-- present_ts interval = BS 帧的二次验证信号(区分真实掉帧 vs 管线背压)
|
|
392
|
+
consumer_layer_frames AS (
|
|
393
|
+
SELECT
|
|
394
|
+
COALESCE(a.display_frame_token, a.surface_frame_token) as display_frame_token,
|
|
395
|
+
a.ts + CASE WHEN a.dur > 0 THEN a.dur ELSE 0 END as present_ts,
|
|
396
|
+
LAG(a.ts + CASE WHEN a.dur > 0 THEN a.dur ELSE 0 END)
|
|
397
|
+
OVER (PARTITION BY a.layer_name ORDER BY a.ts) as prev_present_ts,
|
|
398
|
+
COALESCE(a.jank_type, 'None') as jank_type,
|
|
399
|
+
COALESCE(a.present_type, 'Unknown Present') as present_type,
|
|
400
|
+
a.layer_name
|
|
401
|
+
FROM actual_frame_timeline_slice a
|
|
402
|
+
LEFT JOIN process p ON a.upid = p.upid
|
|
403
|
+
WHERE (p.name GLOB '${package}*' OR '${package}' = '')
|
|
404
|
+
AND p.name NOT LIKE '/system/%'
|
|
405
|
+
AND (${start_ts} IS NULL OR a.ts >= ${start_ts})
|
|
406
|
+
AND (${end_ts} IS NULL OR a.ts < ${end_ts})
|
|
407
|
+
AND COALESCE(a.display_frame_token, a.surface_frame_token) IS NOT NULL
|
|
408
|
+
),
|
|
409
|
+
-- 掉帧检测:双信号混合策略
|
|
410
|
+
-- 非 BS 帧:present_type IN ('Late Present', 'Dropped Frame') 为权威信号
|
|
411
|
+
-- BS 帧:present_type 始终为 Late Present,需用 present_ts 间隔作为二次验证
|
|
412
|
+
-- 间隔 > 1.5x vsync = 真实掉帧(被 BS 掩盖);否则 = 管线背压(非感知掉帧)
|
|
413
|
+
consumer_gap_stats AS (
|
|
414
|
+
SELECT
|
|
415
|
+
COUNT(*) as total_frames,
|
|
416
|
+
-- 感知掉帧:双信号混合检测
|
|
417
|
+
SUM(CASE
|
|
418
|
+
WHEN present_type IN ('Late Present', 'Dropped Frame')
|
|
419
|
+
AND jank_type != 'Buffer Stuffing' THEN 1
|
|
420
|
+
WHEN jank_type = 'Buffer Stuffing'
|
|
421
|
+
AND prev_present_ts IS NOT NULL
|
|
422
|
+
AND present_ts - prev_present_ts > (SELECT vsync_period_ns FROM timing_config) * 1.5
|
|
423
|
+
AND present_ts - prev_present_ts <= (SELECT vsync_period_ns FROM timing_config) * 6 THEN 1
|
|
424
|
+
ELSE 0
|
|
425
|
+
END) as consumer_jank_frames,
|
|
426
|
+
-- App 侧掉帧(BS 帧的 jank_type 不可能是 Self Jank/App Deadline Missed,无需双信号)
|
|
427
|
+
SUM(CASE WHEN present_type IN ('Late Present', 'Dropped Frame')
|
|
428
|
+
AND jank_type IN ('Self Jank', 'App Deadline Missed') THEN 1 ELSE 0 END) as app_jank_frames,
|
|
429
|
+
-- Buffer Stuffing 总帧数(管线背压,含正常 BS 和异常 BS)
|
|
430
|
+
SUM(CASE WHEN jank_type = 'Buffer Stuffing' THEN 1 ELSE 0 END) as buffer_stuffing_frames,
|
|
431
|
+
-- vsync missed:双信号门控
|
|
432
|
+
SUM(CASE
|
|
433
|
+
WHEN (
|
|
434
|
+
(present_type IN ('Late Present', 'Dropped Frame') AND jank_type != 'Buffer Stuffing')
|
|
435
|
+
OR (jank_type = 'Buffer Stuffing' AND prev_present_ts IS NOT NULL
|
|
436
|
+
AND present_ts - prev_present_ts > (SELECT vsync_period_ns FROM timing_config) * 1.5
|
|
437
|
+
AND present_ts - prev_present_ts <= (SELECT vsync_period_ns FROM timing_config) * 6)
|
|
438
|
+
) AND prev_present_ts IS NOT NULL
|
|
439
|
+
AND present_ts - prev_present_ts > (SELECT vsync_period_ns FROM timing_config) * 1.5
|
|
440
|
+
THEN MAX(CAST(ROUND((present_ts - prev_present_ts) * 1.0 / (SELECT vsync_period_ns FROM timing_config) - 1, 0) AS INTEGER), 0)
|
|
441
|
+
ELSE 0
|
|
442
|
+
END) as total_vsync_missed,
|
|
443
|
+
MAX(CASE
|
|
444
|
+
WHEN (
|
|
445
|
+
(present_type IN ('Late Present', 'Dropped Frame') AND jank_type != 'Buffer Stuffing')
|
|
446
|
+
OR (jank_type = 'Buffer Stuffing' AND prev_present_ts IS NOT NULL
|
|
447
|
+
AND present_ts - prev_present_ts > (SELECT vsync_period_ns FROM timing_config) * 1.5
|
|
448
|
+
AND present_ts - prev_present_ts <= (SELECT vsync_period_ns FROM timing_config) * 6)
|
|
449
|
+
) AND prev_present_ts IS NOT NULL
|
|
450
|
+
AND present_ts - prev_present_ts > (SELECT vsync_period_ns FROM timing_config) * 1.5
|
|
451
|
+
THEN MAX(CAST(ROUND((present_ts - prev_present_ts) * 1.0 / (SELECT vsync_period_ns FROM timing_config) - 1, 0) AS INTEGER), 0)
|
|
452
|
+
ELSE 0
|
|
453
|
+
END) as max_vsync_missed
|
|
454
|
+
FROM consumer_layer_frames
|
|
455
|
+
),
|
|
456
|
+
resolved_jank AS (
|
|
457
|
+
SELECT
|
|
458
|
+
COALESCE((SELECT consumer_jank_frames FROM consumer_gap_stats), (SELECT app_janky_frames FROM app_stats), 0) as janky_frames,
|
|
459
|
+
COALESCE((SELECT app_jank_frames FROM consumer_gap_stats), (SELECT app_janky_frames FROM app_stats), 0) as app_janky_frames,
|
|
460
|
+
-- 感知掉帧 = consumer_jank_frames(双信号已过滤掉正常 BS 帧)
|
|
461
|
+
COALESCE((SELECT consumer_jank_frames FROM consumer_gap_stats), (SELECT app_janky_frames FROM app_stats), 0) as perceived_jank_frames,
|
|
462
|
+
COALESCE((SELECT buffer_stuffing_frames FROM consumer_gap_stats), 0) as buffer_stuffing_frames,
|
|
463
|
+
COALESCE((SELECT max_vsync_missed FROM consumer_gap_stats), 0) as max_vsync_missed,
|
|
464
|
+
COALESCE((SELECT total_vsync_missed FROM consumer_gap_stats), 0) as total_vsync_missed,
|
|
465
|
+
'present_type' as fps_source
|
|
466
|
+
)
|
|
467
|
+
SELECT
|
|
468
|
+
(SELECT total FROM app_stats) as total_frames,
|
|
469
|
+
-- 感知掉帧(排除 Buffer Stuffing)— 用户真正能感知到的掉帧
|
|
470
|
+
(SELECT perceived_jank_frames FROM resolved_jank) as perceived_jank_frames,
|
|
471
|
+
-- 感知掉帧率(主指标,用于 rating)
|
|
472
|
+
ROUND(
|
|
473
|
+
100.0 * (SELECT perceived_jank_frames FROM resolved_jank) / NULLIF((SELECT total FROM app_stats), 0),
|
|
474
|
+
2
|
|
475
|
+
) as jank_rate,
|
|
476
|
+
-- Buffer Stuffing 帧数(管线背压,非 App 逻辑问题)
|
|
477
|
+
(SELECT buffer_stuffing_frames FROM resolved_jank) as buffer_stuffing_frames,
|
|
478
|
+
-- 总掉帧数(含 Buffer Stuffing,用于完整性展示)
|
|
479
|
+
(SELECT janky_frames FROM resolved_jank) as janky_frames,
|
|
480
|
+
(SELECT app_janky_frames FROM resolved_jank) as app_janky_frames,
|
|
481
|
+
MAX(
|
|
482
|
+
(SELECT perceived_jank_frames FROM resolved_jank) -
|
|
483
|
+
(SELECT app_janky_frames FROM resolved_jank),
|
|
484
|
+
0
|
|
485
|
+
) as sf_jank_count,
|
|
486
|
+
-- App 侧掉帧率
|
|
487
|
+
ROUND(
|
|
488
|
+
100.0 * (SELECT app_janky_frames FROM resolved_jank) / NULLIF((SELECT total FROM app_stats), 0),
|
|
489
|
+
2
|
|
490
|
+
) as app_jank_rate,
|
|
491
|
+
-- Buffer Stuffing 率
|
|
492
|
+
ROUND(
|
|
493
|
+
100.0 * (SELECT buffer_stuffing_frames FROM resolved_jank) / NULLIF((SELECT total FROM app_stats), 0),
|
|
494
|
+
2
|
|
495
|
+
) as buffer_stuffing_rate,
|
|
496
|
+
(SELECT avg_present_interval FROM app_stats) as avg_frame_dur,
|
|
497
|
+
(SELECT max_present_interval FROM app_stats) as max_frame_dur,
|
|
498
|
+
(SELECT median_present_interval FROM app_stats) as median_frame_dur,
|
|
499
|
+
(SELECT p95_present_interval FROM app_stats) as p95_frame_dur,
|
|
500
|
+
(SELECT p99_present_interval FROM app_stats) as p99_frame_dur,
|
|
501
|
+
ROUND((SELECT duration_ns FROM time_range) / 1e9, 2) as duration_sec,
|
|
502
|
+
MIN(
|
|
503
|
+
ROUND(1e9 * (SELECT total FROM app_stats) / NULLIF((SELECT duration_ns FROM time_range), 0), 1),
|
|
504
|
+
CAST(ROUND(1e9 / (SELECT vsync_period_ns FROM timing_config)) AS INTEGER)
|
|
505
|
+
) as actual_fps,
|
|
506
|
+
CAST(ROUND(1e9 / (SELECT vsync_period_ns FROM timing_config)) AS INTEGER) as refresh_rate,
|
|
507
|
+
-- 评级基于感知掉帧率(排除 Buffer Stuffing)
|
|
508
|
+
CASE
|
|
509
|
+
WHEN (SELECT perceived_jank_frames FROM resolved_jank) = 0 THEN '优秀'
|
|
510
|
+
WHEN 100.0 * (SELECT perceived_jank_frames FROM resolved_jank) / NULLIF((SELECT total FROM app_stats), 0) < 1 THEN '优秀'
|
|
511
|
+
WHEN 100.0 * (SELECT perceived_jank_frames FROM resolved_jank) / NULLIF((SELECT total FROM app_stats), 0) < 5 THEN '良好'
|
|
512
|
+
WHEN 100.0 * (SELECT perceived_jank_frames FROM resolved_jank) / NULLIF((SELECT total FROM app_stats), 0) < 15 THEN '一般'
|
|
513
|
+
ELSE '较差'
|
|
514
|
+
END as rating,
|
|
515
|
+
(SELECT fps_source FROM resolved_jank) as fps_source,
|
|
516
|
+
(SELECT max_vsync_missed FROM resolved_jank) as max_vsync_missed,
|
|
517
|
+
(SELECT total_vsync_missed FROM resolved_jank) as total_vsync_missed,
|
|
518
|
+
ROUND((SELECT vsync_period_ns FROM timing_config) / 1e6, 2) as vsync_period_ms
|
|
519
|
+
LIMIT 1
|
|
520
|
+
save_as: perf_summary
|
|
521
|
+
condition: "frame_timeline.data[0]?.has_frame_timeline === 1 && environment.data[0]?.has_data === 1"
|
|
522
|
+
|
|
523
|
+
# ==========================================================================
|
|
524
|
+
# L1: 专家探针 - 时间窗与帧波动
|
|
525
|
+
# ==========================================================================
|
|
526
|
+
# 原则:
|
|
527
|
+
# 1) 用户显式给 start_ts/end_ts 时严格尊重用户窗口
|
|
528
|
+
# 2) 未给窗口时,自动使用目标包名的 FrameTimeline 边界作为分析窗口
|
|
529
|
+
# 3) 仅在已确认存在可见掉帧时才启用额外探针,避免无谓开销
|
|
530
|
+
- id: expert_analysis_window
|
|
531
|
+
type: atomic
|
|
532
|
+
name: "专家分析窗口"
|
|
533
|
+
display: false
|
|
534
|
+
sql: |
|
|
535
|
+
WITH frame_bounds AS (
|
|
536
|
+
SELECT
|
|
537
|
+
MIN(a.ts) as min_ts,
|
|
538
|
+
MAX(a.ts + CASE WHEN a.dur > 0 THEN a.dur ELSE 0 END) as max_ts
|
|
539
|
+
FROM actual_frame_timeline_slice a
|
|
540
|
+
LEFT JOIN process p ON a.upid = p.upid
|
|
541
|
+
WHERE (p.name GLOB '${package}*' OR '${package}' = '')
|
|
542
|
+
AND p.name NOT LIKE '/system/%'
|
|
543
|
+
AND COALESCE(a.display_frame_token, a.surface_frame_token) IS NOT NULL
|
|
544
|
+
AND (${start_ts} IS NULL OR a.ts >= ${start_ts})
|
|
545
|
+
AND (${end_ts} IS NULL OR a.ts < ${end_ts})
|
|
546
|
+
)
|
|
547
|
+
SELECT
|
|
548
|
+
CASE
|
|
549
|
+
WHEN COALESCE(${start_ts}, min_ts) IS NOT NULL
|
|
550
|
+
THEN printf('%d', COALESCE(${start_ts}, min_ts))
|
|
551
|
+
ELSE NULL
|
|
552
|
+
END as window_start_ts,
|
|
553
|
+
CASE
|
|
554
|
+
WHEN COALESCE(${end_ts}, max_ts) IS NOT NULL
|
|
555
|
+
THEN printf('%d', COALESCE(${end_ts}, max_ts))
|
|
556
|
+
ELSE NULL
|
|
557
|
+
END as window_end_ts,
|
|
558
|
+
CASE
|
|
559
|
+
WHEN COALESCE(${start_ts}, min_ts) IS NOT NULL
|
|
560
|
+
AND COALESCE(${end_ts}, max_ts) IS NOT NULL
|
|
561
|
+
THEN ROUND((COALESCE(${end_ts}, max_ts) - COALESCE(${start_ts}, min_ts)) / 1e6, 2)
|
|
562
|
+
ELSE NULL
|
|
563
|
+
END as window_ms,
|
|
564
|
+
CASE
|
|
565
|
+
WHEN ${start_ts} IS NOT NULL OR ${end_ts} IS NOT NULL THEN 'user_selected'
|
|
566
|
+
WHEN min_ts IS NOT NULL AND max_ts IS NOT NULL THEN 'auto_frame_bounds'
|
|
567
|
+
ELSE 'unavailable'
|
|
568
|
+
END as window_source
|
|
569
|
+
FROM frame_bounds
|
|
570
|
+
save_as: expert_window
|
|
571
|
+
condition: "${enable_expert_probes|true} == true && frame_timeline.data[0]?.has_frame_timeline === 1 && environment.data[0]?.has_data === 1"
|
|
572
|
+
optional: true
|
|
573
|
+
|
|
574
|
+
- id: frame_variance_probe
|
|
575
|
+
type: skill
|
|
576
|
+
name: "帧方差探针"
|
|
577
|
+
skill: frame_pipeline_variance
|
|
578
|
+
params:
|
|
579
|
+
package: "${package}"
|
|
580
|
+
start_ts: "${expert_window.data?.[0]?.window_start_ts ?? start_ts ?? null}"
|
|
581
|
+
end_ts: "${expert_window.data?.[0]?.window_end_ts ?? end_ts ?? null}"
|
|
582
|
+
transition_threshold_ms: "${frame_variance_transition_threshold_ms|8}"
|
|
583
|
+
display:
|
|
584
|
+
level: summary
|
|
585
|
+
layer: overview
|
|
586
|
+
title: "帧稳定性方差(专家探针)"
|
|
587
|
+
columns:
|
|
588
|
+
- name: total_frames
|
|
589
|
+
label: "总帧数"
|
|
590
|
+
type: number
|
|
591
|
+
- name: avg_frame_ms
|
|
592
|
+
label: "平均帧耗时"
|
|
593
|
+
type: duration
|
|
594
|
+
format: duration_ms
|
|
595
|
+
unit: ms
|
|
596
|
+
- name: stddev_ms
|
|
597
|
+
label: "标准差"
|
|
598
|
+
type: duration
|
|
599
|
+
format: duration_ms
|
|
600
|
+
unit: ms
|
|
601
|
+
- name: avg_delta_ms
|
|
602
|
+
label: "帧间波动"
|
|
603
|
+
type: duration
|
|
604
|
+
format: duration_ms
|
|
605
|
+
unit: ms
|
|
606
|
+
- name: high_variance_transitions
|
|
607
|
+
label: "高抖动转折"
|
|
608
|
+
type: number
|
|
609
|
+
- name: variance_level
|
|
610
|
+
label: "波动等级"
|
|
611
|
+
type: string
|
|
612
|
+
save_as: frame_variance_probe
|
|
613
|
+
condition: "${enable_expert_probes|true} == true && frame_timeline.data[0]?.has_frame_timeline === 1 && (perf_summary?.data?.[0]?.janky_frames || 0) >= (frame_variance_probe_min_janky_frames || 5)"
|
|
614
|
+
optional: true
|
|
615
|
+
|
|
616
|
+
# ==========================================================================
|
|
617
|
+
# L1: 掉帧分析 - 消费端 vs App 报告对比
|
|
618
|
+
# ==========================================================================
|
|
619
|
+
# 展示 jank_type 与实际消费端掉帧的关系
|
|
620
|
+
# - 假阳性: jank_type 报告掉帧,但 gap=1 (用户看到流畅)
|
|
621
|
+
# - 假阴性: jank_type=None,但 gap>1 (用户看到卡顿)
|
|
622
|
+
- id: jank_type_stats
|
|
623
|
+
type: atomic
|
|
624
|
+
name: "掉帧类型统计"
|
|
625
|
+
display:
|
|
626
|
+
level: summary
|
|
627
|
+
layer: overview
|
|
628
|
+
title: "掉帧类型分布"
|
|
629
|
+
columns:
|
|
630
|
+
- name: jank_type
|
|
631
|
+
label: "掉帧类型"
|
|
632
|
+
type: string
|
|
633
|
+
- name: count
|
|
634
|
+
label: "帧数"
|
|
635
|
+
type: number
|
|
636
|
+
format: compact
|
|
637
|
+
- name: real_jank_count
|
|
638
|
+
label: "实际掉帧"
|
|
639
|
+
type: number
|
|
640
|
+
format: compact
|
|
641
|
+
- name: false_positive
|
|
642
|
+
label: "假阳性"
|
|
643
|
+
type: number
|
|
644
|
+
- name: total_dur
|
|
645
|
+
label: "总耗时"
|
|
646
|
+
type: duration
|
|
647
|
+
format: duration_ms
|
|
648
|
+
unit: ns
|
|
649
|
+
- name: avg_dur
|
|
650
|
+
label: "平均耗时"
|
|
651
|
+
type: duration
|
|
652
|
+
format: duration_ms
|
|
653
|
+
unit: ns
|
|
654
|
+
- name: responsibility
|
|
655
|
+
label: "类型标签"
|
|
656
|
+
type: string
|
|
657
|
+
sql: |
|
|
658
|
+
WITH
|
|
659
|
+
vsync_intervals AS (
|
|
660
|
+
SELECT
|
|
661
|
+
c.ts - LAG(c.ts) OVER (ORDER BY c.ts) as interval_ns
|
|
662
|
+
FROM counter c
|
|
663
|
+
JOIN counter_track t ON c.track_id = t.id
|
|
664
|
+
WHERE t.name = 'VSYNC-sf'
|
|
665
|
+
AND (${start_ts} IS NULL OR c.ts >= ${start_ts})
|
|
666
|
+
AND (${end_ts} IS NULL OR c.ts < ${end_ts})
|
|
667
|
+
),
|
|
668
|
+
vsync_config AS (
|
|
669
|
+
SELECT CASE
|
|
670
|
+
WHEN raw_ns BETWEEN 5500000 AND 6500000 THEN 6060606
|
|
671
|
+
WHEN raw_ns BETWEEN 6500001 AND 7500000 THEN 6944444
|
|
672
|
+
WHEN raw_ns BETWEEN 7500001 AND 9500000 THEN 8333333
|
|
673
|
+
WHEN raw_ns BETWEEN 9500001 AND 12500000 THEN 11111111
|
|
674
|
+
WHEN raw_ns BETWEEN 12500001 AND 20000000 THEN 16666667
|
|
675
|
+
WHEN raw_ns BETWEEN 20000001 AND 35000000 THEN 33333333
|
|
676
|
+
ELSE raw_ns
|
|
677
|
+
END AS vsync_period_ns
|
|
678
|
+
FROM (
|
|
679
|
+
SELECT CAST(COALESCE(
|
|
680
|
+
(SELECT PERCENTILE(interval_ns, 0.5)
|
|
681
|
+
FROM vsync_intervals
|
|
682
|
+
WHERE interval_ns > 5500000 AND interval_ns < 50000000),
|
|
683
|
+
16666667
|
|
684
|
+
) AS INTEGER) AS raw_ns
|
|
685
|
+
)
|
|
686
|
+
),
|
|
687
|
+
app_frames AS (
|
|
688
|
+
SELECT
|
|
689
|
+
COALESCE(a.display_frame_token, a.surface_frame_token) as display_frame_token,
|
|
690
|
+
a.ts,
|
|
691
|
+
CASE WHEN a.dur > 0 THEN a.dur ELSE 0 END as dur,
|
|
692
|
+
COALESCE(a.jank_type, 'Unknown') as jank_type,
|
|
693
|
+
COALESCE(a.present_type, 'Unknown Present') as present_type,
|
|
694
|
+
a.layer_name,
|
|
695
|
+
a.ts + CASE WHEN a.dur > 0 THEN a.dur ELSE 0 END as present_ts,
|
|
696
|
+
LAG(a.ts + CASE WHEN a.dur > 0 THEN a.dur ELSE 0 END)
|
|
697
|
+
OVER (PARTITION BY a.layer_name ORDER BY a.ts) as prev_present_ts
|
|
698
|
+
FROM actual_frame_timeline_slice a
|
|
699
|
+
LEFT JOIN process p ON a.upid = p.upid
|
|
700
|
+
WHERE (p.name GLOB '${package}*' OR '${package}' = '')
|
|
701
|
+
AND p.name NOT LIKE '/system/%'
|
|
702
|
+
AND (${start_ts} IS NULL OR a.ts >= ${start_ts})
|
|
703
|
+
AND (${end_ts} IS NULL OR a.ts < ${end_ts})
|
|
704
|
+
AND COALESCE(a.display_frame_token, a.surface_frame_token) IS NOT NULL
|
|
705
|
+
),
|
|
706
|
+
-- 掉帧检测:双信号混合策略
|
|
707
|
+
jank_analysis AS (
|
|
708
|
+
SELECT
|
|
709
|
+
jank_type,
|
|
710
|
+
dur,
|
|
711
|
+
-- is_consumer_jank: 双信号混合检测
|
|
712
|
+
CASE
|
|
713
|
+
WHEN present_type IN ('Late Present', 'Dropped Frame')
|
|
714
|
+
AND jank_type != 'Buffer Stuffing' THEN 1
|
|
715
|
+
WHEN jank_type = 'Buffer Stuffing'
|
|
716
|
+
AND prev_present_ts IS NOT NULL
|
|
717
|
+
AND present_ts - prev_present_ts > (SELECT vsync_period_ns FROM vsync_config) * 1.5
|
|
718
|
+
AND present_ts - prev_present_ts <= (SELECT vsync_period_ns FROM vsync_config) * 6 THEN 1
|
|
719
|
+
ELSE 0
|
|
720
|
+
END as is_consumer_jank
|
|
721
|
+
FROM app_frames
|
|
722
|
+
)
|
|
723
|
+
SELECT
|
|
724
|
+
jank_type,
|
|
725
|
+
COUNT(*) as count,
|
|
726
|
+
-- 实际用户感知掉帧数(present_type 为 Late/Dropped)
|
|
727
|
+
SUM(is_consumer_jank) as real_jank_count,
|
|
728
|
+
-- 假阳性数(jank_type 报告掉帧,但 present_type 未标记为 Late/Dropped)
|
|
729
|
+
SUM(CASE WHEN jank_type != 'None' AND is_consumer_jank = 0 THEN 1 ELSE 0 END) as false_positive,
|
|
730
|
+
CAST(SUM(CASE WHEN dur > 0 THEN dur ELSE 0 END) AS REAL) as total_dur,
|
|
731
|
+
CAST(ROUND(AVG(CASE WHEN dur > 0 THEN dur ELSE NULL END)) AS INTEGER) as avg_dur,
|
|
732
|
+
CASE
|
|
733
|
+
WHEN jank_type GLOB '*App*' OR jank_type = 'Self Jank' THEN '标签:App'
|
|
734
|
+
WHEN jank_type GLOB '*SurfaceFlinger*' THEN '标签:SurfaceFlinger'
|
|
735
|
+
WHEN jank_type = 'Buffer Stuffing' THEN '标签:Buffer Stuffing(需验证)'
|
|
736
|
+
WHEN jank_type = 'None' THEN '标签:None(可能漏检)'
|
|
737
|
+
ELSE '标签:Other'
|
|
738
|
+
END as responsibility
|
|
739
|
+
FROM jank_analysis
|
|
740
|
+
GROUP BY jank_type
|
|
741
|
+
ORDER BY real_jank_count DESC, count DESC
|
|
742
|
+
LIMIT 10
|
|
743
|
+
save_as: jank_stats
|
|
744
|
+
condition: "frame_timeline.data[0]?.has_frame_timeline === 1 && environment.data[0]?.has_data === 1"
|
|
745
|
+
|
|
746
|
+
# ==========================================================================
|
|
747
|
+
# L2: 滑动区间列表
|
|
748
|
+
# ==========================================================================
|
|
749
|
+
- id: scroll_sessions
|
|
750
|
+
type: atomic
|
|
751
|
+
name: "滑动区间列表"
|
|
752
|
+
display:
|
|
753
|
+
level: detail
|
|
754
|
+
layer: list
|
|
755
|
+
title: "滑动区间"
|
|
756
|
+
expandable: true
|
|
757
|
+
expandableBindSource: session_stats # 绑定 session_stats_batch 的 save_as
|
|
758
|
+
columns:
|
|
759
|
+
- name: session_id
|
|
760
|
+
label: "区间"
|
|
761
|
+
type: number
|
|
762
|
+
- name: process_name
|
|
763
|
+
label: "进程"
|
|
764
|
+
type: string
|
|
765
|
+
- name: start_ts
|
|
766
|
+
label: "开始时间"
|
|
767
|
+
type: timestamp
|
|
768
|
+
clickAction: navigate_range
|
|
769
|
+
durationColumn: duration
|
|
770
|
+
- name: end_ts
|
|
771
|
+
label: "结束时间"
|
|
772
|
+
type: timestamp
|
|
773
|
+
clickAction: navigate_timeline
|
|
774
|
+
- name: frame_count
|
|
775
|
+
label: "帧数"
|
|
776
|
+
type: number
|
|
777
|
+
format: compact
|
|
778
|
+
- name: duration_ms
|
|
779
|
+
label: "持续时间"
|
|
780
|
+
type: duration
|
|
781
|
+
format: duration_ms
|
|
782
|
+
unit: ms
|
|
783
|
+
hidden: true
|
|
784
|
+
- name: duration
|
|
785
|
+
label: "持续时间"
|
|
786
|
+
type: duration
|
|
787
|
+
format: duration_ms
|
|
788
|
+
unit: ns
|
|
789
|
+
- name: avg_dur
|
|
790
|
+
label: "平均帧耗时"
|
|
791
|
+
type: duration
|
|
792
|
+
format: duration_ms
|
|
793
|
+
unit: ns
|
|
794
|
+
- name: max_dur
|
|
795
|
+
label: "最大帧耗时"
|
|
796
|
+
type: duration
|
|
797
|
+
format: duration_ms
|
|
798
|
+
unit: ns
|
|
799
|
+
- name: session_fps
|
|
800
|
+
label: "FPS"
|
|
801
|
+
type: number
|
|
802
|
+
sql: |
|
|
803
|
+
WITH
|
|
804
|
+
-- 动态 VSync 周期检测用于 session 切分(限定在分析区间内)
|
|
805
|
+
vsync_intervals AS (
|
|
806
|
+
SELECT c.ts - LAG(c.ts) OVER (ORDER BY c.ts) as interval_ns
|
|
807
|
+
FROM counter c
|
|
808
|
+
JOIN counter_track t ON c.track_id = t.id
|
|
809
|
+
WHERE t.name = 'VSYNC-sf'
|
|
810
|
+
AND (${start_ts} IS NULL OR c.ts >= ${start_ts})
|
|
811
|
+
AND (${end_ts} IS NULL OR c.ts < ${end_ts})
|
|
812
|
+
),
|
|
813
|
+
vsync_config AS (
|
|
814
|
+
SELECT CASE
|
|
815
|
+
WHEN raw_ns BETWEEN 5500000 AND 6500000 THEN 6060606
|
|
816
|
+
WHEN raw_ns BETWEEN 6500001 AND 7500000 THEN 6944444
|
|
817
|
+
WHEN raw_ns BETWEEN 7500001 AND 9500000 THEN 8333333
|
|
818
|
+
WHEN raw_ns BETWEEN 9500001 AND 12500000 THEN 11111111
|
|
819
|
+
WHEN raw_ns BETWEEN 12500001 AND 20000000 THEN 16666667
|
|
820
|
+
WHEN raw_ns BETWEEN 20000001 AND 35000000 THEN 33333333
|
|
821
|
+
ELSE raw_ns
|
|
822
|
+
END AS vsync_period_ns
|
|
823
|
+
FROM (
|
|
824
|
+
SELECT CAST(COALESCE(
|
|
825
|
+
(SELECT PERCENTILE(interval_ns, 0.5)
|
|
826
|
+
FROM vsync_intervals
|
|
827
|
+
WHERE interval_ns > 5500000 AND interval_ns < 50000000),
|
|
828
|
+
16666667
|
|
829
|
+
) AS INTEGER) AS raw_ns
|
|
830
|
+
)
|
|
831
|
+
),
|
|
832
|
+
frame_gaps AS (
|
|
833
|
+
SELECT
|
|
834
|
+
COALESCE(a.display_frame_token, a.surface_frame_token) as frame_id,
|
|
835
|
+
a.ts,
|
|
836
|
+
a.dur,
|
|
837
|
+
a.upid,
|
|
838
|
+
p.name as process_name,
|
|
839
|
+
LAG(a.ts + a.dur) OVER (PARTITION BY a.upid ORDER BY a.ts) as prev_end,
|
|
840
|
+
a.ts - LAG(a.ts + a.dur) OVER (PARTITION BY a.upid ORDER BY a.ts) as gap_ns
|
|
841
|
+
FROM actual_frame_timeline_slice a
|
|
842
|
+
JOIN process p ON a.upid = p.upid
|
|
843
|
+
WHERE (p.name GLOB '${package}*' OR '${package}' = '')
|
|
844
|
+
AND p.name NOT LIKE '/system/%'
|
|
845
|
+
AND (${start_ts} IS NULL OR a.ts >= ${start_ts})
|
|
846
|
+
AND (${end_ts} IS NULL OR a.ts < ${end_ts})
|
|
847
|
+
AND a.dur > 0
|
|
848
|
+
AND COALESCE(a.display_frame_token, a.surface_frame_token) IS NOT NULL
|
|
849
|
+
),
|
|
850
|
+
session_markers AS (
|
|
851
|
+
SELECT *,
|
|
852
|
+
CASE WHEN gap_ns IS NULL OR gap_ns > (SELECT vsync_period_ns * 6 FROM vsync_config) THEN 1 ELSE 0 END as new_session
|
|
853
|
+
FROM frame_gaps
|
|
854
|
+
),
|
|
855
|
+
sessions AS (
|
|
856
|
+
SELECT *,
|
|
857
|
+
SUM(new_session) OVER (PARTITION BY upid ORDER BY ts) as session_id
|
|
858
|
+
FROM session_markers
|
|
859
|
+
)
|
|
860
|
+
SELECT
|
|
861
|
+
session_id,
|
|
862
|
+
process_name,
|
|
863
|
+
printf('%d', MIN(ts)) as start_ts,
|
|
864
|
+
printf('%d', MAX(ts + dur)) as end_ts,
|
|
865
|
+
COUNT(*) as frame_count,
|
|
866
|
+
-- duration_ms is the primary display column (already in ms)
|
|
867
|
+
ROUND((MAX(ts + dur) - MIN(ts)) / 1e6, 1) as duration_ms,
|
|
868
|
+
-- duration in ns as string to avoid 32-bit integer overflow (for downstream consumers)
|
|
869
|
+
printf('%d', MAX(ts + dur) - MIN(ts)) as duration,
|
|
870
|
+
CAST(ROUND(AVG(dur)) AS INTEGER) as avg_dur,
|
|
871
|
+
MAX(dur) as max_dur,
|
|
872
|
+
ROUND(1e9 * COUNT(*) / NULLIF(MAX(ts + dur) - MIN(ts), 0), 1) as session_fps
|
|
873
|
+
FROM sessions
|
|
874
|
+
GROUP BY upid, session_id
|
|
875
|
+
HAVING COUNT(*) >= 10
|
|
876
|
+
AND (MAX(ts + dur) - MIN(ts)) > 200000000
|
|
877
|
+
ORDER BY MIN(ts)
|
|
878
|
+
save_as: sessions
|
|
879
|
+
condition: "frame_timeline.data[0]?.has_frame_timeline === 1 && environment.data[0]?.has_data === 1"
|
|
880
|
+
|
|
881
|
+
# ==========================================================================
|
|
882
|
+
# L2: Per-Session Statistics Batch (expandable data for scroll_sessions)
|
|
883
|
+
# 每个滑动区间的四象限/CPU频率/大小核分布,作为展开行数据
|
|
884
|
+
# 一次扫描 thread_state,一次扫描 counter,避免 N 次重复查询
|
|
885
|
+
# ==========================================================================
|
|
886
|
+
- id: session_stats_batch
|
|
887
|
+
type: atomic
|
|
888
|
+
name: "滑动区间统计(批量)"
|
|
889
|
+
optional: true
|
|
890
|
+
display: false
|
|
891
|
+
save_as: session_stats
|
|
892
|
+
condition: "scroll_sessions.data?.length > 0"
|
|
893
|
+
sql: |
|
|
894
|
+
WITH
|
|
895
|
+
-- 1. VSync config (同 scroll_sessions)
|
|
896
|
+
vsync_intervals AS (
|
|
897
|
+
SELECT c.ts - LAG(c.ts) OVER (ORDER BY c.ts) as interval_ns
|
|
898
|
+
FROM counter c
|
|
899
|
+
JOIN counter_track t ON c.track_id = t.id
|
|
900
|
+
WHERE t.name = 'VSYNC-sf'
|
|
901
|
+
AND (${start_ts} IS NULL OR c.ts >= ${start_ts})
|
|
902
|
+
AND (${end_ts} IS NULL OR c.ts < ${end_ts})
|
|
903
|
+
),
|
|
904
|
+
vsync_config AS (
|
|
905
|
+
SELECT CASE
|
|
906
|
+
WHEN raw_ns BETWEEN 5500000 AND 6500000 THEN 6060606
|
|
907
|
+
WHEN raw_ns BETWEEN 6500001 AND 7500000 THEN 6944444
|
|
908
|
+
WHEN raw_ns BETWEEN 7500001 AND 9500000 THEN 8333333
|
|
909
|
+
WHEN raw_ns BETWEEN 9500001 AND 12500000 THEN 11111111
|
|
910
|
+
WHEN raw_ns BETWEEN 12500001 AND 20000000 THEN 16666667
|
|
911
|
+
WHEN raw_ns BETWEEN 20000001 AND 35000000 THEN 33333333
|
|
912
|
+
ELSE raw_ns
|
|
913
|
+
END AS vsync_period_ns
|
|
914
|
+
FROM (
|
|
915
|
+
SELECT CAST(COALESCE(
|
|
916
|
+
(SELECT PERCENTILE(interval_ns, 0.5)
|
|
917
|
+
FROM vsync_intervals
|
|
918
|
+
WHERE interval_ns > 5500000 AND interval_ns < 50000000),
|
|
919
|
+
16666667
|
|
920
|
+
) AS INTEGER) AS raw_ns
|
|
921
|
+
)
|
|
922
|
+
),
|
|
923
|
+
-- 2. Session boundaries (同 scroll_sessions)
|
|
924
|
+
frame_gaps AS (
|
|
925
|
+
SELECT
|
|
926
|
+
a.ts, a.dur, a.upid,
|
|
927
|
+
p.name as process_name,
|
|
928
|
+
a.ts - LAG(a.ts + a.dur) OVER (PARTITION BY a.upid ORDER BY a.ts) as gap_ns
|
|
929
|
+
FROM actual_frame_timeline_slice a
|
|
930
|
+
JOIN process p ON a.upid = p.upid
|
|
931
|
+
WHERE (p.name GLOB '${package}*' OR '${package}' = '')
|
|
932
|
+
AND p.name NOT LIKE '/system/%'
|
|
933
|
+
AND (${start_ts} IS NULL OR a.ts >= ${start_ts})
|
|
934
|
+
AND (${end_ts} IS NULL OR a.ts < ${end_ts})
|
|
935
|
+
AND a.dur > 0
|
|
936
|
+
AND COALESCE(a.display_frame_token, a.surface_frame_token) IS NOT NULL
|
|
937
|
+
),
|
|
938
|
+
session_markers AS (
|
|
939
|
+
SELECT *,
|
|
940
|
+
CASE WHEN gap_ns IS NULL OR gap_ns > (SELECT vsync_period_ns * 6 FROM vsync_config) THEN 1 ELSE 0 END as new_session
|
|
941
|
+
FROM frame_gaps
|
|
942
|
+
),
|
|
943
|
+
sessions_raw AS (
|
|
944
|
+
SELECT *,
|
|
945
|
+
SUM(new_session) OVER (PARTITION BY upid ORDER BY ts) as session_id
|
|
946
|
+
FROM session_markers
|
|
947
|
+
),
|
|
948
|
+
session_bounds AS (
|
|
949
|
+
SELECT
|
|
950
|
+
upid, session_id, process_name,
|
|
951
|
+
MIN(ts) as start_ts,
|
|
952
|
+
MAX(ts + dur) as end_ts
|
|
953
|
+
FROM sessions_raw
|
|
954
|
+
GROUP BY upid, session_id
|
|
955
|
+
HAVING COUNT(*) >= 10
|
|
956
|
+
AND (MAX(ts + dur) - MIN(ts)) > 200000000
|
|
957
|
+
),
|
|
958
|
+
-- 3. ONE scan of thread_state: 同时供四象限和大小核分布使用
|
|
959
|
+
thread_detail AS (
|
|
960
|
+
SELECT
|
|
961
|
+
sb.session_id,
|
|
962
|
+
sb.process_name,
|
|
963
|
+
CASE WHEN t.tid = p.pid THEN 'MainThread' ELSE t.name END as thread_name,
|
|
964
|
+
ts.state,
|
|
965
|
+
COALESCE(ct.core_type, 'unknown') as core_type,
|
|
966
|
+
ts.dur
|
|
967
|
+
FROM thread_state ts
|
|
968
|
+
JOIN thread t ON ts.utid = t.utid
|
|
969
|
+
JOIN process p ON t.upid = p.upid
|
|
970
|
+
LEFT JOIN _cpu_topology ct ON ts.cpu = ct.cpu_id
|
|
971
|
+
JOIN session_bounds sb ON p.upid = sb.upid
|
|
972
|
+
AND ts.ts >= sb.start_ts AND ts.ts < sb.end_ts
|
|
973
|
+
WHERE (p.name GLOB '${package}*' OR '${package}' = '')
|
|
974
|
+
AND p.name NOT LIKE '/system/%'
|
|
975
|
+
AND (t.tid = p.pid OR t.name IN ('RenderThread', 'GPU completion', 'hwuiTask0', 'hwuiTask1'))
|
|
976
|
+
),
|
|
977
|
+
-- 4. 四象限聚合 (MainThread + RenderThread)
|
|
978
|
+
quadrant_agg AS (
|
|
979
|
+
SELECT
|
|
980
|
+
session_id, process_name,
|
|
981
|
+
thread_name as thread,
|
|
982
|
+
SUM(CASE WHEN state = 'Running' AND core_type IN ('prime', 'big') THEN dur ELSE 0 END) as q1_ns,
|
|
983
|
+
SUM(CASE WHEN state = 'Running' AND core_type NOT IN ('prime', 'big') THEN dur ELSE 0 END) as q2_ns,
|
|
984
|
+
SUM(CASE WHEN state = 'R' THEN dur ELSE 0 END) as q3_ns,
|
|
985
|
+
SUM(CASE WHEN state IN ('D', 'DK') THEN dur ELSE 0 END) as q4a_ns,
|
|
986
|
+
SUM(CASE WHEN state IN ('S', 'I') THEN dur ELSE 0 END) as q4b_ns,
|
|
987
|
+
SUM(dur) as total_ns
|
|
988
|
+
FROM thread_detail
|
|
989
|
+
WHERE thread_name IN ('MainThread', 'RenderThread')
|
|
990
|
+
GROUP BY session_id, process_name, thread_name
|
|
991
|
+
),
|
|
992
|
+
-- 5. 大小核分布聚合 (所有出图线程, Running 状态)
|
|
993
|
+
core_aff_raw AS (
|
|
994
|
+
SELECT
|
|
995
|
+
session_id, process_name, thread_name, core_type,
|
|
996
|
+
SUM(CASE WHEN state = 'Running' THEN dur ELSE 0 END) as run_dur_ns
|
|
997
|
+
FROM thread_detail
|
|
998
|
+
GROUP BY session_id, process_name, thread_name, core_type
|
|
999
|
+
HAVING SUM(CASE WHEN state = 'Running' THEN dur ELSE 0 END) > 0
|
|
1000
|
+
),
|
|
1001
|
+
core_aff_with_pct AS (
|
|
1002
|
+
SELECT ca.*,
|
|
1003
|
+
ROUND(100.0 * ca.run_dur_ns / NULLIF(
|
|
1004
|
+
SUM(ca.run_dur_ns) OVER (PARTITION BY ca.session_id, ca.process_name, ca.thread_name), 0
|
|
1005
|
+
), 1) as pct
|
|
1006
|
+
FROM core_aff_raw ca
|
|
1007
|
+
),
|
|
1008
|
+
-- 6. CPU 频率聚合 (一次 counter 扫描)
|
|
1009
|
+
cpu_freq_agg AS (
|
|
1010
|
+
SELECT
|
|
1011
|
+
sb.session_id, sb.process_name,
|
|
1012
|
+
ct.core_type,
|
|
1013
|
+
COUNT(DISTINCT cct.cpu) as num_cores,
|
|
1014
|
+
ROUND(AVG(c.value) / 1000, 0) as avg_freq_mhz,
|
|
1015
|
+
ROUND(MAX(c.value) / 1000, 0) as max_freq_mhz,
|
|
1016
|
+
ROUND(MIN(c.value) / 1000, 0) as min_freq_mhz
|
|
1017
|
+
FROM counter c
|
|
1018
|
+
JOIN cpu_counter_track cct ON c.track_id = cct.id
|
|
1019
|
+
JOIN _cpu_topology ct ON cct.cpu = ct.cpu_id
|
|
1020
|
+
JOIN session_bounds sb ON c.ts >= sb.start_ts AND c.ts < sb.end_ts
|
|
1021
|
+
WHERE cct.name = 'cpufreq'
|
|
1022
|
+
GROUP BY sb.session_id, sb.process_name, ct.core_type
|
|
1023
|
+
)
|
|
1024
|
+
-- 最终输出: 每个 session 一行, 3 个 JSON 列 + 匹配键
|
|
1025
|
+
SELECT
|
|
1026
|
+
sb.session_id,
|
|
1027
|
+
sb.process_name,
|
|
1028
|
+
printf('%d', sb.start_ts) as start_ts,
|
|
1029
|
+
(SELECT json_group_array(json_object(
|
|
1030
|
+
'thread', sub.thread,
|
|
1031
|
+
'q1_big_pct', ROUND(100.0 * sub.q1_ns / NULLIF(sub.total_ns, 0), 1),
|
|
1032
|
+
'q2_little_pct', ROUND(100.0 * sub.q2_ns / NULLIF(sub.total_ns, 0), 1),
|
|
1033
|
+
'q3_runnable_pct', ROUND(100.0 * sub.q3_ns / NULLIF(sub.total_ns, 0), 1),
|
|
1034
|
+
'q4a_io_pct', ROUND(100.0 * sub.q4a_ns / NULLIF(sub.total_ns, 0), 1),
|
|
1035
|
+
'q4b_sleep_pct', ROUND(100.0 * sub.q4b_ns / NULLIF(sub.total_ns, 0), 1),
|
|
1036
|
+
'total_ms', ROUND(sub.total_ns / 1e6, 1)
|
|
1037
|
+
)) FROM (
|
|
1038
|
+
SELECT * FROM quadrant_agg qa
|
|
1039
|
+
WHERE qa.session_id = sb.session_id AND qa.process_name = sb.process_name
|
|
1040
|
+
ORDER BY CASE qa.thread WHEN 'MainThread' THEN 1 ELSE 2 END
|
|
1041
|
+
) sub) as quadrant_json,
|
|
1042
|
+
(SELECT json_group_array(json_object(
|
|
1043
|
+
'core_type', sub.core_type,
|
|
1044
|
+
'num_cores', sub.num_cores,
|
|
1045
|
+
'avg_freq_mhz', sub.avg_freq_mhz,
|
|
1046
|
+
'max_freq_mhz', sub.max_freq_mhz,
|
|
1047
|
+
'min_freq_mhz', sub.min_freq_mhz
|
|
1048
|
+
)) FROM (
|
|
1049
|
+
SELECT * FROM cpu_freq_agg cf
|
|
1050
|
+
WHERE cf.session_id = sb.session_id AND cf.process_name = sb.process_name
|
|
1051
|
+
ORDER BY cf.max_freq_mhz DESC
|
|
1052
|
+
) sub) as cpu_freq_json,
|
|
1053
|
+
(SELECT json_group_array(json_object(
|
|
1054
|
+
'thread_name', sub.thread_name,
|
|
1055
|
+
'core_type', sub.core_type,
|
|
1056
|
+
'run_ms', ROUND(sub.run_dur_ns / 1e6, 2),
|
|
1057
|
+
'pct', sub.pct
|
|
1058
|
+
)) FROM (
|
|
1059
|
+
SELECT * FROM core_aff_with_pct cap
|
|
1060
|
+
WHERE cap.session_id = sb.session_id AND cap.process_name = sb.process_name
|
|
1061
|
+
ORDER BY
|
|
1062
|
+
CASE cap.thread_name
|
|
1063
|
+
WHEN 'MainThread' THEN 1 WHEN 'RenderThread' THEN 2
|
|
1064
|
+
WHEN 'GPU completion' THEN 3 ELSE 4
|
|
1065
|
+
END, cap.run_dur_ns DESC
|
|
1066
|
+
) sub) as core_affinity_json
|
|
1067
|
+
FROM session_bounds sb
|
|
1068
|
+
ORDER BY sb.start_ts
|
|
1069
|
+
|
|
1070
|
+
# ==========================================================================
|
|
1071
|
+
# L2: 区间掉帧统计 (基于 present_type 列检测掉帧)
|
|
1072
|
+
# ==========================================================================
|
|
1073
|
+
- id: session_jank
|
|
1074
|
+
type: atomic
|
|
1075
|
+
name: "区间掉帧统计"
|
|
1076
|
+
display:
|
|
1077
|
+
level: detail
|
|
1078
|
+
layer: list
|
|
1079
|
+
title: "区间掉帧"
|
|
1080
|
+
columns:
|
|
1081
|
+
- name: session_id
|
|
1082
|
+
label: "区间"
|
|
1083
|
+
type: number
|
|
1084
|
+
- name: frame_count
|
|
1085
|
+
label: "总帧数"
|
|
1086
|
+
type: number
|
|
1087
|
+
format: compact
|
|
1088
|
+
- name: janky_count
|
|
1089
|
+
label: "感知掉帧"
|
|
1090
|
+
type: number
|
|
1091
|
+
format: compact
|
|
1092
|
+
- name: jank_rate
|
|
1093
|
+
label: "感知掉帧率"
|
|
1094
|
+
type: percentage
|
|
1095
|
+
format: percentage
|
|
1096
|
+
- name: app_janky_count
|
|
1097
|
+
label: "App 掉帧"
|
|
1098
|
+
type: number
|
|
1099
|
+
format: compact
|
|
1100
|
+
- name: buffer_stuffing_count
|
|
1101
|
+
label: "Buffer Stuffing"
|
|
1102
|
+
type: number
|
|
1103
|
+
format: compact
|
|
1104
|
+
- name: max_vsync_missed
|
|
1105
|
+
label: "最大跳帧"
|
|
1106
|
+
type: number
|
|
1107
|
+
- name: jank_types
|
|
1108
|
+
label: "掉帧类型"
|
|
1109
|
+
type: string
|
|
1110
|
+
format: truncate
|
|
1111
|
+
sql: |
|
|
1112
|
+
WITH
|
|
1113
|
+
-- 动态 VSync 周期检测(限定在分析区间内,仅用于 session 切分)
|
|
1114
|
+
vsync_intervals_for_session AS (
|
|
1115
|
+
SELECT c.ts - LAG(c.ts) OVER (ORDER BY c.ts) as interval_ns
|
|
1116
|
+
FROM counter c
|
|
1117
|
+
JOIN counter_track t ON c.track_id = t.id
|
|
1118
|
+
WHERE t.name = 'VSYNC-sf'
|
|
1119
|
+
AND (${start_ts} IS NULL OR c.ts >= ${start_ts})
|
|
1120
|
+
AND (${end_ts} IS NULL OR c.ts < ${end_ts})
|
|
1121
|
+
),
|
|
1122
|
+
vsync_config_for_session AS (
|
|
1123
|
+
SELECT CASE
|
|
1124
|
+
WHEN raw_ns BETWEEN 5500000 AND 6500000 THEN 6060606
|
|
1125
|
+
WHEN raw_ns BETWEEN 6500001 AND 7500000 THEN 6944444
|
|
1126
|
+
WHEN raw_ns BETWEEN 7500001 AND 9500000 THEN 8333333
|
|
1127
|
+
WHEN raw_ns BETWEEN 9500001 AND 12500000 THEN 11111111
|
|
1128
|
+
WHEN raw_ns BETWEEN 12500001 AND 20000000 THEN 16666667
|
|
1129
|
+
WHEN raw_ns BETWEEN 20000001 AND 35000000 THEN 33333333
|
|
1130
|
+
ELSE raw_ns
|
|
1131
|
+
END AS vsync_period_ns
|
|
1132
|
+
FROM (
|
|
1133
|
+
SELECT CAST(COALESCE(
|
|
1134
|
+
(SELECT PERCENTILE(interval_ns, 0.5)
|
|
1135
|
+
FROM vsync_intervals_for_session
|
|
1136
|
+
WHERE interval_ns > 5500000 AND interval_ns < 50000000),
|
|
1137
|
+
16666667
|
|
1138
|
+
) AS INTEGER) AS raw_ns
|
|
1139
|
+
)
|
|
1140
|
+
),
|
|
1141
|
+
frame_gaps AS (
|
|
1142
|
+
SELECT
|
|
1143
|
+
COALESCE(a.display_frame_token, a.surface_frame_token) as display_frame_token,
|
|
1144
|
+
a.ts, a.dur, a.upid,
|
|
1145
|
+
a.layer_name,
|
|
1146
|
+
a.jank_type,
|
|
1147
|
+
COALESCE(a.present_type, 'Unknown Present') as present_type,
|
|
1148
|
+
p.name as process_name,
|
|
1149
|
+
a.ts - LAG(a.ts + a.dur) OVER (PARTITION BY a.upid ORDER BY a.ts) as time_gap_ns,
|
|
1150
|
+
a.ts + CASE WHEN a.dur > 0 THEN a.dur ELSE 0 END as present_ts,
|
|
1151
|
+
LAG(a.ts + CASE WHEN a.dur > 0 THEN a.dur ELSE 0 END)
|
|
1152
|
+
OVER (PARTITION BY a.layer_name ORDER BY a.ts) as prev_present_ts
|
|
1153
|
+
FROM actual_frame_timeline_slice a
|
|
1154
|
+
JOIN process p ON a.upid = p.upid
|
|
1155
|
+
WHERE (p.name GLOB '${package}*' OR '${package}' = '')
|
|
1156
|
+
AND p.name NOT LIKE '/system/%'
|
|
1157
|
+
AND (${start_ts} IS NULL OR a.ts >= ${start_ts})
|
|
1158
|
+
AND (${end_ts} IS NULL OR a.ts < ${end_ts})
|
|
1159
|
+
AND a.dur > 0
|
|
1160
|
+
AND COALESCE(a.display_frame_token, a.surface_frame_token) IS NOT NULL
|
|
1161
|
+
),
|
|
1162
|
+
session_markers AS (
|
|
1163
|
+
SELECT *,
|
|
1164
|
+
CASE WHEN time_gap_ns IS NULL OR time_gap_ns > (SELECT vsync_period_ns * 6 FROM vsync_config_for_session) THEN 1 ELSE 0 END as new_session
|
|
1165
|
+
FROM frame_gaps
|
|
1166
|
+
),
|
|
1167
|
+
sessions_raw AS (
|
|
1168
|
+
SELECT *,
|
|
1169
|
+
SUM(new_session) OVER (PARTITION BY upid ORDER BY ts) as session_id
|
|
1170
|
+
FROM session_markers
|
|
1171
|
+
),
|
|
1172
|
+
sessions AS (
|
|
1173
|
+
SELECT
|
|
1174
|
+
session_id,
|
|
1175
|
+
process_name,
|
|
1176
|
+
MIN(ts) as start_ts,
|
|
1177
|
+
MAX(ts + dur) as end_ts,
|
|
1178
|
+
COUNT(*) as frame_count
|
|
1179
|
+
FROM sessions_raw
|
|
1180
|
+
GROUP BY upid, session_id
|
|
1181
|
+
HAVING COUNT(*) >= 10
|
|
1182
|
+
AND (MAX(ts + dur) - MIN(ts)) > 200000000
|
|
1183
|
+
),
|
|
1184
|
+
-- 掉帧检测:双信号混合策略
|
|
1185
|
+
session_token_gap_jank AS (
|
|
1186
|
+
SELECT
|
|
1187
|
+
sr.session_id,
|
|
1188
|
+
-- 感知掉帧:双信号混合检测
|
|
1189
|
+
SUM(CASE
|
|
1190
|
+
WHEN sr.present_type IN ('Late Present', 'Dropped Frame')
|
|
1191
|
+
AND sr.jank_type != 'Buffer Stuffing' THEN 1
|
|
1192
|
+
WHEN sr.jank_type = 'Buffer Stuffing'
|
|
1193
|
+
AND sr.prev_present_ts IS NOT NULL
|
|
1194
|
+
AND sr.present_ts - sr.prev_present_ts > (SELECT vsync_period_ns FROM vsync_config_for_session) * 1.5
|
|
1195
|
+
AND sr.present_ts - sr.prev_present_ts <= (SELECT vsync_period_ns FROM vsync_config_for_session) * 6 THEN 1
|
|
1196
|
+
ELSE 0 END) as consumer_jank_count,
|
|
1197
|
+
SUM(CASE WHEN sr.present_type IN ('Late Present', 'Dropped Frame')
|
|
1198
|
+
AND sr.jank_type IN ('Self Jank', 'App Deadline Missed') THEN 1 ELSE 0 END) as app_jank_count,
|
|
1199
|
+
-- Buffer Stuffing 总帧数(管线背压,含正常 BS 和异常 BS)
|
|
1200
|
+
SUM(CASE WHEN sr.jank_type = 'Buffer Stuffing' THEN 1 ELSE 0 END) as buffer_stuffing_count,
|
|
1201
|
+
MAX(CASE
|
|
1202
|
+
WHEN (
|
|
1203
|
+
(sr.present_type IN ('Late Present', 'Dropped Frame') AND sr.jank_type != 'Buffer Stuffing')
|
|
1204
|
+
OR (sr.jank_type = 'Buffer Stuffing' AND sr.prev_present_ts IS NOT NULL
|
|
1205
|
+
AND sr.present_ts - sr.prev_present_ts > (SELECT vsync_period_ns FROM vsync_config_for_session) * 1.5
|
|
1206
|
+
AND sr.present_ts - sr.prev_present_ts <= (SELECT vsync_period_ns FROM vsync_config_for_session) * 6)
|
|
1207
|
+
) AND sr.prev_present_ts IS NOT NULL
|
|
1208
|
+
AND sr.present_ts - sr.prev_present_ts > (SELECT vsync_period_ns FROM vsync_config_for_session) * 1.5
|
|
1209
|
+
THEN MAX(CAST(ROUND((sr.present_ts - sr.prev_present_ts) * 1.0 / (SELECT vsync_period_ns FROM vsync_config_for_session) - 1, 0) AS INTEGER), 0)
|
|
1210
|
+
ELSE 0 END) as max_vsync_missed,
|
|
1211
|
+
GROUP_CONCAT(DISTINCT CASE
|
|
1212
|
+
WHEN (sr.present_type IN ('Late Present', 'Dropped Frame') AND sr.jank_type != 'Buffer Stuffing')
|
|
1213
|
+
OR (sr.jank_type = 'Buffer Stuffing' AND sr.prev_present_ts IS NOT NULL
|
|
1214
|
+
AND sr.present_ts - sr.prev_present_ts > (SELECT vsync_period_ns FROM vsync_config_for_session) * 1.5)
|
|
1215
|
+
THEN COALESCE(sr.jank_type, 'None') END) as jank_types
|
|
1216
|
+
FROM sessions_raw sr
|
|
1217
|
+
GROUP BY sr.session_id
|
|
1218
|
+
)
|
|
1219
|
+
SELECT
|
|
1220
|
+
s.session_id,
|
|
1221
|
+
s.frame_count,
|
|
1222
|
+
-- 感知掉帧 = consumer_jank_count(双信号已过滤正常 BS)
|
|
1223
|
+
COALESCE(stj.consumer_jank_count, 0) as janky_count,
|
|
1224
|
+
ROUND(100.0 * COALESCE(stj.consumer_jank_count, 0) / NULLIF(s.frame_count, 0), 2) as jank_rate,
|
|
1225
|
+
COALESCE(stj.app_jank_count, 0) as app_janky_count,
|
|
1226
|
+
COALESCE(stj.buffer_stuffing_count, 0) as buffer_stuffing_count,
|
|
1227
|
+
COALESCE(stj.max_vsync_missed, 0) as max_vsync_missed,
|
|
1228
|
+
stj.jank_types
|
|
1229
|
+
FROM sessions s
|
|
1230
|
+
LEFT JOIN session_token_gap_jank stj ON s.session_id = stj.session_id
|
|
1231
|
+
ORDER BY s.session_id
|
|
1232
|
+
save_as: session_jank_data
|
|
1233
|
+
optional: true
|
|
1234
|
+
condition: "frame_timeline.data[0]?.has_frame_timeline === 1 && environment.data[0]?.has_data === 1"
|
|
1235
|
+
|
|
1236
|
+
# ==========================================================================
|
|
1237
|
+
# 内部步骤:获取所有掉帧的帧列表 (双信号混合检测)
|
|
1238
|
+
# ==========================================================================
|
|
1239
|
+
# 核心原理:
|
|
1240
|
+
# - 非 BS 帧:present_type IN ('Late Present', 'Dropped Frame') 为权威信号
|
|
1241
|
+
# - BS 帧:间隔 > 1.5x vsync = 真实掉帧(被 BS 掩盖)
|
|
1242
|
+
# - vsync_missed 用 present_ts 间隔估算严重度(辅助信号)
|
|
1243
|
+
# - jank_type 用于标记责任归属(App 侧 vs SF 侧)
|
|
1244
|
+
- id: get_app_jank_frames
|
|
1245
|
+
type: atomic
|
|
1246
|
+
name: "获取真正掉帧帧"
|
|
1247
|
+
synthesize:
|
|
1248
|
+
role: list
|
|
1249
|
+
groupBy:
|
|
1250
|
+
- field: jank_responsibility
|
|
1251
|
+
title: 责任归属分布
|
|
1252
|
+
- field: jank_type
|
|
1253
|
+
title: 掉帧类型分布
|
|
1254
|
+
display: false # 隐藏独立显示 — 由 batch_frame_root_cause 统一展示掉帧列表。此 step 仍运行,数据通过 save_as 供下游引用。
|
|
1255
|
+
sql: |
|
|
1256
|
+
WITH
|
|
1257
|
+
-- VSync 周期(限定在分析区间内,避免 VRR 省电时段干扰)
|
|
1258
|
+
vsync_intervals AS (
|
|
1259
|
+
SELECT c.ts - LAG(c.ts) OVER (ORDER BY c.ts) as interval_ns
|
|
1260
|
+
FROM counter c
|
|
1261
|
+
JOIN counter_track t ON c.track_id = t.id
|
|
1262
|
+
WHERE t.name = 'VSYNC-sf'
|
|
1263
|
+
AND (${start_ts} IS NULL OR c.ts >= ${start_ts})
|
|
1264
|
+
AND (${end_ts} IS NULL OR c.ts < ${end_ts})
|
|
1265
|
+
),
|
|
1266
|
+
timing_config AS (
|
|
1267
|
+
SELECT CASE
|
|
1268
|
+
WHEN raw_ns BETWEEN 5500000 AND 6500000 THEN 6060606
|
|
1269
|
+
WHEN raw_ns BETWEEN 6500001 AND 7500000 THEN 6944444
|
|
1270
|
+
WHEN raw_ns BETWEEN 7500001 AND 9500000 THEN 8333333
|
|
1271
|
+
WHEN raw_ns BETWEEN 9500001 AND 12500000 THEN 11111111
|
|
1272
|
+
WHEN raw_ns BETWEEN 12500001 AND 20000000 THEN 16666667
|
|
1273
|
+
WHEN raw_ns BETWEEN 20000001 AND 35000000 THEN 33333333
|
|
1274
|
+
ELSE raw_ns
|
|
1275
|
+
END AS vsync_period_ns
|
|
1276
|
+
FROM (
|
|
1277
|
+
SELECT CAST(COALESCE(
|
|
1278
|
+
(SELECT PERCENTILE(interval_ns, 0.5)
|
|
1279
|
+
FROM vsync_intervals
|
|
1280
|
+
WHERE interval_ns > 5500000 AND interval_ns < 50000000),
|
|
1281
|
+
16666667
|
|
1282
|
+
) AS INTEGER) AS raw_ns
|
|
1283
|
+
)
|
|
1284
|
+
),
|
|
1285
|
+
-- Per-layer 帧序列:按 layer_name 分组,计算 token gap + 时间 gap
|
|
1286
|
+
layer_frames AS (
|
|
1287
|
+
SELECT
|
|
1288
|
+
a.display_frame_token,
|
|
1289
|
+
COALESCE(a.display_frame_token, a.surface_frame_token) as frame_token,
|
|
1290
|
+
a.ts,
|
|
1291
|
+
a.dur,
|
|
1292
|
+
a.upid,
|
|
1293
|
+
a.layer_name,
|
|
1294
|
+
a.jank_type,
|
|
1295
|
+
a.jank_severity_type,
|
|
1296
|
+
COALESCE(a.present_type, 'Unknown Present') as present_type,
|
|
1297
|
+
-- Per-layer token gap:SF 跳过了多少个 DisplayFrame 没有消费该 layer 的 buffer
|
|
1298
|
+
a.display_frame_token - LAG(a.display_frame_token)
|
|
1299
|
+
OVER (PARTITION BY a.layer_name ORDER BY a.display_frame_token) AS token_gap,
|
|
1300
|
+
-- 时间 gap(会话切分用)
|
|
1301
|
+
a.ts - LAG(a.ts + a.dur)
|
|
1302
|
+
OVER (PARTITION BY a.layer_name ORDER BY a.ts) AS time_gap_ns,
|
|
1303
|
+
-- present_ts(vsync_missed 严重度估算 + 报告展示用)
|
|
1304
|
+
a.ts + CASE WHEN a.dur > 0 THEN a.dur ELSE 0 END AS present_ts,
|
|
1305
|
+
LAG(a.ts + CASE WHEN a.dur > 0 THEN a.dur ELSE 0 END)
|
|
1306
|
+
OVER (PARTITION BY a.layer_name ORDER BY a.ts) AS prev_present_ts
|
|
1307
|
+
FROM actual_frame_timeline_slice a
|
|
1308
|
+
LEFT JOIN process p ON a.upid = p.upid
|
|
1309
|
+
WHERE (p.name GLOB '${package}*' OR '${package}' = '')
|
|
1310
|
+
AND p.name NOT LIKE '/system/%'
|
|
1311
|
+
AND (${start_ts} IS NULL OR a.ts >= ${start_ts})
|
|
1312
|
+
AND (${end_ts} IS NULL OR a.ts < ${end_ts})
|
|
1313
|
+
AND COALESCE(a.display_frame_token, a.surface_frame_token) IS NOT NULL
|
|
1314
|
+
),
|
|
1315
|
+
session_markers AS (
|
|
1316
|
+
SELECT
|
|
1317
|
+
*,
|
|
1318
|
+
CASE WHEN time_gap_ns IS NULL OR time_gap_ns > (SELECT vsync_period_ns * 6 FROM timing_config) THEN 1 ELSE 0 END as new_session
|
|
1319
|
+
FROM layer_frames
|
|
1320
|
+
),
|
|
1321
|
+
sessions_map AS (
|
|
1322
|
+
SELECT
|
|
1323
|
+
*,
|
|
1324
|
+
SUM(new_session) OVER (PARTITION BY layer_name ORDER BY ts) as session_id
|
|
1325
|
+
FROM session_markers
|
|
1326
|
+
),
|
|
1327
|
+
-- Per-layer 掉帧检测:双信号混合策略
|
|
1328
|
+
-- 非 BS 帧:present_type IN ('Late Present', 'Dropped Frame')
|
|
1329
|
+
-- BS 帧:间隔 > 1.5x vsync = 真实掉帧(被 BS 掩盖的卡顿)
|
|
1330
|
+
jank_frames AS (
|
|
1331
|
+
SELECT
|
|
1332
|
+
sm.frame_token as frame_id,
|
|
1333
|
+
sm.display_frame_token,
|
|
1334
|
+
sm.upid,
|
|
1335
|
+
sm.ts as actual_start,
|
|
1336
|
+
sm.ts + sm.dur as actual_end,
|
|
1337
|
+
sm.dur as actual_dur,
|
|
1338
|
+
sm.jank_type,
|
|
1339
|
+
sm.jank_severity_type,
|
|
1340
|
+
sm.layer_name,
|
|
1341
|
+
sm.session_id,
|
|
1342
|
+
-- token_gap 保留用于信息展示
|
|
1343
|
+
sm.token_gap,
|
|
1344
|
+
-- vsync_missed:用 present_ts 间隔估算严重度(辅助信号)
|
|
1345
|
+
CASE
|
|
1346
|
+
WHEN sm.prev_present_ts IS NOT NULL AND sm.present_ts - sm.prev_present_ts > tc.vsync_period_ns * 1.5
|
|
1347
|
+
THEN MAX(CAST(ROUND((sm.present_ts - sm.prev_present_ts) * 1.0 / tc.vsync_period_ns - 1, 0) AS INTEGER), 0)
|
|
1348
|
+
ELSE 1 -- at least 1 vsync missed if present_type is Late/Dropped
|
|
1349
|
+
END as vsync_missed,
|
|
1350
|
+
-- 责任归属
|
|
1351
|
+
CASE
|
|
1352
|
+
WHEN sm.jank_type IN ('Self Jank', 'App Deadline Missed') THEN 'APP'
|
|
1353
|
+
WHEN sm.jank_type GLOB '*SurfaceFlinger*' THEN 'SF'
|
|
1354
|
+
WHEN sm.jank_type = 'Buffer Stuffing' THEN 'BUFFER_STUFFING'
|
|
1355
|
+
WHEN sm.jank_type = 'None' OR sm.jank_type IS NULL THEN 'HIDDEN'
|
|
1356
|
+
ELSE 'UNKNOWN'
|
|
1357
|
+
END as jank_responsibility,
|
|
1358
|
+
-- 消费端呈现间隔(毫秒)— 报告展示用
|
|
1359
|
+
ROUND((sm.present_ts - COALESCE(sm.prev_present_ts, sm.present_ts)) / 1e6, 2) as present_interval_ms,
|
|
1360
|
+
-- 隐形掉帧标记
|
|
1361
|
+
CASE WHEN sm.jank_type = 'None' OR sm.jank_type IS NULL THEN 1 ELSE 0 END as is_hidden_jank
|
|
1362
|
+
FROM sessions_map sm
|
|
1363
|
+
CROSS JOIN timing_config tc
|
|
1364
|
+
WHERE (
|
|
1365
|
+
-- 非 BS:present_type 为权威信号
|
|
1366
|
+
(sm.present_type IN ('Late Present', 'Dropped Frame') AND sm.jank_type != 'Buffer Stuffing')
|
|
1367
|
+
OR
|
|
1368
|
+
-- BS + 异常间隔:真实掉帧被 BS 掩盖
|
|
1369
|
+
(sm.jank_type = 'Buffer Stuffing'
|
|
1370
|
+
AND sm.prev_present_ts IS NOT NULL
|
|
1371
|
+
AND (sm.present_ts - sm.prev_present_ts) > tc.vsync_period_ns * 1.5
|
|
1372
|
+
AND (sm.present_ts - sm.prev_present_ts) <= tc.vsync_period_ns * 6)
|
|
1373
|
+
)
|
|
1374
|
+
-- 排除会话间断帧
|
|
1375
|
+
AND (sm.time_gap_ns IS NULL OR sm.time_gap_ns <= tc.vsync_period_ns * 6)
|
|
1376
|
+
),
|
|
1377
|
+
-- Guilty frame 溯源:找到导致缓冲区枯竭的慢帧
|
|
1378
|
+
-- BlastBufferQueue 三缓冲下,可见卡顿发生在慢帧 2-3 帧之后
|
|
1379
|
+
guilty_frame_candidates AS (
|
|
1380
|
+
SELECT
|
|
1381
|
+
jf.frame_id AS starvation_frame_id,
|
|
1382
|
+
prev.display_frame_token AS candidate_id,
|
|
1383
|
+
prev.ts AS candidate_start,
|
|
1384
|
+
prev.dur AS candidate_dur,
|
|
1385
|
+
prev.jank_type AS candidate_jank_type,
|
|
1386
|
+
CASE WHEN prev.dur > tc.vsync_period_ns THEN 1 ELSE 0 END AS is_slow,
|
|
1387
|
+
ROUND((prev.dur - tc.vsync_period_ns) / 1e6, 2) AS over_budget_ms,
|
|
1388
|
+
ROW_NUMBER() OVER (
|
|
1389
|
+
PARTITION BY jf.frame_id
|
|
1390
|
+
ORDER BY prev.dur DESC
|
|
1391
|
+
) AS guilt_rank
|
|
1392
|
+
FROM jank_frames jf
|
|
1393
|
+
CROSS JOIN timing_config tc
|
|
1394
|
+
JOIN sessions_map prev
|
|
1395
|
+
ON prev.layer_name = jf.layer_name
|
|
1396
|
+
AND prev.session_id = jf.session_id
|
|
1397
|
+
AND prev.display_frame_token IS NOT NULL
|
|
1398
|
+
AND prev.display_frame_token >= jf.display_frame_token - 5
|
|
1399
|
+
AND prev.display_frame_token < jf.display_frame_token
|
|
1400
|
+
AND prev.dur > 0
|
|
1401
|
+
WHERE jf.display_frame_token IS NOT NULL
|
|
1402
|
+
),
|
|
1403
|
+
guilty_frames AS (
|
|
1404
|
+
SELECT
|
|
1405
|
+
starvation_frame_id,
|
|
1406
|
+
candidate_id AS guilty_frame_id,
|
|
1407
|
+
candidate_start AS guilty_start,
|
|
1408
|
+
candidate_dur AS guilty_dur,
|
|
1409
|
+
candidate_jank_type AS guilty_jank_type,
|
|
1410
|
+
over_budget_ms
|
|
1411
|
+
FROM guilty_frame_candidates
|
|
1412
|
+
WHERE guilt_rank = 1 AND is_slow = 1
|
|
1413
|
+
),
|
|
1414
|
+
frame_thread_info AS (
|
|
1415
|
+
SELECT
|
|
1416
|
+
jf.frame_id,
|
|
1417
|
+
jf.upid,
|
|
1418
|
+
jf.actual_start,
|
|
1419
|
+
jf.actual_end,
|
|
1420
|
+
jf.actual_dur,
|
|
1421
|
+
jf.jank_type,
|
|
1422
|
+
jf.jank_severity_type,
|
|
1423
|
+
jf.layer_name,
|
|
1424
|
+
jf.session_id,
|
|
1425
|
+
jf.token_gap,
|
|
1426
|
+
jf.vsync_missed,
|
|
1427
|
+
jf.jank_responsibility,
|
|
1428
|
+
jf.present_interval_ms,
|
|
1429
|
+
jf.is_hidden_jank,
|
|
1430
|
+
-- Guilty frame 信息
|
|
1431
|
+
gf.guilty_frame_id,
|
|
1432
|
+
gf.guilty_dur,
|
|
1433
|
+
gf.over_budget_ms,
|
|
1434
|
+
-- 生产线程时间范围(动态检测,不依赖硬编码线程名)
|
|
1435
|
+
(SELECT MIN(s.ts) FROM slice s
|
|
1436
|
+
JOIN thread_track tt ON s.track_id = tt.id
|
|
1437
|
+
JOIN thread t ON tt.utid = t.utid
|
|
1438
|
+
WHERE t.upid = jf.upid
|
|
1439
|
+
AND t.name NOT LIKE 'Binder:%'
|
|
1440
|
+
AND s.ts >= jf.actual_start - 5000000
|
|
1441
|
+
AND s.ts <= jf.actual_end
|
|
1442
|
+
AND (s.name LIKE 'Choreographer#doFrame%' OR s.name LIKE 'Framework::BeginFrame%'
|
|
1443
|
+
OR s.name LIKE 'DrawFrame%' OR s.name LIKE 'PlayerLoop%'
|
|
1444
|
+
OR s.dur > 2000000)
|
|
1445
|
+
) as main_start_ts,
|
|
1446
|
+
(SELECT MAX(s.ts + s.dur) FROM slice s
|
|
1447
|
+
JOIN thread_track tt ON s.track_id = tt.id
|
|
1448
|
+
JOIN thread t ON tt.utid = t.utid
|
|
1449
|
+
WHERE t.upid = jf.upid
|
|
1450
|
+
AND t.name NOT LIKE 'Binder:%'
|
|
1451
|
+
AND s.ts >= jf.actual_start - 5000000
|
|
1452
|
+
AND s.ts <= jf.actual_end
|
|
1453
|
+
) as main_end_ts,
|
|
1454
|
+
(SELECT MIN(s.ts) FROM slice s
|
|
1455
|
+
JOIN thread_track tt ON s.track_id = tt.id
|
|
1456
|
+
JOIN thread t ON tt.utid = t.utid
|
|
1457
|
+
JOIN process p ON t.upid = p.upid
|
|
1458
|
+
WHERE t.upid = jf.upid
|
|
1459
|
+
AND t.tid != p.pid
|
|
1460
|
+
AND t.name NOT LIKE 'Binder:%'
|
|
1461
|
+
AND s.ts >= jf.actual_start
|
|
1462
|
+
AND s.ts <= jf.actual_end
|
|
1463
|
+
AND s.dur > 1000000
|
|
1464
|
+
) as render_start_ts,
|
|
1465
|
+
(SELECT MAX(s.ts + s.dur) FROM slice s
|
|
1466
|
+
JOIN thread_track tt ON s.track_id = tt.id
|
|
1467
|
+
JOIN thread t ON tt.utid = t.utid
|
|
1468
|
+
JOIN process p ON t.upid = p.upid
|
|
1469
|
+
WHERE t.upid = jf.upid
|
|
1470
|
+
AND t.tid != p.pid
|
|
1471
|
+
AND t.name NOT LIKE 'Binder:%'
|
|
1472
|
+
AND s.ts >= jf.actual_start
|
|
1473
|
+
AND s.ts <= jf.actual_end
|
|
1474
|
+
) as render_end_ts
|
|
1475
|
+
FROM jank_frames jf
|
|
1476
|
+
LEFT JOIN guilty_frames gf ON gf.starvation_frame_id = jf.frame_id
|
|
1477
|
+
)
|
|
1478
|
+
,
|
|
1479
|
+
ranked_frames AS (
|
|
1480
|
+
SELECT
|
|
1481
|
+
fti.frame_id,
|
|
1482
|
+
fti.actual_start,
|
|
1483
|
+
fti.actual_end,
|
|
1484
|
+
fti.main_start_ts,
|
|
1485
|
+
fti.main_end_ts,
|
|
1486
|
+
fti.render_start_ts,
|
|
1487
|
+
fti.render_end_ts,
|
|
1488
|
+
fti.actual_dur,
|
|
1489
|
+
fti.jank_type,
|
|
1490
|
+
fti.jank_severity_type,
|
|
1491
|
+
fti.layer_name,
|
|
1492
|
+
fti.session_id,
|
|
1493
|
+
fti.token_gap,
|
|
1494
|
+
fti.vsync_missed,
|
|
1495
|
+
fti.jank_responsibility,
|
|
1496
|
+
fti.present_interval_ms,
|
|
1497
|
+
p.name as process_name,
|
|
1498
|
+
p.pid,
|
|
1499
|
+
p.upid,
|
|
1500
|
+
fti.is_hidden_jank,
|
|
1501
|
+
-- Guilty frame 信息
|
|
1502
|
+
fti.guilty_frame_id,
|
|
1503
|
+
fti.guilty_dur,
|
|
1504
|
+
fti.over_budget_ms,
|
|
1505
|
+
-- 前序帧信息(用于掉帧原因诊断)
|
|
1506
|
+
LAG(fti.actual_dur) OVER (PARTITION BY fti.session_id ORDER BY fti.actual_start) as prev_frame_dur,
|
|
1507
|
+
LAG(fti.jank_type) OVER (PARTITION BY fti.session_id ORDER BY fti.actual_start) as prev_frame_jank_type,
|
|
1508
|
+
-- 按 vsync_missed 排序(最严重的掉帧优先)
|
|
1509
|
+
ROW_NUMBER() OVER (PARTITION BY fti.session_id ORDER BY fti.vsync_missed DESC, fti.actual_dur DESC) as rank_in_session
|
|
1510
|
+
FROM frame_thread_info fti
|
|
1511
|
+
JOIN process p ON fti.upid = p.upid
|
|
1512
|
+
WHERE (p.name GLOB '${package}*' OR '${package}' = '')
|
|
1513
|
+
AND p.name NOT LIKE '/system/%'
|
|
1514
|
+
)
|
|
1515
|
+
SELECT
|
|
1516
|
+
printf('%d', frame_id) as frame_id,
|
|
1517
|
+
printf('%d', actual_start) as start_ts,
|
|
1518
|
+
printf('%d', actual_end) as end_ts,
|
|
1519
|
+
printf('%d', COALESCE(main_start_ts, actual_start)) as main_start_ts,
|
|
1520
|
+
printf('%d', COALESCE(main_end_ts, actual_end)) as main_end_ts,
|
|
1521
|
+
COALESCE(main_end_ts - main_start_ts, 0) as main_dur,
|
|
1522
|
+
ROUND(COALESCE(main_end_ts - main_start_ts, 0) / 1e6, 2) as main_dur_ms,
|
|
1523
|
+
printf('%d', COALESCE(render_start_ts, actual_start)) as render_start_ts,
|
|
1524
|
+
printf('%d', COALESCE(render_end_ts, actual_end)) as render_end_ts,
|
|
1525
|
+
COALESCE(render_end_ts - render_start_ts, 0) as render_dur,
|
|
1526
|
+
ROUND(COALESCE(render_end_ts - render_start_ts, 0) / 1e6, 2) as render_dur_ms,
|
|
1527
|
+
printf('%d', actual_dur) as dur,
|
|
1528
|
+
ROUND(actual_dur / 1e6, 2) as dur_ms,
|
|
1529
|
+
jank_type,
|
|
1530
|
+
jank_severity_type,
|
|
1531
|
+
layer_name,
|
|
1532
|
+
process_name,
|
|
1533
|
+
pid,
|
|
1534
|
+
session_id,
|
|
1535
|
+
token_gap,
|
|
1536
|
+
vsync_missed,
|
|
1537
|
+
present_interval_ms,
|
|
1538
|
+
jank_responsibility,
|
|
1539
|
+
-- Guilty frame 信息
|
|
1540
|
+
CASE WHEN guilty_frame_id IS NOT NULL THEN printf('%d', guilty_frame_id) END as guilty_frame_id,
|
|
1541
|
+
CASE WHEN guilty_dur IS NOT NULL THEN ROUND(guilty_dur / 1e6, 2) END as guilty_dur_ms,
|
|
1542
|
+
over_budget_ms,
|
|
1543
|
+
-- 掉帧原因说明
|
|
1544
|
+
CASE
|
|
1545
|
+
-- 管线耗尽:guilty frame 导致缓冲区枯竭
|
|
1546
|
+
WHEN guilty_frame_id IS NOT NULL THEN
|
|
1547
|
+
'管线耗尽 — 帧 ' || guilty_frame_id || ' 耗时 '
|
|
1548
|
+
|| ROUND(guilty_dur / 1e6, 2) || 'ms(超出预算 '
|
|
1549
|
+
|| over_budget_ms || 'ms),导致后续 ' || vsync_missed || ' 帧缓冲区枯竭'
|
|
1550
|
+
-- 隐形掉帧:框架标记 None 但 token gap 检测到掉帧
|
|
1551
|
+
WHEN jank_responsibility = 'HIDDEN' THEN
|
|
1552
|
+
'缓冲区枯竭 — 框架未标记(Perfetto 时间线帧颜色为绿色),'
|
|
1553
|
+
|| '但该 Layer 跳过 ' || vsync_missed || ' 个 DisplayFrame 无新 buffer'
|
|
1554
|
+
-- App Self Jank
|
|
1555
|
+
WHEN jank_type = 'Self Jank' THEN
|
|
1556
|
+
'App 自身处理超时(' || ROUND(actual_dur / 1e6, 2) || 'ms),跳过 ' || vsync_missed || ' 帧'
|
|
1557
|
+
-- App Deadline Missed
|
|
1558
|
+
WHEN jank_type = 'App Deadline Missed' THEN
|
|
1559
|
+
'App 未在 VSync deadline 前完成渲染(' || ROUND(actual_dur / 1e6, 2) || 'ms),跳过 ' || vsync_missed || ' 帧'
|
|
1560
|
+
-- SurfaceFlinger 问题
|
|
1561
|
+
WHEN jank_responsibility = 'SF' THEN
|
|
1562
|
+
'SurfaceFlinger 合成延迟(' || jank_type || '),App 已按时交付 buffer'
|
|
1563
|
+
-- Buffer Stuffing
|
|
1564
|
+
WHEN jank_responsibility = 'BUFFER_STUFFING' THEN
|
|
1565
|
+
'帧耗时 ' || ROUND(actual_dur / 1e6, 2) || 'ms,BufferQueue 阻塞(Buffer Stuffing),延迟 ' || vsync_missed || ' 个 VSync'
|
|
1566
|
+
-- App side
|
|
1567
|
+
WHEN jank_responsibility = 'APP' THEN
|
|
1568
|
+
'App 超时(' || ROUND(actual_dur / 1e6, 2) || 'ms),跳过 ' || vsync_missed || ' 帧'
|
|
1569
|
+
ELSE
|
|
1570
|
+
COALESCE(jank_type, '未知') || ',跳过 ' || vsync_missed || ' 帧'
|
|
1571
|
+
END as jank_cause,
|
|
1572
|
+
is_hidden_jank,
|
|
1573
|
+
ROW_NUMBER() OVER (ORDER BY session_id, actual_start) as frame_index
|
|
1574
|
+
FROM ranked_frames
|
|
1575
|
+
WHERE rank_in_session <= CASE
|
|
1576
|
+
WHEN ${max_frames_per_session} IS NULL THEN 200
|
|
1577
|
+
WHEN CAST(${max_frames_per_session} AS INTEGER) <= 0 THEN 200
|
|
1578
|
+
ELSE CAST(${max_frames_per_session} AS INTEGER)
|
|
1579
|
+
END
|
|
1580
|
+
ORDER BY session_id, actual_start
|
|
1581
|
+
save_as: app_jank_frames
|
|
1582
|
+
condition: "frame_timeline.data[0]?.has_frame_timeline === 1 && environment?.data?.[0]?.has_data === 1 && ((perf_summary?.data?.[0]?.janky_frames || 0) > 0 || (jank_stats?.data?.[0]?.real_jank_count || 0) > 0)"
|
|
1583
|
+
|
|
1584
|
+
# ==========================================================================
|
|
1585
|
+
# L3-batch: 批量帧根因分类 (所有掉帧帧 → 单次 SQL 根因决策树)
|
|
1586
|
+
# 目的:一次性分析所有掉帧帧的完整指标和根因分类
|
|
1587
|
+
# 输出:四象限(MainThread+RenderThread) + CPU频率 + Binder/GC重叠 + 根因分类
|
|
1588
|
+
# jank_frame_detail 仅用于可选补充深钻(CPU freq timeline + top slices 详情)
|
|
1589
|
+
# ==========================================================================
|
|
1590
|
+
- id: batch_frame_root_cause
|
|
1591
|
+
type: atomic
|
|
1592
|
+
name: "掉帧列表(含根因分类)"
|
|
1593
|
+
optional: true
|
|
1594
|
+
synthesize:
|
|
1595
|
+
role: list
|
|
1596
|
+
groupBy:
|
|
1597
|
+
- field: jank_responsibility
|
|
1598
|
+
title: 责任归属分布
|
|
1599
|
+
- field: reason_code
|
|
1600
|
+
title: 根因分类分布
|
|
1601
|
+
display:
|
|
1602
|
+
level: detail
|
|
1603
|
+
layer: list
|
|
1604
|
+
title: "掉帧列表"
|
|
1605
|
+
expandable: true
|
|
1606
|
+
expandableBindSource: batch_root_cause # 自绑定:展开行显示 hidden 列的详细诊断数据
|
|
1607
|
+
collapsible: true
|
|
1608
|
+
defaultCollapsed: true
|
|
1609
|
+
metadataFields:
|
|
1610
|
+
- process_name
|
|
1611
|
+
- pid
|
|
1612
|
+
columns:
|
|
1613
|
+
- name: frame_id
|
|
1614
|
+
label: "帧 ID"
|
|
1615
|
+
type: string
|
|
1616
|
+
- name: frame_index
|
|
1617
|
+
label: "帧序号"
|
|
1618
|
+
type: number
|
|
1619
|
+
hidden: true
|
|
1620
|
+
- name: start_ts
|
|
1621
|
+
label: "开始时间"
|
|
1622
|
+
type: timestamp
|
|
1623
|
+
unit: ns
|
|
1624
|
+
clickAction: navigate_range
|
|
1625
|
+
durationColumn: dur
|
|
1626
|
+
- name: dur
|
|
1627
|
+
label: "帧耗时(ns)"
|
|
1628
|
+
type: duration
|
|
1629
|
+
unit: ns
|
|
1630
|
+
hidden: true
|
|
1631
|
+
- name: dur_ms
|
|
1632
|
+
label: "帧耗时"
|
|
1633
|
+
type: duration
|
|
1634
|
+
format: duration_ms
|
|
1635
|
+
- name: jank_type
|
|
1636
|
+
label: "掉帧类型"
|
|
1637
|
+
type: string
|
|
1638
|
+
- name: vsync_missed
|
|
1639
|
+
label: "跳帧数"
|
|
1640
|
+
type: number
|
|
1641
|
+
- name: present_interval_ms
|
|
1642
|
+
label: "呈现间隔(ms)"
|
|
1643
|
+
type: duration
|
|
1644
|
+
format: duration_ms
|
|
1645
|
+
unit: ms
|
|
1646
|
+
- name: jank_responsibility
|
|
1647
|
+
label: "责任归属"
|
|
1648
|
+
type: string
|
|
1649
|
+
- name: reason_code
|
|
1650
|
+
label: "根因分类"
|
|
1651
|
+
type: string
|
|
1652
|
+
- name: primary_cause
|
|
1653
|
+
label: "主要原因"
|
|
1654
|
+
type: string
|
|
1655
|
+
- name: confidence
|
|
1656
|
+
label: "置信度"
|
|
1657
|
+
type: string
|
|
1658
|
+
- name: top_slice_name
|
|
1659
|
+
label: "关键操作"
|
|
1660
|
+
type: string
|
|
1661
|
+
- name: top_slice_ms
|
|
1662
|
+
label: "操作耗时"
|
|
1663
|
+
type: duration
|
|
1664
|
+
format: duration_ms
|
|
1665
|
+
- name: main_q1_pct
|
|
1666
|
+
label: "Q1 大核运行%"
|
|
1667
|
+
type: percentage
|
|
1668
|
+
format: percentage
|
|
1669
|
+
hidden: true
|
|
1670
|
+
- name: main_q2_pct
|
|
1671
|
+
label: "Q2 小核运行%"
|
|
1672
|
+
type: percentage
|
|
1673
|
+
format: percentage
|
|
1674
|
+
hidden: true
|
|
1675
|
+
- name: main_q3_pct
|
|
1676
|
+
label: "Q3 调度等待%"
|
|
1677
|
+
type: percentage
|
|
1678
|
+
format: percentage
|
|
1679
|
+
hidden: true
|
|
1680
|
+
- name: main_q4a_pct
|
|
1681
|
+
label: "Q4a IO阻塞%"
|
|
1682
|
+
type: percentage
|
|
1683
|
+
format: percentage
|
|
1684
|
+
hidden: true
|
|
1685
|
+
- name: main_q4b_pct
|
|
1686
|
+
label: "Q4b 锁/等待%"
|
|
1687
|
+
type: percentage
|
|
1688
|
+
format: percentage
|
|
1689
|
+
hidden: true
|
|
1690
|
+
- name: render_q1_pct
|
|
1691
|
+
label: "RT Q1 大核%"
|
|
1692
|
+
type: percentage
|
|
1693
|
+
format: percentage
|
|
1694
|
+
hidden: true
|
|
1695
|
+
- name: render_q2_pct
|
|
1696
|
+
label: "RT Q2 小核%"
|
|
1697
|
+
type: percentage
|
|
1698
|
+
format: percentage
|
|
1699
|
+
hidden: true
|
|
1700
|
+
- name: render_q3_pct
|
|
1701
|
+
label: "RT Q3 调度%"
|
|
1702
|
+
type: percentage
|
|
1703
|
+
format: percentage
|
|
1704
|
+
hidden: true
|
|
1705
|
+
- name: render_q4a_pct
|
|
1706
|
+
label: "RT Q4a IO阻塞%"
|
|
1707
|
+
type: percentage
|
|
1708
|
+
format: percentage
|
|
1709
|
+
hidden: true
|
|
1710
|
+
- name: render_q4b_pct
|
|
1711
|
+
label: "RT Q4b 锁/等待%"
|
|
1712
|
+
type: percentage
|
|
1713
|
+
format: percentage
|
|
1714
|
+
hidden: true
|
|
1715
|
+
- name: big_avg_freq_mhz
|
|
1716
|
+
label: "大核均频"
|
|
1717
|
+
type: number
|
|
1718
|
+
hidden: true
|
|
1719
|
+
- name: big_max_freq_mhz
|
|
1720
|
+
label: "大核峰频"
|
|
1721
|
+
type: number
|
|
1722
|
+
hidden: true
|
|
1723
|
+
- name: ramp_ms
|
|
1724
|
+
label: "升频延迟"
|
|
1725
|
+
type: duration
|
|
1726
|
+
format: duration_ms
|
|
1727
|
+
hidden: true
|
|
1728
|
+
- name: top_slice_little_pct
|
|
1729
|
+
label: "小核占比%"
|
|
1730
|
+
type: percentage
|
|
1731
|
+
format: percentage
|
|
1732
|
+
hidden: true
|
|
1733
|
+
- name: top_slice_big_pct
|
|
1734
|
+
label: "大核占比%"
|
|
1735
|
+
type: percentage
|
|
1736
|
+
format: percentage
|
|
1737
|
+
hidden: true
|
|
1738
|
+
- name: top_slice_runnable_pct
|
|
1739
|
+
label: "Runnable占比%"
|
|
1740
|
+
type: percentage
|
|
1741
|
+
format: percentage
|
|
1742
|
+
hidden: true
|
|
1743
|
+
- name: gpu_fence_ms
|
|
1744
|
+
label: "GPU Fence最长"
|
|
1745
|
+
type: duration
|
|
1746
|
+
format: duration_ms
|
|
1747
|
+
hidden: true
|
|
1748
|
+
- name: gpu_fence_total_ms
|
|
1749
|
+
label: "GPU Fence总计"
|
|
1750
|
+
type: duration
|
|
1751
|
+
format: duration_ms
|
|
1752
|
+
hidden: true
|
|
1753
|
+
- name: shader_count
|
|
1754
|
+
label: "Shader编译次数"
|
|
1755
|
+
type: number
|
|
1756
|
+
hidden: true
|
|
1757
|
+
- name: shader_ms
|
|
1758
|
+
label: "Shader编译耗时"
|
|
1759
|
+
type: duration
|
|
1760
|
+
format: duration_ms
|
|
1761
|
+
hidden: true
|
|
1762
|
+
- name: binder_overlap_ms
|
|
1763
|
+
label: "Binder重叠"
|
|
1764
|
+
type: duration
|
|
1765
|
+
format: duration_ms
|
|
1766
|
+
hidden: true
|
|
1767
|
+
- name: gc_overlap_ms
|
|
1768
|
+
label: "GC重叠"
|
|
1769
|
+
type: duration
|
|
1770
|
+
format: duration_ms
|
|
1771
|
+
hidden: true
|
|
1772
|
+
- name: gc_count
|
|
1773
|
+
label: "GC次数"
|
|
1774
|
+
type: number
|
|
1775
|
+
hidden: true
|
|
1776
|
+
- name: frame_budget_ms
|
|
1777
|
+
label: "帧预算"
|
|
1778
|
+
type: duration
|
|
1779
|
+
format: duration_ms
|
|
1780
|
+
hidden: true
|
|
1781
|
+
- name: device_peak_freq_mhz
|
|
1782
|
+
label: "设备峰值频率"
|
|
1783
|
+
type: number
|
|
1784
|
+
hidden: true
|
|
1785
|
+
- name: file_io_overlap_ms
|
|
1786
|
+
label: "文件IO重叠"
|
|
1787
|
+
type: duration
|
|
1788
|
+
format: duration_ms
|
|
1789
|
+
hidden: true
|
|
1790
|
+
- name: cpu_freq_clusters_json
|
|
1791
|
+
label: "CPU频率详情"
|
|
1792
|
+
type: string
|
|
1793
|
+
hidden: true
|
|
1794
|
+
- name: freq_timeline_json
|
|
1795
|
+
label: "频率变化时间线"
|
|
1796
|
+
type: string
|
|
1797
|
+
hidden: true
|
|
1798
|
+
- name: main_slices_json
|
|
1799
|
+
label: "主线程耗时操作"
|
|
1800
|
+
type: string
|
|
1801
|
+
hidden: true
|
|
1802
|
+
- name: render_slices_json
|
|
1803
|
+
label: "渲染线程耗时操作"
|
|
1804
|
+
type: string
|
|
1805
|
+
hidden: true
|
|
1806
|
+
- name: binder_calls_json
|
|
1807
|
+
label: "Binder调用"
|
|
1808
|
+
type: string
|
|
1809
|
+
hidden: true
|
|
1810
|
+
- name: gc_events_json
|
|
1811
|
+
label: "GC事件"
|
|
1812
|
+
type: string
|
|
1813
|
+
hidden: true
|
|
1814
|
+
- name: lock_contention_json
|
|
1815
|
+
label: "锁竞争"
|
|
1816
|
+
type: string
|
|
1817
|
+
hidden: true
|
|
1818
|
+
sql: |
|
|
1819
|
+
-- 批量帧根因分类:对所有消费端真实掉帧执行简化版根因决策树
|
|
1820
|
+
-- 与 jank_frame_detail 的 root_cause_summary 使用相同优先级 CASE 树
|
|
1821
|
+
-- 区别:jank_frame_detail 是单帧深钻,此步骤是全帧一次性分类
|
|
1822
|
+
WITH
|
|
1823
|
+
-- ========== 1. VSync 配置 ==========
|
|
1824
|
+
vsync_intervals AS (
|
|
1825
|
+
SELECT c.ts - LAG(c.ts) OVER (ORDER BY c.ts) as interval_ns
|
|
1826
|
+
FROM counter c
|
|
1827
|
+
JOIN counter_track t ON c.track_id = t.id
|
|
1828
|
+
WHERE t.name = 'VSYNC-sf'
|
|
1829
|
+
AND (${start_ts} IS NULL OR c.ts >= ${start_ts})
|
|
1830
|
+
AND (${end_ts} IS NULL OR c.ts < ${end_ts})
|
|
1831
|
+
),
|
|
1832
|
+
timing_config AS (
|
|
1833
|
+
SELECT
|
|
1834
|
+
vsync_period_ns,
|
|
1835
|
+
ROUND(vsync_period_ns / 1e6, 2) as frame_budget_ms,
|
|
1836
|
+
ROUND(vsync_period_ns / 1e6 * 0.50, 2) as slice_critical_ms,
|
|
1837
|
+
ROUND(MAX(vsync_period_ns / 1e6 * 0.35, 2.0), 2) as freq_ramp_critical_ms,
|
|
1838
|
+
ROUND(MAX(vsync_period_ns / 1e6 * 0.18, 1.5), 2) as binder_overlap_critical_ms
|
|
1839
|
+
FROM (
|
|
1840
|
+
SELECT CASE
|
|
1841
|
+
WHEN raw_ns BETWEEN 5500000 AND 6500000 THEN 6060606
|
|
1842
|
+
WHEN raw_ns BETWEEN 6500001 AND 7500000 THEN 6944444
|
|
1843
|
+
WHEN raw_ns BETWEEN 7500001 AND 9500000 THEN 8333333
|
|
1844
|
+
WHEN raw_ns BETWEEN 9500001 AND 12500000 THEN 11111111
|
|
1845
|
+
WHEN raw_ns BETWEEN 12500001 AND 20000000 THEN 16666667
|
|
1846
|
+
WHEN raw_ns BETWEEN 20000001 AND 35000000 THEN 33333333
|
|
1847
|
+
ELSE raw_ns
|
|
1848
|
+
END AS vsync_period_ns
|
|
1849
|
+
FROM (
|
|
1850
|
+
SELECT CAST(COALESCE(
|
|
1851
|
+
(SELECT PERCENTILE(interval_ns, 0.5)
|
|
1852
|
+
FROM vsync_intervals
|
|
1853
|
+
WHERE interval_ns > 5500000 AND interval_ns < 50000000),
|
|
1854
|
+
16666667
|
|
1855
|
+
) AS INTEGER) AS raw_ns
|
|
1856
|
+
)
|
|
1857
|
+
)
|
|
1858
|
+
),
|
|
1859
|
+
-- ========== 1b. 设备峰值频率(全 trace 大核最高频率,用于温控/限频检测)==========
|
|
1860
|
+
-- 不加 start_ts/end_ts 过滤 — 求设备硬件频率上限
|
|
1861
|
+
-- 用 MAX — P95 会被大量空闲低频样本主导(CPU 大部分时间低频运行)
|
|
1862
|
+
-- 优先级已从 P0.6 下调到 P4.5,配合 60% 阈值足以防止误判
|
|
1863
|
+
device_peak_freq AS (
|
|
1864
|
+
SELECT COALESCE(ROUND(MAX(c.value) / 1000, 0), 0) as device_peak_freq_mhz
|
|
1865
|
+
FROM counter c
|
|
1866
|
+
JOIN cpu_counter_track cct ON c.track_id = cct.id AND cct.name = 'cpufreq'
|
|
1867
|
+
LEFT JOIN _cpu_topology ct ON cct.cpu = ct.cpu_id
|
|
1868
|
+
WHERE ct.core_type IN ('prime', 'big')
|
|
1869
|
+
),
|
|
1870
|
+
-- ========== 2. Per-layer 帧序列 + 双信号混合掉帧检测(与 get_app_jank_frames 一致)==========
|
|
1871
|
+
layer_frames AS (
|
|
1872
|
+
SELECT
|
|
1873
|
+
COALESCE(a.display_frame_token, a.surface_frame_token) as display_frame_token,
|
|
1874
|
+
a.ts as frame_start,
|
|
1875
|
+
a.ts + a.dur as frame_end,
|
|
1876
|
+
a.dur as frame_dur,
|
|
1877
|
+
a.jank_type,
|
|
1878
|
+
COALESCE(a.present_type, 'Unknown Present') as present_type,
|
|
1879
|
+
a.upid,
|
|
1880
|
+
a.layer_name,
|
|
1881
|
+
COALESCE(a.display_frame_token, a.surface_frame_token) - LAG(COALESCE(a.display_frame_token, a.surface_frame_token))
|
|
1882
|
+
OVER (PARTITION BY a.layer_name ORDER BY COALESCE(a.display_frame_token, a.surface_frame_token)) AS token_gap,
|
|
1883
|
+
a.ts - LAG(a.ts + a.dur)
|
|
1884
|
+
OVER (PARTITION BY a.layer_name ORDER BY a.ts) AS time_gap_ns,
|
|
1885
|
+
a.ts + CASE WHEN a.dur > 0 THEN a.dur ELSE 0 END AS present_ts,
|
|
1886
|
+
LAG(a.ts + CASE WHEN a.dur > 0 THEN a.dur ELSE 0 END)
|
|
1887
|
+
OVER (PARTITION BY a.layer_name ORDER BY a.ts) AS prev_present_ts
|
|
1888
|
+
FROM actual_frame_timeline_slice a
|
|
1889
|
+
LEFT JOIN process p ON a.upid = p.upid
|
|
1890
|
+
WHERE (p.name GLOB '${package}*' OR '${package}' = '')
|
|
1891
|
+
AND p.name NOT LIKE '/system/%'
|
|
1892
|
+
AND (${start_ts} IS NULL OR a.ts >= ${start_ts})
|
|
1893
|
+
AND (${end_ts} IS NULL OR a.ts < ${end_ts})
|
|
1894
|
+
AND COALESCE(a.display_frame_token, a.surface_frame_token) IS NOT NULL
|
|
1895
|
+
),
|
|
1896
|
+
session_markers AS (
|
|
1897
|
+
SELECT *,
|
|
1898
|
+
CASE WHEN time_gap_ns IS NULL OR time_gap_ns > (SELECT vsync_period_ns * 6 FROM timing_config) THEN 1 ELSE 0 END as new_session
|
|
1899
|
+
FROM layer_frames
|
|
1900
|
+
),
|
|
1901
|
+
sessions_map AS (
|
|
1902
|
+
SELECT *,
|
|
1903
|
+
SUM(new_session) OVER (PARTITION BY layer_name ORDER BY frame_start) as session_id
|
|
1904
|
+
FROM session_markers
|
|
1905
|
+
),
|
|
1906
|
+
-- 掉帧检测:双信号混合策略(与 jank_frames 保持一致)
|
|
1907
|
+
all_jank_frames AS (
|
|
1908
|
+
SELECT
|
|
1909
|
+
sm.display_frame_token,
|
|
1910
|
+
sm.frame_start,
|
|
1911
|
+
sm.frame_end,
|
|
1912
|
+
sm.frame_dur,
|
|
1913
|
+
sm.jank_type,
|
|
1914
|
+
sm.upid,
|
|
1915
|
+
sm.session_id,
|
|
1916
|
+
p.pid,
|
|
1917
|
+
p.name as process_name,
|
|
1918
|
+
ROUND(sm.frame_dur / 1e6, 2) as dur_ms,
|
|
1919
|
+
CASE
|
|
1920
|
+
WHEN sm.jank_type IN ('Self Jank', 'App Deadline Missed') THEN 'APP'
|
|
1921
|
+
WHEN sm.jank_type GLOB '*SurfaceFlinger*' THEN 'SF'
|
|
1922
|
+
WHEN sm.jank_type = 'Buffer Stuffing' THEN 'BUFFER_STUFFING'
|
|
1923
|
+
WHEN sm.jank_type = 'None' OR sm.jank_type IS NULL THEN 'HIDDEN'
|
|
1924
|
+
ELSE 'UNKNOWN'
|
|
1925
|
+
END as jank_responsibility,
|
|
1926
|
+
CASE
|
|
1927
|
+
WHEN sm.prev_present_ts IS NOT NULL AND sm.present_ts - sm.prev_present_ts > tc.vsync_period_ns * 1.5
|
|
1928
|
+
THEN MAX(CAST(ROUND((sm.present_ts - sm.prev_present_ts) * 1.0 / tc.vsync_period_ns - 1, 0) AS INTEGER), 0)
|
|
1929
|
+
ELSE 1 -- at least 1 vsync missed if present_type is Late/Dropped
|
|
1930
|
+
END as vsync_missed,
|
|
1931
|
+
CASE
|
|
1932
|
+
WHEN sm.prev_present_ts IS NOT NULL
|
|
1933
|
+
THEN ROUND((sm.present_ts - sm.prev_present_ts) / 1e6, 2)
|
|
1934
|
+
ELSE NULL
|
|
1935
|
+
END as present_interval_ms
|
|
1936
|
+
FROM sessions_map sm
|
|
1937
|
+
CROSS JOIN timing_config tc
|
|
1938
|
+
JOIN process p ON sm.upid = p.upid
|
|
1939
|
+
WHERE (
|
|
1940
|
+
-- 非 BS:present_type 为权威信号
|
|
1941
|
+
(sm.present_type IN ('Late Present', 'Dropped Frame') AND (sm.jank_type IS NULL OR sm.jank_type != 'Buffer Stuffing'))
|
|
1942
|
+
OR
|
|
1943
|
+
-- BS + 异常间隔:真实掉帧被 BS 掩盖
|
|
1944
|
+
(sm.jank_type = 'Buffer Stuffing'
|
|
1945
|
+
AND sm.prev_present_ts IS NOT NULL
|
|
1946
|
+
AND (sm.present_ts - sm.prev_present_ts) > tc.vsync_period_ns * 1.5
|
|
1947
|
+
AND (sm.present_ts - sm.prev_present_ts) <= tc.vsync_period_ns * 6)
|
|
1948
|
+
)
|
|
1949
|
+
-- 排除会话间断帧
|
|
1950
|
+
AND (sm.time_gap_ns IS NULL OR sm.time_gap_ns <= tc.vsync_period_ns * 6)
|
|
1951
|
+
),
|
|
1952
|
+
-- 按严重度排序(与 get_app_jank_frames 完全一致的 rank_in_session 逻辑)
|
|
1953
|
+
ranked_jank_frames AS (
|
|
1954
|
+
SELECT *,
|
|
1955
|
+
ROW_NUMBER() OVER (PARTITION BY session_id ORDER BY vsync_missed DESC, frame_dur DESC) as rank_in_session
|
|
1956
|
+
FROM all_jank_frames
|
|
1957
|
+
),
|
|
1958
|
+
-- 截断后重新编号(与 get_app_jank_frames 的 frame_index 完全对齐)
|
|
1959
|
+
jank_frame_list AS (
|
|
1960
|
+
SELECT
|
|
1961
|
+
display_frame_token, frame_start, frame_end, frame_dur, jank_type, upid, session_id,
|
|
1962
|
+
pid, process_name, dur_ms, jank_responsibility, vsync_missed, present_interval_ms,
|
|
1963
|
+
ROW_NUMBER() OVER (ORDER BY session_id, frame_start) as frame_index
|
|
1964
|
+
FROM ranked_jank_frames
|
|
1965
|
+
WHERE rank_in_session <= CASE
|
|
1966
|
+
WHEN ${max_frames_per_session} IS NULL THEN 200
|
|
1967
|
+
WHEN CAST(${max_frames_per_session} AS INTEGER) <= 0 THEN 200
|
|
1968
|
+
ELSE CAST(${max_frames_per_session} AS INTEGER)
|
|
1969
|
+
END
|
|
1970
|
+
),
|
|
1971
|
+
-- ========== 3. Explicit role-based thread identification ==========
|
|
1972
|
+
-- Main thread: t.tid = p.pid (standard Android) OR t.name GLOB '*.ui' (Flutter)
|
|
1973
|
+
-- RenderThread: t.name = 'RenderThread' (standard Android) OR t.name GLOB '*.raster' (Flutter)
|
|
1974
|
+
-- Aligned with the jank_frame_detail.skill.yaml proven approach.
|
|
1975
|
+
per_frame_thread_roles AS (
|
|
1976
|
+
SELECT
|
|
1977
|
+
fl.frame_start,
|
|
1978
|
+
t.utid,
|
|
1979
|
+
t.tid,
|
|
1980
|
+
t.name as thread_name,
|
|
1981
|
+
CASE
|
|
1982
|
+
WHEN t.tid = p.pid THEN 'main'
|
|
1983
|
+
WHEN t.name GLOB '[0-9]*.ui' THEN 'main'
|
|
1984
|
+
WHEN t.name = 'RenderThread' THEN 'render'
|
|
1985
|
+
WHEN t.name GLOB '[0-9]*.raster' THEN 'render'
|
|
1986
|
+
END as role
|
|
1987
|
+
FROM jank_frame_list fl
|
|
1988
|
+
JOIN process p ON fl.upid = p.upid
|
|
1989
|
+
JOIN thread t ON t.upid = fl.upid
|
|
1990
|
+
WHERE t.tid = p.pid
|
|
1991
|
+
OR t.name = 'RenderThread'
|
|
1992
|
+
OR t.name GLOB '[0-9]*.ui'
|
|
1993
|
+
OR t.name GLOB '[0-9]*.raster'
|
|
1994
|
+
),
|
|
1995
|
+
-- ========== 4. Per-frame: 最耗时 producer 线程 slice ==========
|
|
1996
|
+
frame_slices AS (
|
|
1997
|
+
SELECT
|
|
1998
|
+
fl.frame_start,
|
|
1999
|
+
s.name as slice_name,
|
|
2000
|
+
s.ts as slice_ts,
|
|
2001
|
+
s.dur as slice_dur_ns,
|
|
2002
|
+
ROUND(s.dur / 1e6, 2) as slice_dur_ms,
|
|
2003
|
+
ROUND((s.ts - fl.frame_start) / 1e6, 2) as slice_offset_ms,
|
|
2004
|
+
ROW_NUMBER() OVER (PARTITION BY fl.frame_start ORDER BY s.dur DESC) as rn
|
|
2005
|
+
FROM jank_frame_list fl
|
|
2006
|
+
JOIN per_frame_thread_roles ptr ON ptr.frame_start = fl.frame_start AND ptr.role = 'main'
|
|
2007
|
+
JOIN thread_track tt ON tt.utid = ptr.utid
|
|
2008
|
+
JOIN slice s ON s.track_id = tt.id
|
|
2009
|
+
AND s.ts >= fl.frame_start - 5000000
|
|
2010
|
+
AND s.ts < fl.frame_end
|
|
2011
|
+
AND s.dur >= 1000000
|
|
2012
|
+
),
|
|
2013
|
+
top_slices AS (
|
|
2014
|
+
SELECT * FROM frame_slices WHERE rn = 1
|
|
2015
|
+
),
|
|
2016
|
+
-- ========== 5. Per-frame top slice: 核心类型 + 调度分析 ==========
|
|
2017
|
+
top_slice_states AS (
|
|
2018
|
+
SELECT
|
|
2019
|
+
ts_top.frame_start,
|
|
2020
|
+
tst.state,
|
|
2021
|
+
COALESCE(ct.core_type, 'unknown') as core_type,
|
|
2022
|
+
(MIN(tst.ts + tst.dur, ts_top.slice_ts + ts_top.slice_dur_ns) - MAX(tst.ts, ts_top.slice_ts)) as overlap_ns
|
|
2023
|
+
FROM top_slices ts_top
|
|
2024
|
+
JOIN per_frame_thread_roles ptr ON ptr.frame_start = ts_top.frame_start AND ptr.role = 'main'
|
|
2025
|
+
JOIN thread_state tst ON tst.utid = ptr.utid
|
|
2026
|
+
AND tst.ts < ts_top.slice_ts + ts_top.slice_dur_ns
|
|
2027
|
+
AND tst.ts + tst.dur > ts_top.slice_ts
|
|
2028
|
+
LEFT JOIN _cpu_topology ct ON tst.cpu = ct.cpu_id
|
|
2029
|
+
),
|
|
2030
|
+
per_frame_cpu_mix AS (
|
|
2031
|
+
SELECT
|
|
2032
|
+
frame_start,
|
|
2033
|
+
ROUND(100.0 * SUM(CASE WHEN state = 'Running' AND core_type IN ('medium', 'little') AND overlap_ns > 0 THEN overlap_ns ELSE 0 END)
|
|
2034
|
+
/ NULLIF(SUM(CASE WHEN overlap_ns > 0 THEN overlap_ns ELSE 0 END), 0), 1) as little_run_pct,
|
|
2035
|
+
ROUND(100.0 * SUM(CASE WHEN state = 'Running' AND core_type IN ('prime', 'big') AND overlap_ns > 0 THEN overlap_ns ELSE 0 END)
|
|
2036
|
+
/ NULLIF(SUM(CASE WHEN overlap_ns > 0 THEN overlap_ns ELSE 0 END), 0), 1) as big_run_pct,
|
|
2037
|
+
ROUND(100.0 * SUM(CASE WHEN state = 'R' AND overlap_ns > 0 THEN overlap_ns ELSE 0 END)
|
|
2038
|
+
/ NULLIF(SUM(CASE WHEN overlap_ns > 0 THEN overlap_ns ELSE 0 END), 0), 1) as runnable_pct
|
|
2039
|
+
FROM top_slice_states
|
|
2040
|
+
GROUP BY frame_start
|
|
2041
|
+
),
|
|
2042
|
+
-- ========== 6. Per-frame: 主线程四象限 ==========
|
|
2043
|
+
frame_thread_states AS (
|
|
2044
|
+
SELECT
|
|
2045
|
+
fl.frame_start,
|
|
2046
|
+
tst.state,
|
|
2047
|
+
COALESCE(ct.core_type, 'unknown') as core_type,
|
|
2048
|
+
(MIN(tst.ts + tst.dur, fl.frame_end) - MAX(tst.ts, fl.frame_start)) as overlap_ns
|
|
2049
|
+
FROM jank_frame_list fl
|
|
2050
|
+
JOIN per_frame_thread_roles ptr ON ptr.frame_start = fl.frame_start AND ptr.role = 'main'
|
|
2051
|
+
JOIN thread_state tst ON tst.utid = ptr.utid
|
|
2052
|
+
AND tst.ts < fl.frame_end
|
|
2053
|
+
AND tst.ts + tst.dur > fl.frame_start
|
|
2054
|
+
LEFT JOIN _cpu_topology ct ON tst.cpu = ct.cpu_id
|
|
2055
|
+
),
|
|
2056
|
+
per_frame_quadrants AS (
|
|
2057
|
+
SELECT
|
|
2058
|
+
frame_start,
|
|
2059
|
+
ROUND(100.0 * SUM(CASE WHEN state = 'Running' AND core_type IN ('prime', 'big') AND overlap_ns > 0 THEN overlap_ns ELSE 0 END)
|
|
2060
|
+
/ NULLIF(SUM(CASE WHEN overlap_ns > 0 THEN overlap_ns ELSE 0 END), 0), 1) as q1_pct,
|
|
2061
|
+
ROUND(100.0 * SUM(CASE WHEN state = 'Running' AND core_type IN ('medium', 'little') AND overlap_ns > 0 THEN overlap_ns ELSE 0 END)
|
|
2062
|
+
/ NULLIF(SUM(CASE WHEN overlap_ns > 0 THEN overlap_ns ELSE 0 END), 0), 1) as q2_pct,
|
|
2063
|
+
ROUND(100.0 * SUM(CASE WHEN state = 'R' AND overlap_ns > 0 THEN overlap_ns ELSE 0 END)
|
|
2064
|
+
/ NULLIF(SUM(CASE WHEN overlap_ns > 0 THEN overlap_ns ELSE 0 END), 0), 1) as q3_pct,
|
|
2065
|
+
ROUND(100.0 * SUM(CASE WHEN state IN ('D', 'DK') AND overlap_ns > 0 THEN overlap_ns ELSE 0 END)
|
|
2066
|
+
/ NULLIF(SUM(CASE WHEN overlap_ns > 0 THEN overlap_ns ELSE 0 END), 0), 1) as q4a_pct,
|
|
2067
|
+
ROUND(100.0 * SUM(CASE WHEN state IN ('S', 'I') AND overlap_ns > 0 THEN overlap_ns ELSE 0 END)
|
|
2068
|
+
/ NULLIF(SUM(CASE WHEN overlap_ns > 0 THEN overlap_ns ELSE 0 END), 0), 1) as q4b_pct
|
|
2069
|
+
FROM frame_thread_states
|
|
2070
|
+
GROUP BY frame_start
|
|
2071
|
+
),
|
|
2072
|
+
-- ========== 6b. Per-frame: 渲染线程四象限 ==========
|
|
2073
|
+
render_thread_states AS (
|
|
2074
|
+
SELECT
|
|
2075
|
+
fl.frame_start,
|
|
2076
|
+
tst.state,
|
|
2077
|
+
COALESCE(ct.core_type, 'unknown') as core_type,
|
|
2078
|
+
(MIN(tst.ts + tst.dur, fl.frame_end) - MAX(tst.ts, fl.frame_start)) as overlap_ns
|
|
2079
|
+
FROM jank_frame_list fl
|
|
2080
|
+
JOIN per_frame_thread_roles ptr ON ptr.frame_start = fl.frame_start AND ptr.role = 'render'
|
|
2081
|
+
JOIN thread_state tst ON tst.utid = ptr.utid
|
|
2082
|
+
AND tst.ts < fl.frame_end
|
|
2083
|
+
AND tst.ts + tst.dur > fl.frame_start
|
|
2084
|
+
LEFT JOIN _cpu_topology ct ON tst.cpu = ct.cpu_id
|
|
2085
|
+
),
|
|
2086
|
+
render_thread_quadrants AS (
|
|
2087
|
+
SELECT
|
|
2088
|
+
frame_start,
|
|
2089
|
+
ROUND(100.0 * SUM(CASE WHEN state = 'Running' AND core_type IN ('prime', 'big') AND overlap_ns > 0 THEN overlap_ns ELSE 0 END)
|
|
2090
|
+
/ NULLIF(SUM(CASE WHEN overlap_ns > 0 THEN overlap_ns ELSE 0 END), 0), 1) as render_q1_pct,
|
|
2091
|
+
ROUND(100.0 * SUM(CASE WHEN state = 'Running' AND core_type IN ('medium', 'little') AND overlap_ns > 0 THEN overlap_ns ELSE 0 END)
|
|
2092
|
+
/ NULLIF(SUM(CASE WHEN overlap_ns > 0 THEN overlap_ns ELSE 0 END), 0), 1) as render_q2_pct,
|
|
2093
|
+
ROUND(100.0 * SUM(CASE WHEN state = 'R' AND overlap_ns > 0 THEN overlap_ns ELSE 0 END)
|
|
2094
|
+
/ NULLIF(SUM(CASE WHEN overlap_ns > 0 THEN overlap_ns ELSE 0 END), 0), 1) as render_q3_pct,
|
|
2095
|
+
ROUND(100.0 * SUM(CASE WHEN state IN ('D', 'DK') AND overlap_ns > 0 THEN overlap_ns ELSE 0 END)
|
|
2096
|
+
/ NULLIF(SUM(CASE WHEN overlap_ns > 0 THEN overlap_ns ELSE 0 END), 0), 1) as render_q4a_pct,
|
|
2097
|
+
ROUND(100.0 * SUM(CASE WHEN state IN ('S', 'I') AND overlap_ns > 0 THEN overlap_ns ELSE 0 END)
|
|
2098
|
+
/ NULLIF(SUM(CASE WHEN overlap_ns > 0 THEN overlap_ns ELSE 0 END), 0), 1) as render_q4b_pct
|
|
2099
|
+
FROM render_thread_states
|
|
2100
|
+
GROUP BY frame_start
|
|
2101
|
+
),
|
|
2102
|
+
-- ========== 7. Per-frame: 大核频率 ==========
|
|
2103
|
+
per_frame_freq AS (
|
|
2104
|
+
SELECT
|
|
2105
|
+
fl.frame_start,
|
|
2106
|
+
ROUND(AVG(c.value) / 1000, 0) as big_avg_freq_mhz,
|
|
2107
|
+
ROUND(MAX(c.value) / 1000, 0) as big_max_freq_mhz
|
|
2108
|
+
FROM jank_frame_list fl
|
|
2109
|
+
JOIN counter c ON c.ts >= fl.frame_start AND c.ts < fl.frame_end
|
|
2110
|
+
JOIN cpu_counter_track cct ON c.track_id = cct.id AND cct.name = 'cpufreq'
|
|
2111
|
+
LEFT JOIN _cpu_topology ct ON cct.cpu = ct.cpu_id
|
|
2112
|
+
WHERE ct.core_type IN ('prime', 'big')
|
|
2113
|
+
GROUP BY fl.frame_start
|
|
2114
|
+
),
|
|
2115
|
+
-- ========== 8. Per-frame: 频率爬升延迟 ==========
|
|
2116
|
+
frame_peak_freq AS (
|
|
2117
|
+
SELECT fl.frame_start, MAX(c.value) as peak_khz
|
|
2118
|
+
FROM jank_frame_list fl
|
|
2119
|
+
JOIN counter c ON c.ts >= fl.frame_start AND c.ts < fl.frame_end
|
|
2120
|
+
JOIN cpu_counter_track cct ON c.track_id = cct.id AND cct.name = 'cpufreq'
|
|
2121
|
+
LEFT JOIN _cpu_topology ct ON cct.cpu = ct.cpu_id
|
|
2122
|
+
WHERE ct.core_type IN ('prime', 'big')
|
|
2123
|
+
GROUP BY fl.frame_start
|
|
2124
|
+
),
|
|
2125
|
+
per_frame_ramp AS (
|
|
2126
|
+
SELECT
|
|
2127
|
+
fl.frame_start,
|
|
2128
|
+
ROUND(
|
|
2129
|
+
(COALESCE(
|
|
2130
|
+
MIN(CASE WHEN c.value >= CASE WHEN fpf.peak_khz * 0.70 > 1800000 THEN fpf.peak_khz * 0.70 ELSE 1800000 END THEN c.ts END),
|
|
2131
|
+
fl.frame_end
|
|
2132
|
+
) - fl.frame_start) / 1e6, 2
|
|
2133
|
+
) as ramp_to_high_ms
|
|
2134
|
+
FROM jank_frame_list fl
|
|
2135
|
+
JOIN frame_peak_freq fpf ON fpf.frame_start = fl.frame_start
|
|
2136
|
+
JOIN counter c ON c.ts >= fl.frame_start AND c.ts < fl.frame_end
|
|
2137
|
+
JOIN cpu_counter_track cct ON c.track_id = cct.id AND cct.name = 'cpufreq'
|
|
2138
|
+
LEFT JOIN _cpu_topology ct ON cct.cpu = ct.cpu_id
|
|
2139
|
+
WHERE ct.core_type IN ('prime', 'big')
|
|
2140
|
+
GROUP BY fl.frame_start
|
|
2141
|
+
),
|
|
2142
|
+
-- ========== 9. Per-frame: Binder 同步与 top slice 重叠 ==========
|
|
2143
|
+
per_frame_binder AS (
|
|
2144
|
+
SELECT
|
|
2145
|
+
ts_top.frame_start,
|
|
2146
|
+
ROUND(COALESCE(SUM(
|
|
2147
|
+
CASE
|
|
2148
|
+
WHEN bt.client_ts < ts_top.slice_ts + ts_top.slice_dur_ns
|
|
2149
|
+
AND bt.client_ts + bt.client_dur > ts_top.slice_ts
|
|
2150
|
+
THEN (
|
|
2151
|
+
MIN(bt.client_ts + bt.client_dur, ts_top.slice_ts + ts_top.slice_dur_ns) -
|
|
2152
|
+
MAX(bt.client_ts, ts_top.slice_ts)
|
|
2153
|
+
)
|
|
2154
|
+
ELSE 0
|
|
2155
|
+
END
|
|
2156
|
+
), 0) / 1e6, 2) as binder_overlap_ms
|
|
2157
|
+
FROM top_slices ts_top
|
|
2158
|
+
JOIN per_frame_thread_roles ptr ON ptr.frame_start = ts_top.frame_start AND ptr.role = 'main'
|
|
2159
|
+
LEFT JOIN android_binder_txns bt ON bt.client_tid = ptr.tid
|
|
2160
|
+
AND bt.is_sync = 1
|
|
2161
|
+
AND bt.client_ts < ts_top.slice_ts + ts_top.slice_dur_ns
|
|
2162
|
+
AND bt.client_ts + bt.client_dur > ts_top.slice_ts
|
|
2163
|
+
GROUP BY ts_top.frame_start
|
|
2164
|
+
),
|
|
2165
|
+
-- ========== 9.5. Per-frame: GPU fence 等待检测 ==========
|
|
2166
|
+
gpu_fence_per_frame AS (
|
|
2167
|
+
SELECT
|
|
2168
|
+
fl.frame_start,
|
|
2169
|
+
MAX(CASE WHEN s.name GLOB '*Fence*' OR s.name GLOB '*fence*' OR s.name GLOB '*eglSwapBuffers*' OR s.name GLOB '*dequeueBuffer*'
|
|
2170
|
+
THEN s.dur ELSE 0 END) as max_fence_dur_ns,
|
|
2171
|
+
SUM(CASE WHEN s.name GLOB '*Fence*' OR s.name GLOB '*fence*' OR s.name GLOB '*eglSwapBuffers*' OR s.name GLOB '*dequeueBuffer*'
|
|
2172
|
+
THEN s.dur ELSE 0 END) as total_fence_dur_ns
|
|
2173
|
+
FROM jank_frame_list fl
|
|
2174
|
+
JOIN slice s ON s.ts >= fl.frame_start AND s.ts < fl.frame_end
|
|
2175
|
+
JOIN thread_track tk ON s.track_id = tk.id
|
|
2176
|
+
JOIN thread t ON tk.utid = t.utid
|
|
2177
|
+
WHERE t.upid = fl.upid -- same process only (no thread name filter needed)
|
|
2178
|
+
GROUP BY fl.frame_start
|
|
2179
|
+
),
|
|
2180
|
+
-- ========== 9.6. Per-frame: Shader compilation 检测 ==========
|
|
2181
|
+
shader_per_frame AS (
|
|
2182
|
+
SELECT
|
|
2183
|
+
fl.frame_start,
|
|
2184
|
+
COUNT(*) as shader_count,
|
|
2185
|
+
SUM(s.dur) as total_shader_dur_ns
|
|
2186
|
+
FROM jank_frame_list fl
|
|
2187
|
+
JOIN slice s ON s.ts >= fl.frame_start AND s.ts < fl.frame_end
|
|
2188
|
+
JOIN thread_track tk ON s.track_id = tk.id
|
|
2189
|
+
JOIN thread t ON tk.utid = t.utid
|
|
2190
|
+
WHERE t.upid = fl.upid -- same process only (no thread name filter needed)
|
|
2191
|
+
AND (s.name GLOB '*shader*' OR s.name GLOB '*Shader*' OR s.name GLOB '*compile*' OR s.name GLOB '*Compile*')
|
|
2192
|
+
GROUP BY fl.frame_start
|
|
2193
|
+
),
|
|
2194
|
+
-- ========== 9.7. Per-frame: GC 事件与帧窗口重叠 ==========
|
|
2195
|
+
per_frame_gc AS (
|
|
2196
|
+
SELECT
|
|
2197
|
+
fl.frame_start,
|
|
2198
|
+
ROUND(COALESCE(SUM(
|
|
2199
|
+
MIN(gc.gc_ts + gc.gc_dur, fl.frame_end) - MAX(gc.gc_ts, fl.frame_start)
|
|
2200
|
+
), 0) / 1e6, 2) as gc_overlap_ms,
|
|
2201
|
+
COUNT(gc.gc_ts) as gc_count
|
|
2202
|
+
FROM jank_frame_list fl
|
|
2203
|
+
LEFT JOIN (
|
|
2204
|
+
SELECT gc.gc_ts, gc.gc_dur
|
|
2205
|
+
FROM android_garbage_collection_events gc
|
|
2206
|
+
JOIN thread t ON gc.tid = t.tid
|
|
2207
|
+
JOIN process p ON t.upid = p.upid
|
|
2208
|
+
WHERE (p.name GLOB '${package}*' OR '${package}' = '')
|
|
2209
|
+
) gc ON gc.gc_ts < fl.frame_end AND gc.gc_ts + gc.gc_dur > fl.frame_start
|
|
2210
|
+
GROUP BY fl.frame_start
|
|
2211
|
+
),
|
|
2212
|
+
-- ========== 10. 批量详情 JSON 列(覆盖全部掉帧,避免 N+1 查询) ==========
|
|
2213
|
+
-- 10a. 全簇 CPU 频率 (prime/big/little)
|
|
2214
|
+
per_frame_cpu_clusters AS (
|
|
2215
|
+
SELECT frame_start,
|
|
2216
|
+
json_group_array(json_object(
|
|
2217
|
+
'core_type', core_type,
|
|
2218
|
+
'avg_mhz', avg_mhz,
|
|
2219
|
+
'max_mhz', max_mhz,
|
|
2220
|
+
'min_mhz', min_mhz
|
|
2221
|
+
)) as cpu_freq_clusters_json
|
|
2222
|
+
FROM (
|
|
2223
|
+
SELECT
|
|
2224
|
+
fl.frame_start,
|
|
2225
|
+
COALESCE(ct.core_type, 'unknown') as core_type,
|
|
2226
|
+
CAST(ROUND(AVG(c.value) / 1000, 0) AS INTEGER) as avg_mhz,
|
|
2227
|
+
CAST(ROUND(MAX(c.value) / 1000, 0) AS INTEGER) as max_mhz,
|
|
2228
|
+
CAST(ROUND(MIN(c.value) / 1000, 0) AS INTEGER) as min_mhz
|
|
2229
|
+
FROM jank_frame_list fl
|
|
2230
|
+
JOIN counter c ON c.ts >= fl.frame_start AND c.ts < fl.frame_end
|
|
2231
|
+
JOIN cpu_counter_track cct ON c.track_id = cct.id AND cct.name = 'cpufreq'
|
|
2232
|
+
LEFT JOIN _cpu_topology ct ON cct.cpu = ct.cpu_id
|
|
2233
|
+
GROUP BY fl.frame_start, COALESCE(ct.core_type, 'unknown')
|
|
2234
|
+
)
|
|
2235
|
+
GROUP BY frame_start
|
|
2236
|
+
),
|
|
2237
|
+
-- 10b. 各 CPU 频率变化时间线(频率单位 GHz)
|
|
2238
|
+
per_frame_freq_changes AS (
|
|
2239
|
+
SELECT frame_start,
|
|
2240
|
+
json_group_array(json_object(
|
|
2241
|
+
'relative_ms', relative_ms,
|
|
2242
|
+
'cpu', cpu,
|
|
2243
|
+
'core_type', core_type,
|
|
2244
|
+
'freq_ghz', freq_ghz,
|
|
2245
|
+
'change', change_dir
|
|
2246
|
+
)) as freq_timeline_json
|
|
2247
|
+
FROM (
|
|
2248
|
+
SELECT *,
|
|
2249
|
+
ROW_NUMBER() OVER (PARTITION BY frame_start ORDER BY relative_ms, cpu) as rn
|
|
2250
|
+
FROM (
|
|
2251
|
+
SELECT
|
|
2252
|
+
fl.frame_start,
|
|
2253
|
+
ROUND((c.ts - fl.frame_start) / 1e6, 2) as relative_ms,
|
|
2254
|
+
cct.cpu,
|
|
2255
|
+
COALESCE(ct.core_type, 'unknown') as core_type,
|
|
2256
|
+
ROUND(c.value / 1e6, 2) as freq_ghz,
|
|
2257
|
+
c.value as freq_khz,
|
|
2258
|
+
LAG(c.value) OVER (PARTITION BY fl.frame_start, cct.cpu ORDER BY c.ts) as prev_freq_khz,
|
|
2259
|
+
CASE
|
|
2260
|
+
WHEN c.value > COALESCE(LAG(c.value) OVER (PARTITION BY fl.frame_start, cct.cpu ORDER BY c.ts), c.value) THEN 'up'
|
|
2261
|
+
WHEN c.value < COALESCE(LAG(c.value) OVER (PARTITION BY fl.frame_start, cct.cpu ORDER BY c.ts), c.value) THEN 'down'
|
|
2262
|
+
ELSE 'stable'
|
|
2263
|
+
END as change_dir
|
|
2264
|
+
FROM jank_frame_list fl
|
|
2265
|
+
JOIN counter c ON c.ts >= fl.frame_start AND c.ts < fl.frame_end
|
|
2266
|
+
JOIN cpu_counter_track cct ON c.track_id = cct.id AND cct.name = 'cpufreq'
|
|
2267
|
+
LEFT JOIN _cpu_topology ct ON cct.cpu = ct.cpu_id
|
|
2268
|
+
)
|
|
2269
|
+
WHERE freq_khz != COALESCE(prev_freq_khz, 0)
|
|
2270
|
+
)
|
|
2271
|
+
WHERE rn <= 30
|
|
2272
|
+
GROUP BY frame_start
|
|
2273
|
+
),
|
|
2274
|
+
-- 10c. 主线程 Top 8 耗时 Slice
|
|
2275
|
+
per_frame_main_top_slices AS (
|
|
2276
|
+
SELECT frame_start,
|
|
2277
|
+
json_group_array(json_object(
|
|
2278
|
+
'name', slice_name,
|
|
2279
|
+
'total_ms', dur_ms,
|
|
2280
|
+
'count', cnt,
|
|
2281
|
+
'max_ms', max_ms,
|
|
2282
|
+
'ts', ts_str
|
|
2283
|
+
)) as main_slices_json
|
|
2284
|
+
FROM (
|
|
2285
|
+
SELECT
|
|
2286
|
+
fl.frame_start,
|
|
2287
|
+
s.name as slice_name,
|
|
2288
|
+
ROUND(SUM(s.dur) / 1e6, 2) as dur_ms,
|
|
2289
|
+
COUNT(*) as cnt,
|
|
2290
|
+
ROUND(MAX(s.dur) / 1e6, 2) as max_ms,
|
|
2291
|
+
printf('%d', MIN(s.ts)) as ts_str,
|
|
2292
|
+
ROW_NUMBER() OVER (PARTITION BY fl.frame_start ORDER BY SUM(s.dur) DESC) as rn
|
|
2293
|
+
FROM jank_frame_list fl
|
|
2294
|
+
JOIN per_frame_thread_roles ptr ON ptr.frame_start = fl.frame_start AND ptr.role = 'main'
|
|
2295
|
+
JOIN thread_track tt ON tt.utid = ptr.utid
|
|
2296
|
+
JOIN slice s ON s.track_id = tt.id
|
|
2297
|
+
AND s.ts >= fl.frame_start - 5000000
|
|
2298
|
+
AND s.ts < fl.frame_end
|
|
2299
|
+
AND s.dur >= 500000
|
|
2300
|
+
GROUP BY fl.frame_start, s.name
|
|
2301
|
+
HAVING dur_ms > 0.5
|
|
2302
|
+
)
|
|
2303
|
+
WHERE rn <= 8
|
|
2304
|
+
GROUP BY frame_start
|
|
2305
|
+
),
|
|
2306
|
+
-- 10d. RenderThread Top 8 耗时 Slice
|
|
2307
|
+
per_frame_render_top_slices AS (
|
|
2308
|
+
SELECT frame_start,
|
|
2309
|
+
json_group_array(json_object(
|
|
2310
|
+
'name', slice_name,
|
|
2311
|
+
'total_ms', dur_ms,
|
|
2312
|
+
'count', cnt,
|
|
2313
|
+
'max_ms', max_ms,
|
|
2314
|
+
'ts', ts_str
|
|
2315
|
+
)) as render_slices_json
|
|
2316
|
+
FROM (
|
|
2317
|
+
SELECT
|
|
2318
|
+
fl.frame_start,
|
|
2319
|
+
s.name as slice_name,
|
|
2320
|
+
ROUND(SUM(s.dur) / 1e6, 2) as dur_ms,
|
|
2321
|
+
COUNT(*) as cnt,
|
|
2322
|
+
ROUND(MAX(s.dur) / 1e6, 2) as max_ms,
|
|
2323
|
+
printf('%d', MIN(s.ts)) as ts_str,
|
|
2324
|
+
ROW_NUMBER() OVER (PARTITION BY fl.frame_start ORDER BY SUM(s.dur) DESC) as rn
|
|
2325
|
+
FROM jank_frame_list fl
|
|
2326
|
+
JOIN per_frame_thread_roles ptr ON ptr.frame_start = fl.frame_start AND ptr.role = 'render'
|
|
2327
|
+
JOIN thread_track tt ON tt.utid = ptr.utid
|
|
2328
|
+
JOIN slice s ON s.track_id = tt.id
|
|
2329
|
+
AND s.ts >= fl.frame_start - 5000000
|
|
2330
|
+
AND s.ts < fl.frame_end
|
|
2331
|
+
AND s.dur >= 500000
|
|
2332
|
+
GROUP BY fl.frame_start, s.name
|
|
2333
|
+
HAVING dur_ms > 0.5
|
|
2334
|
+
)
|
|
2335
|
+
WHERE rn <= 8
|
|
2336
|
+
GROUP BY frame_start
|
|
2337
|
+
),
|
|
2338
|
+
-- 10e. Binder 调用详情(按 server_process 聚合,Top 5)
|
|
2339
|
+
per_frame_binder_detail AS (
|
|
2340
|
+
SELECT frame_start,
|
|
2341
|
+
json_group_array(json_object(
|
|
2342
|
+
'server', server_process,
|
|
2343
|
+
'count', cnt,
|
|
2344
|
+
'dur_ms', dur_ms,
|
|
2345
|
+
'max_ms', max_ms
|
|
2346
|
+
)) as binder_calls_json
|
|
2347
|
+
FROM (
|
|
2348
|
+
SELECT
|
|
2349
|
+
fl.frame_start,
|
|
2350
|
+
bt.server_process,
|
|
2351
|
+
COUNT(*) as cnt,
|
|
2352
|
+
ROUND(SUM(bt.client_dur) / 1e6, 2) as dur_ms,
|
|
2353
|
+
ROUND(MAX(bt.client_dur) / 1e6, 2) as max_ms,
|
|
2354
|
+
ROW_NUMBER() OVER (PARTITION BY fl.frame_start ORDER BY SUM(bt.client_dur) DESC) as rn
|
|
2355
|
+
FROM jank_frame_list fl
|
|
2356
|
+
JOIN per_frame_thread_roles ptr ON ptr.frame_start = fl.frame_start AND ptr.role = 'main'
|
|
2357
|
+
LEFT JOIN android_binder_txns bt ON bt.client_tid = ptr.tid
|
|
2358
|
+
AND bt.client_ts >= fl.frame_start
|
|
2359
|
+
AND bt.client_ts < fl.frame_end
|
|
2360
|
+
WHERE bt.server_process IS NOT NULL
|
|
2361
|
+
GROUP BY fl.frame_start, bt.server_process
|
|
2362
|
+
HAVING dur_ms > 0.1
|
|
2363
|
+
)
|
|
2364
|
+
WHERE rn <= 5
|
|
2365
|
+
GROUP BY frame_start
|
|
2366
|
+
),
|
|
2367
|
+
-- 10f. GC 事件详情(按类型聚合)
|
|
2368
|
+
per_frame_gc_detail AS (
|
|
2369
|
+
SELECT frame_start,
|
|
2370
|
+
json_group_array(json_object(
|
|
2371
|
+
'gc_type', gc_type,
|
|
2372
|
+
'count', cnt,
|
|
2373
|
+
'total_ms', total_dur_ms,
|
|
2374
|
+
'overlap_ms', overlap_ms
|
|
2375
|
+
)) as gc_events_json
|
|
2376
|
+
FROM (
|
|
2377
|
+
SELECT
|
|
2378
|
+
fl.frame_start,
|
|
2379
|
+
COALESCE(gc.gc_type, 'unknown') as gc_type,
|
|
2380
|
+
COUNT(*) as cnt,
|
|
2381
|
+
ROUND(SUM(gc.gc_dur) / 1e6, 2) as total_dur_ms,
|
|
2382
|
+
ROUND(SUM(
|
|
2383
|
+
MAX(MIN(gc.gc_ts + gc.gc_dur, fl.frame_end) - MAX(gc.gc_ts, fl.frame_start), 0)
|
|
2384
|
+
) / 1e6, 2) as overlap_ms
|
|
2385
|
+
FROM jank_frame_list fl
|
|
2386
|
+
LEFT JOIN (
|
|
2387
|
+
SELECT gc.gc_ts, gc.gc_dur, gc.gc_type, t.tid
|
|
2388
|
+
FROM android_garbage_collection_events gc
|
|
2389
|
+
JOIN thread t ON gc.tid = t.tid
|
|
2390
|
+
JOIN process p ON t.upid = p.upid
|
|
2391
|
+
WHERE (p.name GLOB '${package}*' OR '${package}' = '')
|
|
2392
|
+
) gc ON gc.gc_ts < fl.frame_end AND gc.gc_ts + gc.gc_dur > fl.frame_start
|
|
2393
|
+
WHERE gc.gc_ts IS NOT NULL
|
|
2394
|
+
GROUP BY fl.frame_start, COALESCE(gc.gc_type, 'unknown')
|
|
2395
|
+
HAVING overlap_ms > 0
|
|
2396
|
+
)
|
|
2397
|
+
GROUP BY frame_start
|
|
2398
|
+
),
|
|
2399
|
+
-- 10g. 锁竞争详情(Top 5,需要 android_monitor_contention 表)
|
|
2400
|
+
per_frame_lock_detail AS (
|
|
2401
|
+
SELECT frame_start,
|
|
2402
|
+
json_group_array(json_object(
|
|
2403
|
+
'method', blocking_method,
|
|
2404
|
+
'blocker', blocking_thread_name,
|
|
2405
|
+
'wait_ms', wait_ms,
|
|
2406
|
+
'main_blocked', main_blocked
|
|
2407
|
+
)) as lock_contention_json
|
|
2408
|
+
FROM (
|
|
2409
|
+
SELECT
|
|
2410
|
+
fl.frame_start,
|
|
2411
|
+
amc.short_blocking_method as blocking_method,
|
|
2412
|
+
amc.blocking_thread_name,
|
|
2413
|
+
ROUND(amc.dur / 1e6, 2) as wait_ms,
|
|
2414
|
+
CASE WHEN amc.is_blocked_thread_main THEN 1 ELSE 0 END as main_blocked,
|
|
2415
|
+
ROW_NUMBER() OVER (PARTITION BY fl.frame_start ORDER BY amc.dur DESC) as rn
|
|
2416
|
+
FROM jank_frame_list fl
|
|
2417
|
+
JOIN android_monitor_contention amc ON amc.ts >= fl.frame_start AND amc.ts < fl.frame_end
|
|
2418
|
+
AND (amc.process_name GLOB '${package}*' OR '${package}' = '')
|
|
2419
|
+
AND amc.dur >= 200000
|
|
2420
|
+
)
|
|
2421
|
+
WHERE rn <= 5
|
|
2422
|
+
GROUP BY frame_start
|
|
2423
|
+
),
|
|
2424
|
+
-- 10h. 主线程文件 IO 检测(SharedPreferences/sqlite/fsync 等 IO slice 与帧窗口重叠)
|
|
2425
|
+
per_frame_file_io AS (
|
|
2426
|
+
SELECT fl.frame_start,
|
|
2427
|
+
ROUND(SUM(
|
|
2428
|
+
MAX(MIN(s.ts + s.dur, fl.frame_end) - MAX(s.ts, fl.frame_start), 0)
|
|
2429
|
+
) / 1e6, 2) as file_io_overlap_ms
|
|
2430
|
+
FROM jank_frame_list fl
|
|
2431
|
+
JOIN per_frame_thread_roles ptr ON ptr.frame_start = fl.frame_start AND ptr.role = 'main'
|
|
2432
|
+
JOIN thread_track tt ON tt.utid = ptr.utid
|
|
2433
|
+
JOIN slice s ON s.track_id = tt.id
|
|
2434
|
+
AND s.ts < fl.frame_end AND s.ts + s.dur > fl.frame_start
|
|
2435
|
+
AND s.dur > 500000
|
|
2436
|
+
WHERE s.name GLOB '*SharedPreferences*'
|
|
2437
|
+
OR s.name GLOB '*getSharedPreferences*'
|
|
2438
|
+
OR s.name GLOB '*commit*SharedPref*'
|
|
2439
|
+
OR s.name GLOB '*QueuedWork*'
|
|
2440
|
+
OR s.name GLOB '*waitToFinish*'
|
|
2441
|
+
OR s.name GLOB '*sqlite*'
|
|
2442
|
+
OR s.name GLOB '*SQLiteDatabase*'
|
|
2443
|
+
OR s.name GLOB '*openFile*'
|
|
2444
|
+
OR s.name GLOB '*fsync*'
|
|
2445
|
+
GROUP BY fl.frame_start
|
|
2446
|
+
),
|
|
2447
|
+
-- ========== 11. 综合分析 ==========
|
|
2448
|
+
analysis AS (
|
|
2449
|
+
SELECT
|
|
2450
|
+
fl.display_frame_token,
|
|
2451
|
+
fl.frame_start,
|
|
2452
|
+
fl.frame_end,
|
|
2453
|
+
fl.dur_ms,
|
|
2454
|
+
fl.jank_type,
|
|
2455
|
+
fl.jank_responsibility,
|
|
2456
|
+
fl.session_id,
|
|
2457
|
+
fl.pid,
|
|
2458
|
+
fl.process_name,
|
|
2459
|
+
fl.frame_index,
|
|
2460
|
+
fl.vsync_missed,
|
|
2461
|
+
fl.present_interval_ms,
|
|
2462
|
+
COALESCE(ts.slice_name, '') as top_slice_name,
|
|
2463
|
+
COALESCE(ts.slice_dur_ms, 0) as top_slice_ms,
|
|
2464
|
+
COALESCE(ts.slice_offset_ms, 0) as top_slice_offset_ms,
|
|
2465
|
+
COALESCE(pcm.little_run_pct, 0) as little_run_pct,
|
|
2466
|
+
COALESCE(pcm.big_run_pct, 0) as big_run_pct,
|
|
2467
|
+
COALESCE(pcm.runnable_pct, 0) as runnable_pct,
|
|
2468
|
+
COALESCE(pfq.q1_pct, 0) as main_q1_pct,
|
|
2469
|
+
COALESCE(pfq.q2_pct, 0) as main_q2_pct,
|
|
2470
|
+
COALESCE(pfq.q3_pct, 0) as main_q3_pct,
|
|
2471
|
+
COALESCE(pfq.q4a_pct, 0) as main_q4a_pct,
|
|
2472
|
+
COALESCE(pfq.q4b_pct, 0) as main_q4b_pct,
|
|
2473
|
+
COALESCE(rtq.render_q1_pct, 0) as render_q1_pct,
|
|
2474
|
+
COALESCE(rtq.render_q2_pct, 0) as render_q2_pct,
|
|
2475
|
+
COALESCE(rtq.render_q3_pct, 0) as render_q3_pct,
|
|
2476
|
+
COALESCE(rtq.render_q4a_pct, 0) as render_q4a_pct,
|
|
2477
|
+
COALESCE(rtq.render_q4b_pct, 0) as render_q4b_pct,
|
|
2478
|
+
COALESCE(pff.big_avg_freq_mhz, 0) as big_avg_freq_mhz,
|
|
2479
|
+
COALESCE(pff.big_max_freq_mhz, 0) as big_max_freq_mhz,
|
|
2480
|
+
COALESCE(pfr.ramp_to_high_ms, 0) as ramp_to_high_ms,
|
|
2481
|
+
COALESCE(pfb.binder_overlap_ms, 0) as binder_overlap_ms,
|
|
2482
|
+
COALESCE(pfgc.gc_overlap_ms, 0) as gc_overlap_ms,
|
|
2483
|
+
COALESCE(pfgc.gc_count, 0) as gc_count,
|
|
2484
|
+
COALESCE(gf.max_fence_dur_ns, 0) as max_fence_dur_ns,
|
|
2485
|
+
COALESCE(gf.total_fence_dur_ns, 0) as total_fence_dur_ns,
|
|
2486
|
+
COALESCE(sp.shader_count, 0) as shader_count,
|
|
2487
|
+
COALESCE(sp.total_shader_dur_ns, 0) as total_shader_dur_ns,
|
|
2488
|
+
tc.vsync_period_ns,
|
|
2489
|
+
tc.frame_budget_ms,
|
|
2490
|
+
tc.slice_critical_ms,
|
|
2491
|
+
tc.freq_ramp_critical_ms,
|
|
2492
|
+
tc.binder_overlap_critical_ms,
|
|
2493
|
+
COALESCE(pfcc.cpu_freq_clusters_json, '[]') as cpu_freq_clusters_json,
|
|
2494
|
+
COALESCE(pffc.freq_timeline_json, '[]') as freq_timeline_json,
|
|
2495
|
+
COALESCE(pfmts.main_slices_json, '[]') as main_slices_json,
|
|
2496
|
+
COALESCE(pfrts.render_slices_json, '[]') as render_slices_json,
|
|
2497
|
+
COALESCE(pfbd.binder_calls_json, '[]') as binder_calls_json,
|
|
2498
|
+
COALESCE(pfgd.gc_events_json, '[]') as gc_events_json,
|
|
2499
|
+
COALESCE(pfld.lock_contention_json, '[]') as lock_contention_json,
|
|
2500
|
+
COALESCE(pfio.file_io_overlap_ms, 0) as file_io_overlap_ms,
|
|
2501
|
+
dpf.device_peak_freq_mhz
|
|
2502
|
+
FROM jank_frame_list fl
|
|
2503
|
+
CROSS JOIN timing_config tc
|
|
2504
|
+
CROSS JOIN device_peak_freq dpf
|
|
2505
|
+
LEFT JOIN top_slices ts ON ts.frame_start = fl.frame_start
|
|
2506
|
+
LEFT JOIN per_frame_cpu_mix pcm ON pcm.frame_start = fl.frame_start
|
|
2507
|
+
LEFT JOIN per_frame_quadrants pfq ON pfq.frame_start = fl.frame_start
|
|
2508
|
+
LEFT JOIN render_thread_quadrants rtq ON rtq.frame_start = fl.frame_start
|
|
2509
|
+
LEFT JOIN per_frame_freq pff ON pff.frame_start = fl.frame_start
|
|
2510
|
+
LEFT JOIN per_frame_ramp pfr ON pfr.frame_start = fl.frame_start
|
|
2511
|
+
LEFT JOIN per_frame_binder pfb ON pfb.frame_start = fl.frame_start
|
|
2512
|
+
LEFT JOIN per_frame_gc pfgc ON pfgc.frame_start = fl.frame_start
|
|
2513
|
+
LEFT JOIN gpu_fence_per_frame gf ON gf.frame_start = fl.frame_start
|
|
2514
|
+
LEFT JOIN shader_per_frame sp ON sp.frame_start = fl.frame_start
|
|
2515
|
+
LEFT JOIN per_frame_cpu_clusters pfcc ON pfcc.frame_start = fl.frame_start
|
|
2516
|
+
LEFT JOIN per_frame_freq_changes pffc ON pffc.frame_start = fl.frame_start
|
|
2517
|
+
LEFT JOIN per_frame_main_top_slices pfmts ON pfmts.frame_start = fl.frame_start
|
|
2518
|
+
LEFT JOIN per_frame_render_top_slices pfrts ON pfrts.frame_start = fl.frame_start
|
|
2519
|
+
LEFT JOIN per_frame_binder_detail pfbd ON pfbd.frame_start = fl.frame_start
|
|
2520
|
+
LEFT JOIN per_frame_gc_detail pfgd ON pfgd.frame_start = fl.frame_start
|
|
2521
|
+
LEFT JOIN per_frame_lock_detail pfld ON pfld.frame_start = fl.frame_start
|
|
2522
|
+
LEFT JOIN per_frame_file_io pfio ON pfio.frame_start = fl.frame_start
|
|
2523
|
+
),
|
|
2524
|
+
-- ========== 11. 根因分类(与 jank_frame_detail 相同优先级 CASE 树) ==========
|
|
2525
|
+
classified AS (
|
|
2526
|
+
SELECT *,
|
|
2527
|
+
CASE
|
|
2528
|
+
-- P0: Buffer Stuffing 管线背压 — 短路跳过线程分析
|
|
2529
|
+
-- App 未错过 deadline,但 BufferQueue 积压导致 dequeueBuffer 背压
|
|
2530
|
+
-- 主线程 S 状态来自 syncFrameState 等待,非锁/Binder 问题
|
|
2531
|
+
WHEN jank_responsibility = 'BUFFER_STUFFING'
|
|
2532
|
+
THEN 'buffer_stuffing'
|
|
2533
|
+
-- P0.5: SF 合成超时 — 短路:jank_responsibility 指向 SF,跳过 App 侧分析
|
|
2534
|
+
-- Perfetto FrameTimeline 判定 SurfaceFlinger 为掉帧责任方
|
|
2535
|
+
WHEN jank_responsibility = 'SF'
|
|
2536
|
+
THEN 'sf_composition_slow'
|
|
2537
|
+
-- P1: Binder 同步阻塞(top slice 内有大量同步 Binder 重叠)
|
|
2538
|
+
WHEN top_slice_ms > slice_critical_ms AND binder_overlap_ms >= binder_overlap_critical_ms
|
|
2539
|
+
THEN 'binder_sync_blocking'
|
|
2540
|
+
-- P1.5: GC 暂停(帧窗口内 GC 重叠 > 1ms)
|
|
2541
|
+
WHEN gc_overlap_ms > 1.0
|
|
2542
|
+
THEN 'gc_jank'
|
|
2543
|
+
-- P1.6: GC 压力级联 — 帧窗口内多次 GC(>=3 次),内存压力高
|
|
2544
|
+
-- 即使单次 GC 重叠 <1ms,密集 GC 累积也会显著影响帧耗时
|
|
2545
|
+
WHEN gc_count >= 3 AND gc_overlap_ms > 0.5
|
|
2546
|
+
THEN 'gc_pressure_cascade'
|
|
2547
|
+
-- P2: 小核调度(top slice 多数时间在小核执行)
|
|
2548
|
+
WHEN top_slice_ms > slice_critical_ms AND little_run_pct >= 45
|
|
2549
|
+
THEN 'small_core_placement'
|
|
2550
|
+
-- P3: 关键操作中调度延迟(top slice 中 Runnable 等待占比高)
|
|
2551
|
+
WHEN top_slice_ms > slice_critical_ms AND runnable_pct >= 15
|
|
2552
|
+
THEN 'sched_delay_in_slice'
|
|
2553
|
+
-- P3.5: Shader 编译(RenderThread 有 shader compile 且耗时 > 30% 帧预算)
|
|
2554
|
+
WHEN shader_count > 0 AND total_shader_dur_ns > vsync_period_ns * 0.3
|
|
2555
|
+
THEN 'shader_compile'
|
|
2556
|
+
-- P3.6: GPU fence 等待(RenderThread 长时间等待 GPU fence > 50% 帧预算)
|
|
2557
|
+
WHEN max_fence_dur_ns > vsync_period_ns * 0.5
|
|
2558
|
+
THEN 'gpu_fence_wait'
|
|
2559
|
+
-- P3.7: RenderThread 负载过重 — RT 主动运行占比高(>70%),非 GPU/Shader 等待
|
|
2560
|
+
-- 到达此处说明 Shader/GPU fence 已排除;RT 自身计算密集是瓶颈
|
|
2561
|
+
WHEN (render_q1_pct + render_q2_pct) > 70 AND render_q4b_pct < 20
|
|
2562
|
+
THEN 'render_thread_heavy'
|
|
2563
|
+
-- P4: 重度业务负载(>2× 帧预算,即使满频也会超时)
|
|
2564
|
+
WHEN top_slice_ms > frame_budget_ms * 2.0
|
|
2565
|
+
THEN 'workload_heavy'
|
|
2566
|
+
-- P4.5: 温控降频 — 帧内大核最高频率显著低于设备 P95 峰值(<60%)
|
|
2567
|
+
-- 放在 workload_heavy 之后:如果帧有明确的 App 侧直接原因(Binder/GC/heavy workload),
|
|
2568
|
+
-- 优先归因到直接原因。温控降频是供给侧约束,仅在无更强直接原因时才作为主因
|
|
2569
|
+
WHEN device_peak_freq_mhz > 0 AND big_max_freq_mhz > 0
|
|
2570
|
+
AND big_max_freq_mhz < device_peak_freq_mhz * 0.60
|
|
2571
|
+
AND top_slice_ms > slice_critical_ms
|
|
2572
|
+
THEN 'thermal_throttling'
|
|
2573
|
+
-- P4.6: CPU 最大频率被限 — 中等程度限频(60%-75%)
|
|
2574
|
+
WHEN device_peak_freq_mhz > 0 AND big_max_freq_mhz > 0
|
|
2575
|
+
AND big_max_freq_mhz < device_peak_freq_mhz * 0.75
|
|
2576
|
+
AND top_slice_ms > slice_critical_ms
|
|
2577
|
+
THEN 'cpu_max_limited'
|
|
2578
|
+
-- P5: 大核低频(边际情况:slice 在 1x-2x 帧预算区间)
|
|
2579
|
+
WHEN top_slice_ms > slice_critical_ms AND big_run_pct >= 40
|
|
2580
|
+
AND big_avg_freq_mhz > 0 AND big_max_freq_mhz > 0
|
|
2581
|
+
AND big_avg_freq_mhz < big_max_freq_mhz * 0.55
|
|
2582
|
+
THEN 'big_core_low_freq'
|
|
2583
|
+
-- P6: 频率爬升慢(边际情况:slice 在 1x-2x 帧预算区间)
|
|
2584
|
+
WHEN top_slice_ms > slice_critical_ms
|
|
2585
|
+
AND ramp_to_high_ms > freq_ramp_critical_ms
|
|
2586
|
+
AND top_slice_offset_ms <= ramp_to_high_ms
|
|
2587
|
+
THEN 'freq_ramp_slow'
|
|
2588
|
+
-- ========== 四象限/IO/Binder 信号(不依赖 top_slice_ms 阈值)==========
|
|
2589
|
+
-- P7: CPU 全核饱和 — 双线程同时调度等待高
|
|
2590
|
+
WHEN main_q3_pct > 15 AND render_q3_pct > 15
|
|
2591
|
+
THEN 'cpu_saturation'
|
|
2592
|
+
-- P7.5: 调度延迟(仅主线程 Runnable 高)
|
|
2593
|
+
WHEN main_q3_pct > 20
|
|
2594
|
+
THEN 'scheduling_delay'
|
|
2595
|
+
-- P8: 主线程文件 IO — SharedPreferences/SQLite/fsync 等具体 IO slice
|
|
2596
|
+
WHEN file_io_overlap_ms > 1.0
|
|
2597
|
+
THEN 'main_thread_file_io'
|
|
2598
|
+
-- P8.5: IO 阻塞(D/DK 状态,无具体 IO slice 匹配)
|
|
2599
|
+
WHEN main_q4a_pct > 20
|
|
2600
|
+
THEN 'blocking_io'
|
|
2601
|
+
-- P9: Binder 超时 — 帧窗口内 Binder 累计 >500ms
|
|
2602
|
+
WHEN binder_overlap_ms > 500
|
|
2603
|
+
THEN 'binder_timeout'
|
|
2604
|
+
-- P9.5: 锁/Binder 等待(S/I 状态)
|
|
2605
|
+
WHEN main_q4b_pct > 30
|
|
2606
|
+
THEN 'lock_binder_wait'
|
|
2607
|
+
-- P10: 小核调度(按四象限判断)
|
|
2608
|
+
WHEN main_q2_pct > 50
|
|
2609
|
+
THEN 'small_core_placement'
|
|
2610
|
+
-- ========== 兜底分类 ==========
|
|
2611
|
+
-- P11: 工作负载超时兜底(top_slice > critical 但无特定供给侧/四象限因素)
|
|
2612
|
+
WHEN top_slice_ms > slice_critical_ms
|
|
2613
|
+
THEN 'workload_heavy'
|
|
2614
|
+
ELSE 'unknown'
|
|
2615
|
+
END as reason_code
|
|
2616
|
+
FROM analysis
|
|
2617
|
+
)
|
|
2618
|
+
SELECT
|
|
2619
|
+
CAST(display_frame_token AS TEXT) as frame_id,
|
|
2620
|
+
frame_index,
|
|
2621
|
+
printf('%d', frame_start) as start_ts,
|
|
2622
|
+
printf('%d', frame_end - frame_start) as dur,
|
|
2623
|
+
dur_ms,
|
|
2624
|
+
jank_type,
|
|
2625
|
+
vsync_missed,
|
|
2626
|
+
present_interval_ms,
|
|
2627
|
+
jank_responsibility,
|
|
2628
|
+
pid,
|
|
2629
|
+
process_name,
|
|
2630
|
+
reason_code,
|
|
2631
|
+
CASE
|
|
2632
|
+
WHEN reason_code = 'buffer_stuffing' THEN 'Buffer Stuffing: 管线背压,帧耗时 ' || dur_ms || 'ms,BufferQueue 积压导致跳帧(非 App 问题)'
|
|
2633
|
+
WHEN reason_code = 'sf_composition_slow' THEN 'SF合成超时: SurfaceFlinger 侧导致掉帧(非 App 问题),帧耗时 ' || dur_ms || 'ms'
|
|
2634
|
+
WHEN reason_code = 'thermal_throttling' THEN '温控降频: 大核最高 ' || big_max_freq_mhz || 'MHz (设备峰值 ' || device_peak_freq_mhz || 'MHz, 仅 ' || ROUND(100.0 * big_max_freq_mhz / NULLIF(device_peak_freq_mhz, 0), 0) || '%)'
|
|
2635
|
+
WHEN reason_code = 'binder_sync_blocking' THEN '同步Binder阻塞: "' || top_slice_name || '" 中 Binder 重叠 ' || binder_overlap_ms || 'ms'
|
|
2636
|
+
WHEN reason_code = 'gc_jank' THEN 'GC暂停: 帧窗口内 GC 重叠 ' || gc_overlap_ms || 'ms (' || gc_count || ' 次)'
|
|
2637
|
+
WHEN reason_code = 'gc_pressure_cascade' THEN 'GC压力级联: 帧窗口内 ' || gc_count || ' 次 GC,总重叠 ' || gc_overlap_ms || 'ms(内存压力高)'
|
|
2638
|
+
WHEN reason_code = 'small_core_placement' THEN '小核调度: "' || top_slice_name || '" 小核占比 ' || little_run_pct || '%'
|
|
2639
|
+
WHEN reason_code = 'sched_delay_in_slice' THEN '调度延迟: "' || top_slice_name || '" Runnable 占比 ' || runnable_pct || '%'
|
|
2640
|
+
WHEN reason_code = 'shader_compile' THEN 'Shader编译: ' || shader_count || ' 次编译,总计 ' || ROUND(total_shader_dur_ns / 1e6, 2) || 'ms'
|
|
2641
|
+
WHEN reason_code = 'gpu_fence_wait' THEN 'GPU Fence等待: 最长 ' || ROUND(max_fence_dur_ns / 1e6, 2) || 'ms'
|
|
2642
|
+
WHEN reason_code = 'render_thread_heavy' THEN 'RT负载过重: RenderThread 运行占比 ' || (render_q1_pct + render_q2_pct) || '%, 等待仅 ' || render_q4b_pct || '%'
|
|
2643
|
+
WHEN reason_code = 'workload_heavy' THEN '负载过重: "' || top_slice_name || '" 耗时 ' || top_slice_ms || 'ms (预算 ' || frame_budget_ms || 'ms)'
|
|
2644
|
+
WHEN reason_code = 'cpu_max_limited' THEN 'CPU限频: 大核最高 ' || big_max_freq_mhz || 'MHz (设备峰值 ' || device_peak_freq_mhz || 'MHz, ' || ROUND(100.0 * big_max_freq_mhz / NULLIF(device_peak_freq_mhz, 0), 0) || '%), "' || top_slice_name || '" 耗时 ' || top_slice_ms || 'ms'
|
|
2645
|
+
WHEN reason_code = 'big_core_low_freq' THEN '大核低频: 平均 ' || big_avg_freq_mhz || 'MHz (峰值 ' || big_max_freq_mhz || 'MHz)'
|
|
2646
|
+
WHEN reason_code = 'freq_ramp_slow' THEN '升频慢: ' || ramp_to_high_ms || 'ms 才达高频'
|
|
2647
|
+
WHEN reason_code = 'scheduling_delay' THEN '调度等待: Q3=' || main_q3_pct || '%'
|
|
2648
|
+
WHEN reason_code = 'cpu_saturation' THEN 'CPU全核饱和: 主线程 Q3=' || main_q3_pct || '%, RT Q3=' || render_q3_pct || '%(双线程同时调度等待)'
|
|
2649
|
+
WHEN reason_code = 'blocking_io' THEN 'IO阻塞: Q4a(D/DK)=' || main_q4a_pct || '%'
|
|
2650
|
+
WHEN reason_code = 'main_thread_file_io' THEN '主线程文件IO: 帧内 IO overlap ' || file_io_overlap_ms || 'ms (SharedPreferences/SQLite/fsync)'
|
|
2651
|
+
WHEN reason_code = 'lock_binder_wait' THEN '锁/Binder等待: Q4b(S/I)=' || main_q4b_pct || '%'
|
|
2652
|
+
WHEN reason_code = 'binder_timeout' THEN 'Binder超时: 帧内 Binder 累计 ' || binder_overlap_ms || 'ms (>500ms)'
|
|
2653
|
+
ELSE '未分类 (帧耗时 ' || dur_ms || 'ms)'
|
|
2654
|
+
END as primary_cause,
|
|
2655
|
+
CASE
|
|
2656
|
+
WHEN reason_code = 'buffer_stuffing' THEN '高'
|
|
2657
|
+
WHEN reason_code = 'sf_composition_slow' THEN '高'
|
|
2658
|
+
WHEN reason_code = 'thermal_throttling' THEN '高'
|
|
2659
|
+
WHEN reason_code = 'gc_pressure_cascade' THEN '高'
|
|
2660
|
+
WHEN reason_code = 'render_thread_heavy' THEN '中'
|
|
2661
|
+
WHEN reason_code = 'cpu_max_limited' THEN '中'
|
|
2662
|
+
WHEN reason_code = 'cpu_saturation' THEN '中'
|
|
2663
|
+
WHEN reason_code = 'main_thread_file_io' THEN '高'
|
|
2664
|
+
WHEN reason_code = 'binder_timeout' THEN '高'
|
|
2665
|
+
WHEN top_slice_ms > slice_critical_ms THEN '高'
|
|
2666
|
+
WHEN shader_count > 0 THEN '高'
|
|
2667
|
+
WHEN max_fence_dur_ns > vsync_period_ns * 0.5 THEN '中'
|
|
2668
|
+
WHEN gc_overlap_ms > 1.0 THEN '高'
|
|
2669
|
+
WHEN main_q3_pct > 20 OR main_q4a_pct > 20 OR main_q4b_pct > 30 THEN '中'
|
|
2670
|
+
ELSE '低'
|
|
2671
|
+
END as confidence,
|
|
2672
|
+
top_slice_name,
|
|
2673
|
+
top_slice_ms,
|
|
2674
|
+
-- MainThread 四象限完整输出
|
|
2675
|
+
main_q1_pct,
|
|
2676
|
+
main_q2_pct,
|
|
2677
|
+
main_q3_pct,
|
|
2678
|
+
main_q4a_pct,
|
|
2679
|
+
main_q4b_pct,
|
|
2680
|
+
-- RenderThread 四象限
|
|
2681
|
+
COALESCE(render_q1_pct, 0) as render_q1_pct,
|
|
2682
|
+
COALESCE(render_q2_pct, 0) as render_q2_pct,
|
|
2683
|
+
COALESCE(render_q3_pct, 0) as render_q3_pct,
|
|
2684
|
+
COALESCE(render_q4a_pct, 0) as render_q4a_pct,
|
|
2685
|
+
COALESCE(render_q4b_pct, 0) as render_q4b_pct,
|
|
2686
|
+
-- CPU 频率
|
|
2687
|
+
big_avg_freq_mhz,
|
|
2688
|
+
big_max_freq_mhz,
|
|
2689
|
+
ramp_to_high_ms as ramp_ms,
|
|
2690
|
+
-- Top Slice CPU 分布
|
|
2691
|
+
little_run_pct as top_slice_little_pct,
|
|
2692
|
+
big_run_pct as top_slice_big_pct,
|
|
2693
|
+
runnable_pct as top_slice_runnable_pct,
|
|
2694
|
+
-- GPU / Shader
|
|
2695
|
+
ROUND(max_fence_dur_ns / 1e6, 2) as gpu_fence_ms,
|
|
2696
|
+
ROUND(total_fence_dur_ns / 1e6, 2) as gpu_fence_total_ms,
|
|
2697
|
+
shader_count,
|
|
2698
|
+
ROUND(total_shader_dur_ns / 1e6, 2) as shader_ms,
|
|
2699
|
+
-- Binder/GC
|
|
2700
|
+
binder_overlap_ms,
|
|
2701
|
+
gc_overlap_ms,
|
|
2702
|
+
gc_count,
|
|
2703
|
+
-- 帧预算参考
|
|
2704
|
+
frame_budget_ms,
|
|
2705
|
+
-- 设备峰值频率(温控/限频参考)
|
|
2706
|
+
device_peak_freq_mhz,
|
|
2707
|
+
-- 文件 IO 重叠
|
|
2708
|
+
file_io_overlap_ms,
|
|
2709
|
+
-- 批量详情 JSON 列(供展开行使用)
|
|
2710
|
+
cpu_freq_clusters_json,
|
|
2711
|
+
freq_timeline_json,
|
|
2712
|
+
main_slices_json,
|
|
2713
|
+
render_slices_json,
|
|
2714
|
+
binder_calls_json,
|
|
2715
|
+
gc_events_json,
|
|
2716
|
+
lock_contention_json
|
|
2717
|
+
FROM classified
|
|
2718
|
+
ORDER BY session_id, frame_start
|
|
2719
|
+
save_as: batch_root_cause
|
|
2720
|
+
condition: "frame_timeline.data[0]?.has_frame_timeline === 1 && environment?.data?.[0]?.has_data === 1 && ((perf_summary?.data?.[0]?.janky_frames || 0) > 0 || (jank_stats?.data?.[0]?.real_jank_count || 0) > 0)"
|
|
2721
|
+
|
|
2722
|
+
# ==========================================================================
|
|
2723
|
+
# L0: 全局上下文标志(非帧级根因,场景过滤器 / 干扰检测)
|
|
2724
|
+
# 用于 Agent 在 Phase 1.3 中修饰和过滤帧级结论
|
|
2725
|
+
# ==========================================================================
|
|
2726
|
+
- id: global_context_flags
|
|
2727
|
+
type: atomic
|
|
2728
|
+
name: "全局上下文标志"
|
|
2729
|
+
optional: true
|
|
2730
|
+
display:
|
|
2731
|
+
level: hidden
|
|
2732
|
+
sql: |
|
|
2733
|
+
WITH
|
|
2734
|
+
-- 1. 视频解码活动检测:滑动期间是否有 MediaCodec/视频线程活跃
|
|
2735
|
+
video_check AS (
|
|
2736
|
+
SELECT COUNT(*) as video_slice_count
|
|
2737
|
+
FROM slice s
|
|
2738
|
+
JOIN thread_track tt ON s.track_id = tt.id
|
|
2739
|
+
JOIN thread t ON tt.utid = t.utid
|
|
2740
|
+
WHERE (t.name GLOB '*MediaCodec*' OR t.name GLOB '*CodecLooper*'
|
|
2741
|
+
OR t.name GLOB '*VideoDecoder*' OR t.name GLOB '*NuPlayer*'
|
|
2742
|
+
OR s.name GLOB '*queueVideoBuffer*' OR s.name GLOB '*onOutputBufferAvailable*')
|
|
2743
|
+
AND (${start_ts} IS NULL OR s.ts >= ${start_ts})
|
|
2744
|
+
AND (${end_ts} IS NULL OR s.ts + s.dur < ${end_ts})
|
|
2745
|
+
AND s.dur > 100000
|
|
2746
|
+
),
|
|
2747
|
+
-- 2. 插帧帧数检测:frame_id = -1 通常是 OEM 插帧功能
|
|
2748
|
+
interpolation_check AS (
|
|
2749
|
+
SELECT COUNT(*) as interpolation_frame_count
|
|
2750
|
+
FROM actual_frame_timeline_slice a
|
|
2751
|
+
LEFT JOIN process p ON a.upid = p.upid
|
|
2752
|
+
WHERE (p.name GLOB '${package}*' OR '${package}' = '')
|
|
2753
|
+
AND p.name NOT LIKE '/system/%'
|
|
2754
|
+
AND COALESCE(a.display_frame_token, -999) = -1
|
|
2755
|
+
AND (${start_ts} IS NULL OR a.ts >= ${start_ts})
|
|
2756
|
+
AND (${end_ts} IS NULL OR a.ts < ${end_ts})
|
|
2757
|
+
),
|
|
2758
|
+
-- 3. 温控活跃检测:trace 中是否有明显的频率天花板下降
|
|
2759
|
+
-- 对比全程峰值 vs 尾部 2s 内最低值,检测持续降频趋势
|
|
2760
|
+
cpufreq_tail_threshold AS (
|
|
2761
|
+
SELECT MAX(c.ts) - 2000000000 AS threshold
|
|
2762
|
+
FROM counter c
|
|
2763
|
+
JOIN cpu_counter_track cct ON c.track_id = cct.id AND cct.name = 'cpufreq'
|
|
2764
|
+
LEFT JOIN _cpu_topology ct ON cct.cpu = ct.cpu_id
|
|
2765
|
+
WHERE ct.core_type IN ('prime', 'big')
|
|
2766
|
+
AND (${start_ts} IS NULL OR c.ts >= ${start_ts})
|
|
2767
|
+
AND (${end_ts} IS NULL OR c.ts < ${end_ts})
|
|
2768
|
+
),
|
|
2769
|
+
thermal_check AS (
|
|
2770
|
+
SELECT
|
|
2771
|
+
COALESCE(ROUND(MAX(c.value) / 1000, 0), 0) as trace_peak_freq_mhz,
|
|
2772
|
+
COALESCE(ROUND(MIN(
|
|
2773
|
+
CASE WHEN c.ts > (SELECT threshold FROM cpufreq_tail_threshold) THEN c.value END
|
|
2774
|
+
) / 1000, 0), 0) as tail_min_freq_mhz
|
|
2775
|
+
FROM counter c
|
|
2776
|
+
JOIN cpu_counter_track cct ON c.track_id = cct.id AND cct.name = 'cpufreq'
|
|
2777
|
+
LEFT JOIN _cpu_topology ct ON cct.cpu = ct.cpu_id
|
|
2778
|
+
WHERE ct.core_type IN ('prime', 'big')
|
|
2779
|
+
AND (${start_ts} IS NULL OR c.ts >= ${start_ts})
|
|
2780
|
+
AND (${end_ts} IS NULL OR c.ts < ${end_ts})
|
|
2781
|
+
),
|
|
2782
|
+
-- 4. 非 App 大核 CPU 占用(后台干扰指标)
|
|
2783
|
+
background_cpu AS (
|
|
2784
|
+
SELECT
|
|
2785
|
+
ROUND(100.0 * SUM(CASE WHEN '${package}' != '' AND p.name NOT GLOB '${package}*' AND ts.state = 'Running' THEN ts.dur ELSE 0 END)
|
|
2786
|
+
/ NULLIF(SUM(CASE WHEN ts.state = 'Running' THEN ts.dur ELSE 0 END), 0), 1) as non_app_big_core_pct
|
|
2787
|
+
FROM thread_state ts
|
|
2788
|
+
JOIN thread t ON ts.utid = t.utid
|
|
2789
|
+
JOIN process p ON t.upid = p.upid
|
|
2790
|
+
LEFT JOIN _cpu_topology ct ON ts.cpu = ct.cpu_id
|
|
2791
|
+
WHERE ct.core_type IN ('prime', 'big')
|
|
2792
|
+
AND (${start_ts} IS NULL OR ts.ts >= ${start_ts})
|
|
2793
|
+
AND (${end_ts} IS NULL OR ts.ts < ${end_ts})
|
|
2794
|
+
AND ts.dur > 0
|
|
2795
|
+
)
|
|
2796
|
+
SELECT
|
|
2797
|
+
CASE WHEN COALESCE(v.video_slice_count, 0) > 20 THEN 1 ELSE 0 END as video_during_scroll,
|
|
2798
|
+
COALESCE(v.video_slice_count, 0) as video_slice_count,
|
|
2799
|
+
COALESCE(i.interpolation_frame_count, 0) as interpolation_frame_count,
|
|
2800
|
+
CASE WHEN COALESCE(i.interpolation_frame_count, 0) > 10 THEN 1 ELSE 0 END as interpolation_active,
|
|
2801
|
+
th.trace_peak_freq_mhz,
|
|
2802
|
+
th.tail_min_freq_mhz,
|
|
2803
|
+
-- thermal_trending 仅在分析窗口 >5s 时有效(短 trace 正常 governor 波动会误报)
|
|
2804
|
+
CASE WHEN th.trace_peak_freq_mhz > 0 AND th.tail_min_freq_mhz > 0
|
|
2805
|
+
AND th.tail_min_freq_mhz < th.trace_peak_freq_mhz * 0.70
|
|
2806
|
+
AND (SELECT threshold FROM cpufreq_tail_threshold) > COALESCE(${start_ts}, 0)
|
|
2807
|
+
THEN 1 ELSE 0 END as thermal_trending,
|
|
2808
|
+
COALESCE(bg.non_app_big_core_pct, 0) as non_app_big_core_pct,
|
|
2809
|
+
CASE WHEN COALESCE(bg.non_app_big_core_pct, 0) > 60 THEN 1 ELSE 0 END as background_cpu_heavy
|
|
2810
|
+
FROM video_check v, interpolation_check i, thermal_check th, background_cpu bg
|
|
2811
|
+
save_as: global_context
|
|
2812
|
+
|
|
2813
|
+
# ==========================================================================
|
|
2814
|
+
# L2: Session-Level Quadrant Distribution (MainThread + RenderThread)
|
|
2815
|
+
# 滑动过程整体四象限,非逐帧
|
|
2816
|
+
# ==========================================================================
|
|
2817
|
+
- id: session_quadrant_summary
|
|
2818
|
+
type: atomic
|
|
2819
|
+
name: "滑动过程四象限分布"
|
|
2820
|
+
optional: true
|
|
2821
|
+
display: false # UI 已迁移到 scroll_sessions 展开行;此步骤保留供 Agent 引用 save_as 数据
|
|
2822
|
+
sql: |
|
|
2823
|
+
WITH main_quadrant AS (
|
|
2824
|
+
SELECT
|
|
2825
|
+
SUM(CASE WHEN ts.state = 'Running' AND COALESCE(ct.core_type, 'unknown') IN ('prime', 'big') THEN ts.dur ELSE 0 END) as q1_ns,
|
|
2826
|
+
SUM(CASE WHEN ts.state = 'Running' AND COALESCE(ct.core_type, 'unknown') IN ('medium', 'little') THEN ts.dur ELSE 0 END) as q2_ns,
|
|
2827
|
+
SUM(CASE WHEN ts.state = 'R' THEN ts.dur ELSE 0 END) as q3_ns,
|
|
2828
|
+
SUM(CASE WHEN ts.state IN ('D', 'DK') THEN ts.dur ELSE 0 END) as q4a_ns,
|
|
2829
|
+
SUM(CASE WHEN ts.state IN ('S', 'I') THEN ts.dur ELSE 0 END) as q4b_ns,
|
|
2830
|
+
SUM(ts.dur) as total_ns
|
|
2831
|
+
FROM thread_state ts
|
|
2832
|
+
JOIN thread t ON ts.utid = t.utid
|
|
2833
|
+
JOIN process p ON t.upid = p.upid
|
|
2834
|
+
LEFT JOIN _cpu_topology ct ON ts.cpu = ct.cpu_id
|
|
2835
|
+
WHERE (p.name GLOB '${package}*' OR '${package}' = '')
|
|
2836
|
+
AND p.name NOT LIKE '/system/%'
|
|
2837
|
+
AND t.tid = p.pid
|
|
2838
|
+
AND (${start_ts} IS NULL OR ts.ts >= ${start_ts})
|
|
2839
|
+
AND (${end_ts} IS NULL OR ts.ts < ${end_ts})
|
|
2840
|
+
),
|
|
2841
|
+
render_quadrant AS (
|
|
2842
|
+
SELECT
|
|
2843
|
+
SUM(CASE WHEN ts.state = 'Running' AND COALESCE(ct.core_type, 'unknown') IN ('prime', 'big') THEN ts.dur ELSE 0 END) as q1_ns,
|
|
2844
|
+
SUM(CASE WHEN ts.state = 'Running' AND COALESCE(ct.core_type, 'unknown') IN ('medium', 'little') THEN ts.dur ELSE 0 END) as q2_ns,
|
|
2845
|
+
SUM(CASE WHEN ts.state = 'R' THEN ts.dur ELSE 0 END) as q3_ns,
|
|
2846
|
+
SUM(CASE WHEN ts.state IN ('D', 'DK') THEN ts.dur ELSE 0 END) as q4a_ns,
|
|
2847
|
+
SUM(CASE WHEN ts.state IN ('S', 'I') THEN ts.dur ELSE 0 END) as q4b_ns,
|
|
2848
|
+
SUM(ts.dur) as total_ns
|
|
2849
|
+
FROM thread_state ts
|
|
2850
|
+
JOIN thread t ON ts.utid = t.utid
|
|
2851
|
+
JOIN process p ON t.upid = p.upid
|
|
2852
|
+
LEFT JOIN _cpu_topology ct ON ts.cpu = ct.cpu_id
|
|
2853
|
+
WHERE (p.name GLOB '${package}*' OR '${package}' = '')
|
|
2854
|
+
AND p.name NOT LIKE '/system/%'
|
|
2855
|
+
AND t.name = 'RenderThread'
|
|
2856
|
+
AND (${start_ts} IS NULL OR ts.ts >= ${start_ts})
|
|
2857
|
+
AND (${end_ts} IS NULL OR ts.ts < ${end_ts})
|
|
2858
|
+
)
|
|
2859
|
+
SELECT 'MainThread' as thread,
|
|
2860
|
+
ROUND(100.0 * q1_ns / NULLIF(total_ns, 0), 1) as q1_big_pct,
|
|
2861
|
+
ROUND(100.0 * q2_ns / NULLIF(total_ns, 0), 1) as q2_little_pct,
|
|
2862
|
+
ROUND(100.0 * q3_ns / NULLIF(total_ns, 0), 1) as q3_runnable_pct,
|
|
2863
|
+
ROUND(100.0 * q4a_ns / NULLIF(total_ns, 0), 1) as q4a_io_pct,
|
|
2864
|
+
ROUND(100.0 * q4b_ns / NULLIF(total_ns, 0), 1) as q4b_sleep_pct,
|
|
2865
|
+
ROUND(total_ns / 1e6, 2) as total_ms
|
|
2866
|
+
FROM main_quadrant
|
|
2867
|
+
UNION ALL
|
|
2868
|
+
SELECT 'RenderThread' as thread,
|
|
2869
|
+
ROUND(100.0 * q1_ns / NULLIF(total_ns, 0), 1) as q1_big_pct,
|
|
2870
|
+
ROUND(100.0 * q2_ns / NULLIF(total_ns, 0), 1) as q2_little_pct,
|
|
2871
|
+
ROUND(100.0 * q3_ns / NULLIF(total_ns, 0), 1) as q3_runnable_pct,
|
|
2872
|
+
ROUND(100.0 * q4a_ns / NULLIF(total_ns, 0), 1) as q4a_io_pct,
|
|
2873
|
+
ROUND(100.0 * q4b_ns / NULLIF(total_ns, 0), 1) as q4b_sleep_pct,
|
|
2874
|
+
ROUND(total_ns / 1e6, 2) as total_ms
|
|
2875
|
+
FROM render_quadrant
|
|
2876
|
+
save_as: session_quadrant
|
|
2877
|
+
condition: "frame_timeline.data[0]?.has_frame_timeline === 1 && (perf_summary?.data?.[0]?.total_frames || 0) > 0"
|
|
2878
|
+
|
|
2879
|
+
# ==========================================================================
|
|
2880
|
+
# L2: Session-Level CPU Frequency Distribution
|
|
2881
|
+
# 滑动过程整体 CPU 频率,按核心类型分组
|
|
2882
|
+
# ==========================================================================
|
|
2883
|
+
- id: session_cpu_freq
|
|
2884
|
+
type: atomic
|
|
2885
|
+
name: "滑动过程 CPU 频率"
|
|
2886
|
+
optional: true
|
|
2887
|
+
display: false # UI 已迁移到 scroll_sessions 展开行;此步骤保留供 Agent 引用 save_as 数据
|
|
2888
|
+
sql: |
|
|
2889
|
+
SELECT
|
|
2890
|
+
ct.core_type,
|
|
2891
|
+
COUNT(DISTINCT cct.cpu) as num_cores,
|
|
2892
|
+
ROUND(AVG(c.value) / 1000, 0) as avg_freq_mhz,
|
|
2893
|
+
ROUND(MAX(c.value) / 1000, 0) as max_freq_mhz,
|
|
2894
|
+
ROUND(MIN(c.value) / 1000, 0) as min_freq_mhz
|
|
2895
|
+
FROM counter c
|
|
2896
|
+
JOIN cpu_counter_track cct ON c.track_id = cct.id
|
|
2897
|
+
JOIN _cpu_topology ct ON cct.cpu = ct.cpu_id
|
|
2898
|
+
WHERE cct.name = 'cpufreq'
|
|
2899
|
+
AND (${start_ts} IS NULL OR c.ts >= ${start_ts})
|
|
2900
|
+
AND (${end_ts} IS NULL OR c.ts < ${end_ts})
|
|
2901
|
+
GROUP BY ct.core_type
|
|
2902
|
+
ORDER BY max_freq_mhz DESC
|
|
2903
|
+
save_as: session_freq
|
|
2904
|
+
condition: "frame_timeline.data[0]?.has_frame_timeline === 1 && (perf_summary?.data?.[0]?.total_frames || 0) > 0"
|
|
2905
|
+
|
|
2906
|
+
# ==========================================================================
|
|
2907
|
+
# L2: Session-Level Thread Core Affinity (Rendering-Related Threads)
|
|
2908
|
+
# 出图关键线程在各核心类型上的运行时间占比
|
|
2909
|
+
# ==========================================================================
|
|
2910
|
+
- id: session_thread_core_affinity
|
|
2911
|
+
type: atomic
|
|
2912
|
+
name: "关键线程大小核分布"
|
|
2913
|
+
optional: true
|
|
2914
|
+
display: false # UI 已迁移到 scroll_sessions 展开行;此步骤保留供 Agent 引用 save_as 数据
|
|
2915
|
+
sql: |
|
|
2916
|
+
WITH thread_runs AS (
|
|
2917
|
+
SELECT
|
|
2918
|
+
CASE WHEN t.tid = p.pid THEN 'MainThread' ELSE t.name END as thread_name,
|
|
2919
|
+
COALESCE(ct.core_type, 'unknown') as core_type,
|
|
2920
|
+
SUM(ts.dur) as run_dur_ns
|
|
2921
|
+
FROM thread_state ts
|
|
2922
|
+
JOIN thread t ON ts.utid = t.utid
|
|
2923
|
+
JOIN process p ON t.upid = p.upid
|
|
2924
|
+
LEFT JOIN _cpu_topology ct ON ts.cpu = ct.cpu_id
|
|
2925
|
+
WHERE (p.name GLOB '${package}*' OR '${package}' = '')
|
|
2926
|
+
AND p.name NOT LIKE '/system/%'
|
|
2927
|
+
AND ts.state = 'Running'
|
|
2928
|
+
AND (${start_ts} IS NULL OR ts.ts >= ${start_ts})
|
|
2929
|
+
AND (${end_ts} IS NULL OR ts.ts < ${end_ts})
|
|
2930
|
+
AND (t.tid = p.pid OR t.name IN ('RenderThread', 'GPU completion', 'hwuiTask0', 'hwuiTask1'))
|
|
2931
|
+
GROUP BY thread_name, core_type
|
|
2932
|
+
)
|
|
2933
|
+
SELECT
|
|
2934
|
+
thread_name,
|
|
2935
|
+
core_type,
|
|
2936
|
+
ROUND(run_dur_ns / 1e6, 2) as run_ms,
|
|
2937
|
+
ROUND(100.0 * run_dur_ns / NULLIF(SUM(run_dur_ns) OVER (PARTITION BY thread_name), 0), 1) as pct
|
|
2938
|
+
FROM thread_runs
|
|
2939
|
+
ORDER BY
|
|
2940
|
+
CASE thread_name
|
|
2941
|
+
WHEN 'MainThread' THEN 1
|
|
2942
|
+
WHEN 'RenderThread' THEN 2
|
|
2943
|
+
WHEN 'GPU completion' THEN 3
|
|
2944
|
+
ELSE 4
|
|
2945
|
+
END,
|
|
2946
|
+
run_dur_ns DESC
|
|
2947
|
+
save_as: session_core_affinity
|
|
2948
|
+
condition: "frame_timeline.data[0]?.has_frame_timeline === 1 && (perf_summary?.data?.[0]?.total_frames || 0) > 0"
|
|
2949
|
+
|
|
2950
|
+
# ==========================================================================
|
|
2951
|
+
# Root Cause Classification - Aggregate analysis for final conclusion
|
|
2952
|
+
# ==========================================================================
|
|
2953
|
+
# 综合所有分析数据,给出最终的根因分类和结论
|
|
2954
|
+
# 输出: problem_category, problem_component, confidence, evidence
|
|
2955
|
+
- id: root_cause_classification
|
|
2956
|
+
type: atomic
|
|
2957
|
+
name: "根因分类"
|
|
2958
|
+
optional: true
|
|
2959
|
+
synthesize:
|
|
2960
|
+
role: conclusion
|
|
2961
|
+
fields:
|
|
2962
|
+
- key: problem_category
|
|
2963
|
+
label: 问题类别
|
|
2964
|
+
- key: problem_component
|
|
2965
|
+
label: 问题组件
|
|
2966
|
+
- key: confidence
|
|
2967
|
+
label: 置信度
|
|
2968
|
+
format: "{{value}}%"
|
|
2969
|
+
insights:
|
|
2970
|
+
- template: "根因分类:{{problem_category}} - {{problem_component}}"
|
|
2971
|
+
display:
|
|
2972
|
+
level: summary
|
|
2973
|
+
layer: overview
|
|
2974
|
+
title: "🎯 分析结论"
|
|
2975
|
+
columns:
|
|
2976
|
+
- name: problem_category
|
|
2977
|
+
label: "问题类别"
|
|
2978
|
+
type: enum
|
|
2979
|
+
- name: problem_component
|
|
2980
|
+
label: "问题组件"
|
|
2981
|
+
type: string
|
|
2982
|
+
- name: confidence
|
|
2983
|
+
label: "置信度"
|
|
2984
|
+
type: percentage
|
|
2985
|
+
format: percentage
|
|
2986
|
+
- name: root_cause_summary
|
|
2987
|
+
label: "根因总结"
|
|
2988
|
+
type: string
|
|
2989
|
+
- name: suggestion
|
|
2990
|
+
label: "优化建议"
|
|
2991
|
+
type: string
|
|
2992
|
+
sql: |
|
|
2993
|
+
WITH
|
|
2994
|
+
-- 双信号混合掉帧检测(与 performance_summary/get_app_jank_frames 保持同口径)
|
|
2995
|
+
vsync_intervals AS (
|
|
2996
|
+
SELECT c.ts - LAG(c.ts) OVER (ORDER BY c.ts) as interval_ns
|
|
2997
|
+
FROM counter c
|
|
2998
|
+
JOIN counter_track t ON c.track_id = t.id
|
|
2999
|
+
WHERE t.name = 'VSYNC-sf'
|
|
3000
|
+
AND (${start_ts} IS NULL OR c.ts >= ${start_ts})
|
|
3001
|
+
AND (${end_ts} IS NULL OR c.ts < ${end_ts})
|
|
3002
|
+
),
|
|
3003
|
+
vsync_config AS (
|
|
3004
|
+
SELECT CASE
|
|
3005
|
+
WHEN raw_ns BETWEEN 5500000 AND 6500000 THEN 6060606
|
|
3006
|
+
WHEN raw_ns BETWEEN 6500001 AND 7500000 THEN 6944444
|
|
3007
|
+
WHEN raw_ns BETWEEN 7500001 AND 9500000 THEN 8333333
|
|
3008
|
+
WHEN raw_ns BETWEEN 9500001 AND 12500000 THEN 11111111
|
|
3009
|
+
WHEN raw_ns BETWEEN 12500001 AND 20000000 THEN 16666667
|
|
3010
|
+
WHEN raw_ns BETWEEN 20000001 AND 35000000 THEN 33333333
|
|
3011
|
+
ELSE raw_ns
|
|
3012
|
+
END AS vsync_period_ns
|
|
3013
|
+
FROM (
|
|
3014
|
+
SELECT CAST(COALESCE(
|
|
3015
|
+
(SELECT PERCENTILE(interval_ns, 0.5)
|
|
3016
|
+
FROM vsync_intervals
|
|
3017
|
+
WHERE interval_ns > 5500000 AND interval_ns < 50000000),
|
|
3018
|
+
16666667
|
|
3019
|
+
) AS INTEGER) AS raw_ns
|
|
3020
|
+
)
|
|
3021
|
+
),
|
|
3022
|
+
-- 掉帧检测:双信号混合策略
|
|
3023
|
+
frame_jank_data AS (
|
|
3024
|
+
SELECT
|
|
3025
|
+
a.jank_type,
|
|
3026
|
+
COALESCE(a.present_type, 'Unknown Present') as present_type,
|
|
3027
|
+
a.ts + CASE WHEN a.dur > 0 THEN a.dur ELSE 0 END as present_ts,
|
|
3028
|
+
LAG(a.ts + CASE WHEN a.dur > 0 THEN a.dur ELSE 0 END)
|
|
3029
|
+
OVER (PARTITION BY a.layer_name ORDER BY a.ts) as prev_present_ts,
|
|
3030
|
+
a.ts - LAG(a.ts + a.dur)
|
|
3031
|
+
OVER (PARTITION BY a.layer_name ORDER BY a.ts) as time_gap_ns
|
|
3032
|
+
FROM actual_frame_timeline_slice a
|
|
3033
|
+
LEFT JOIN process p ON a.upid = p.upid
|
|
3034
|
+
WHERE (p.name GLOB '${package}*' OR '${package}' = '')
|
|
3035
|
+
AND p.name NOT LIKE '/system/%'
|
|
3036
|
+
AND (${start_ts} IS NULL OR a.ts >= ${start_ts})
|
|
3037
|
+
AND (${end_ts} IS NULL OR a.ts < ${end_ts})
|
|
3038
|
+
AND COALESCE(a.display_frame_token, a.surface_frame_token) IS NOT NULL
|
|
3039
|
+
),
|
|
3040
|
+
token_gap_jank AS (
|
|
3041
|
+
SELECT
|
|
3042
|
+
-- 感知掉帧总数:双信号混合检测
|
|
3043
|
+
SUM(CASE
|
|
3044
|
+
WHEN present_type IN ('Late Present', 'Dropped Frame')
|
|
3045
|
+
AND jank_type != 'Buffer Stuffing' THEN 1
|
|
3046
|
+
WHEN jank_type = 'Buffer Stuffing'
|
|
3047
|
+
AND prev_present_ts IS NOT NULL
|
|
3048
|
+
AND present_ts - prev_present_ts > (SELECT vsync_period_ns FROM vsync_config) * 1.5
|
|
3049
|
+
AND present_ts - prev_present_ts <= (SELECT vsync_period_ns FROM vsync_config) * 6
|
|
3050
|
+
AND (time_gap_ns IS NULL OR time_gap_ns <= (SELECT vsync_period_ns FROM vsync_config) * 6) THEN 1
|
|
3051
|
+
ELSE 0 END) as total_jank_count,
|
|
3052
|
+
-- App 侧掉帧(BS 帧的 jank_type 不可能是 Self Jank/App Deadline Missed)
|
|
3053
|
+
SUM(CASE WHEN present_type IN ('Late Present', 'Dropped Frame')
|
|
3054
|
+
AND jank_type IN ('Self Jank', 'App Deadline Missed') THEN 1 ELSE 0 END) as app_jank_count,
|
|
3055
|
+
SUM(CASE WHEN present_type IN ('Late Present', 'Dropped Frame')
|
|
3056
|
+
AND jank_type GLOB '*SurfaceFlinger*' THEN 1 ELSE 0 END) as sf_jank_count
|
|
3057
|
+
FROM frame_jank_data
|
|
3058
|
+
),
|
|
3059
|
+
app_frames AS (
|
|
3060
|
+
SELECT
|
|
3061
|
+
COUNT(*) as total_frames,
|
|
3062
|
+
SUM(CASE WHEN jank_type != 'None' THEN 1 ELSE 0 END) as app_reported_jank,
|
|
3063
|
+
AVG(CASE WHEN dur > 0 THEN dur ELSE NULL END) / 1e6 as avg_dur_ms,
|
|
3064
|
+
MAX(CASE WHEN dur > 0 THEN dur ELSE NULL END) / 1e6 as max_dur_ms
|
|
3065
|
+
FROM actual_frame_timeline_slice a
|
|
3066
|
+
LEFT JOIN process p ON a.upid = p.upid
|
|
3067
|
+
WHERE (p.name GLOB '${package}*' OR '${package}' = '')
|
|
3068
|
+
AND p.name NOT LIKE '/system/%'
|
|
3069
|
+
AND (${start_ts} IS NULL OR a.ts >= ${start_ts})
|
|
3070
|
+
AND (${end_ts} IS NULL OR a.ts < ${end_ts})
|
|
3071
|
+
AND COALESCE(a.display_frame_token, a.surface_frame_token) IS NOT NULL
|
|
3072
|
+
),
|
|
3073
|
+
jank_stats AS (
|
|
3074
|
+
SELECT
|
|
3075
|
+
(SELECT total_frames FROM app_frames) as total_frames,
|
|
3076
|
+
(SELECT app_reported_jank FROM app_frames) as app_reported_jank,
|
|
3077
|
+
COALESCE((SELECT app_jank_count FROM token_gap_jank), 0) as app_jank,
|
|
3078
|
+
COALESCE((SELECT sf_jank_count FROM token_gap_jank), 0) as sf_jank,
|
|
3079
|
+
COALESCE((SELECT sf_jank_count FROM token_gap_jank), 0) as buffer_jank,
|
|
3080
|
+
(SELECT avg_dur_ms FROM app_frames) as avg_dur_ms,
|
|
3081
|
+
(SELECT max_dur_ms FROM app_frames) as max_dur_ms,
|
|
3082
|
+
ROUND((SELECT vsync_period_ns FROM vsync_config) / 1e6, 2) as frame_budget_ms
|
|
3083
|
+
),
|
|
3084
|
+
-- 主线程四象限分析
|
|
3085
|
+
main_thread_analysis AS (
|
|
3086
|
+
SELECT
|
|
3087
|
+
SUM(CASE WHEN ts.state = 'Running' AND COALESCE(ct.core_type, 'unknown') IN ('prime', 'big') THEN ts.dur ELSE 0 END) as q1_big_core_ns,
|
|
3088
|
+
SUM(CASE WHEN ts.state = 'Running' AND COALESCE(ct.core_type, 'unknown') IN ('medium', 'little') THEN ts.dur ELSE 0 END) as q2_small_core_ns,
|
|
3089
|
+
SUM(CASE WHEN ts.state = 'R' THEN ts.dur ELSE 0 END) as q3_runnable_ns,
|
|
3090
|
+
SUM(CASE WHEN ts.state IN ('S', 'D', 'DK', 'I') THEN ts.dur ELSE 0 END) as q4_sleep_ns,
|
|
3091
|
+
SUM(ts.dur) as total_dur_ns
|
|
3092
|
+
FROM thread_state ts
|
|
3093
|
+
JOIN thread t ON ts.utid = t.utid
|
|
3094
|
+
JOIN process p ON t.upid = p.upid
|
|
3095
|
+
LEFT JOIN _cpu_topology ct ON ts.cpu = ct.cpu_id
|
|
3096
|
+
WHERE (p.name GLOB '${package}*' OR '${package}' = '')
|
|
3097
|
+
AND p.name NOT LIKE '/system/%'
|
|
3098
|
+
AND t.tid = p.pid
|
|
3099
|
+
AND (${start_ts} IS NULL OR ts.ts >= ${start_ts})
|
|
3100
|
+
AND (${end_ts} IS NULL OR ts.ts < ${end_ts})
|
|
3101
|
+
),
|
|
3102
|
+
-- RenderThread 分析
|
|
3103
|
+
render_thread_analysis AS (
|
|
3104
|
+
SELECT
|
|
3105
|
+
SUM(CASE WHEN ts.state = 'Running' AND COALESCE(ct.core_type, 'unknown') IN ('prime', 'big') THEN ts.dur ELSE 0 END) as q1_big_core_ns,
|
|
3106
|
+
SUM(CASE WHEN ts.state = 'Running' AND COALESCE(ct.core_type, 'unknown') IN ('medium', 'little') THEN ts.dur ELSE 0 END) as q2_small_core_ns,
|
|
3107
|
+
SUM(CASE WHEN ts.state = 'R' THEN ts.dur ELSE 0 END) as q3_runnable_ns,
|
|
3108
|
+
SUM(CASE WHEN ts.state IN ('S', 'D', 'DK', 'I') THEN ts.dur ELSE 0 END) as q4_sleep_ns,
|
|
3109
|
+
SUM(ts.dur) as total_dur_ns
|
|
3110
|
+
FROM thread_state ts
|
|
3111
|
+
JOIN thread t ON ts.utid = t.utid
|
|
3112
|
+
JOIN process p ON t.upid = p.upid
|
|
3113
|
+
LEFT JOIN _cpu_topology ct ON ts.cpu = ct.cpu_id
|
|
3114
|
+
WHERE (p.name GLOB '${package}*' OR '${package}' = '')
|
|
3115
|
+
AND p.name NOT LIKE '/system/%'
|
|
3116
|
+
AND t.name = 'RenderThread'
|
|
3117
|
+
AND (${start_ts} IS NULL OR ts.ts >= ${start_ts})
|
|
3118
|
+
AND (${end_ts} IS NULL OR ts.ts < ${end_ts})
|
|
3119
|
+
),
|
|
3120
|
+
-- 计算主线程各象限百分比
|
|
3121
|
+
main_pct AS (
|
|
3122
|
+
SELECT
|
|
3123
|
+
ROUND(100.0 * q1_big_core_ns / NULLIF(total_dur_ns, 0), 1) as q1_pct,
|
|
3124
|
+
ROUND(100.0 * q2_small_core_ns / NULLIF(total_dur_ns, 0), 1) as q2_pct,
|
|
3125
|
+
ROUND(100.0 * q3_runnable_ns / NULLIF(total_dur_ns, 0), 1) as q3_pct,
|
|
3126
|
+
ROUND(100.0 * q4_sleep_ns / NULLIF(total_dur_ns, 0), 1) as q4_pct
|
|
3127
|
+
FROM main_thread_analysis
|
|
3128
|
+
),
|
|
3129
|
+
-- 计算 RenderThread 各象限百分比
|
|
3130
|
+
render_pct AS (
|
|
3131
|
+
SELECT
|
|
3132
|
+
ROUND(100.0 * q1_big_core_ns / NULLIF(total_dur_ns, 0), 1) as q1_pct,
|
|
3133
|
+
ROUND(100.0 * q2_small_core_ns / NULLIF(total_dur_ns, 0), 1) as q2_pct,
|
|
3134
|
+
ROUND(100.0 * q3_runnable_ns / NULLIF(total_dur_ns, 0), 1) as q3_pct,
|
|
3135
|
+
ROUND(100.0 * q4_sleep_ns / NULLIF(total_dur_ns, 0), 1) as q4_pct
|
|
3136
|
+
FROM render_thread_analysis
|
|
3137
|
+
),
|
|
3138
|
+
-- Binder 调用统计
|
|
3139
|
+
binder_stats AS (
|
|
3140
|
+
SELECT
|
|
3141
|
+
COUNT(*) as total_calls,
|
|
3142
|
+
SUM(client_dur) / 1e6 as total_dur_ms,
|
|
3143
|
+
MAX(client_dur) / 1e6 as max_dur_ms,
|
|
3144
|
+
AVG(client_dur) / 1e6 as avg_dur_ms
|
|
3145
|
+
FROM android_binder_txns
|
|
3146
|
+
WHERE (client_process GLOB '${package}*' OR '${package}' = '')
|
|
3147
|
+
AND (${start_ts} IS NULL OR client_ts >= ${start_ts})
|
|
3148
|
+
AND (${end_ts} IS NULL OR client_ts < ${end_ts})
|
|
3149
|
+
),
|
|
3150
|
+
-- 综合分析
|
|
3151
|
+
analysis AS (
|
|
3152
|
+
SELECT
|
|
3153
|
+
(SELECT total_frames FROM jank_stats) as total_frames,
|
|
3154
|
+
(SELECT app_jank FROM jank_stats) as app_jank,
|
|
3155
|
+
(SELECT sf_jank FROM jank_stats) as sf_jank,
|
|
3156
|
+
(SELECT buffer_jank FROM jank_stats) as buffer_jank,
|
|
3157
|
+
(SELECT avg_dur_ms FROM jank_stats) as avg_dur_ms,
|
|
3158
|
+
(SELECT max_dur_ms FROM jank_stats) as max_dur_ms,
|
|
3159
|
+
(SELECT frame_budget_ms FROM jank_stats) as frame_budget_ms,
|
|
3160
|
+
(SELECT q3_pct FROM main_pct) as main_q3_pct,
|
|
3161
|
+
(SELECT q4_pct FROM main_pct) as main_q4_pct,
|
|
3162
|
+
(SELECT q2_pct FROM main_pct) as main_q2_pct,
|
|
3163
|
+
(SELECT q4_pct FROM render_pct) as render_q4_pct,
|
|
3164
|
+
(SELECT total_dur_ms FROM binder_stats) as binder_total_ms,
|
|
3165
|
+
(SELECT max_dur_ms FROM binder_stats) as binder_max_ms
|
|
3166
|
+
)
|
|
3167
|
+
SELECT
|
|
3168
|
+
-- 问题分类: APP / SYSTEM / MIXED
|
|
3169
|
+
CASE
|
|
3170
|
+
WHEN (SELECT sf_jank FROM analysis) > (SELECT app_jank FROM analysis) * 2 THEN 'SYSTEM'
|
|
3171
|
+
WHEN (SELECT app_jank FROM analysis) > (SELECT sf_jank FROM analysis) * 2 THEN 'APP'
|
|
3172
|
+
WHEN (SELECT main_q3_pct FROM analysis) > 15 THEN 'SYSTEM'
|
|
3173
|
+
WHEN (SELECT main_q4_pct FROM analysis) > 30 AND (SELECT binder_max_ms FROM analysis) > 5 THEN 'MIXED'
|
|
3174
|
+
WHEN (SELECT app_jank FROM analysis) > 0 THEN 'APP'
|
|
3175
|
+
ELSE 'UNKNOWN'
|
|
3176
|
+
END as problem_category,
|
|
3177
|
+
-- 问题组件
|
|
3178
|
+
-- 注意:MAIN_THREAD_BLOCKING (休眠/阻塞) 与 MAIN_THREAD (耗时操作) 是互斥的
|
|
3179
|
+
-- Q4 > 30% 表示主线程大部分时间在等待,问题是"阻塞"
|
|
3180
|
+
-- 只有 Q4 <= 30% 且 avg_dur 超过当前 VSync 预算,才判定为"主线程耗时操作"
|
|
3181
|
+
CASE
|
|
3182
|
+
WHEN (SELECT sf_jank FROM analysis) > (SELECT app_jank FROM analysis) * 2 THEN 'SURFACE_FLINGER'
|
|
3183
|
+
WHEN (SELECT main_q3_pct FROM analysis) > 15 THEN 'CPU_SCHEDULING'
|
|
3184
|
+
WHEN (SELECT main_q4_pct FROM analysis) > 30 AND (SELECT binder_max_ms FROM analysis) > 5 THEN 'BINDER'
|
|
3185
|
+
WHEN (SELECT main_q4_pct FROM analysis) > 30 THEN 'MAIN_THREAD_BLOCKING'
|
|
3186
|
+
WHEN (SELECT render_q4_pct FROM analysis) > 50 THEN 'RENDER_THREAD'
|
|
3187
|
+
WHEN (SELECT main_q2_pct FROM analysis) > 50 THEN 'CPU_AFFINITY'
|
|
3188
|
+
WHEN (SELECT avg_dur_ms FROM analysis) > COALESCE((SELECT frame_budget_ms FROM analysis), 8.33)
|
|
3189
|
+
AND COALESCE((SELECT main_q4_pct FROM analysis), 0) <= 30 THEN 'MAIN_THREAD'
|
|
3190
|
+
ELSE 'UNKNOWN'
|
|
3191
|
+
END as problem_component,
|
|
3192
|
+
-- 置信度 (0-1)
|
|
3193
|
+
CASE
|
|
3194
|
+
WHEN (SELECT total_frames FROM analysis) < 10 THEN 0.3
|
|
3195
|
+
WHEN (SELECT sf_jank FROM analysis) > (SELECT app_jank FROM analysis) * 2 THEN 0.9
|
|
3196
|
+
WHEN (SELECT app_jank FROM analysis) > (SELECT sf_jank FROM analysis) * 2 THEN 0.85
|
|
3197
|
+
WHEN (SELECT main_q3_pct FROM analysis) > 20 THEN 0.8
|
|
3198
|
+
WHEN (SELECT main_q4_pct FROM analysis) > 40 THEN 0.8
|
|
3199
|
+
ELSE 0.6
|
|
3200
|
+
END as confidence,
|
|
3201
|
+
-- 根因总结
|
|
3202
|
+
CASE
|
|
3203
|
+
WHEN (SELECT sf_jank FROM analysis) > (SELECT app_jank FROM analysis) * 2 THEN
|
|
3204
|
+
'系统级问题: SurfaceFlinger 处理异常,导致 ' || (SELECT sf_jank FROM analysis) || ' 帧掉帧'
|
|
3205
|
+
WHEN (SELECT main_q3_pct FROM analysis) > 15 THEN
|
|
3206
|
+
'系统级问题: CPU 调度拥堵,主线程 ' || (SELECT main_q3_pct FROM analysis) || '% 时间在等待调度'
|
|
3207
|
+
WHEN (SELECT main_q4_pct FROM analysis) > 30 AND (SELECT binder_max_ms FROM analysis) > 5 THEN
|
|
3208
|
+
'跨进程阻塞: Binder 调用最大耗时 ' || ROUND((SELECT binder_max_ms FROM analysis), 1) || 'ms'
|
|
3209
|
+
WHEN (SELECT main_q4_pct FROM analysis) > 30 THEN
|
|
3210
|
+
'主线程阻塞: ' || (SELECT main_q4_pct FROM analysis) || '% 时间在休眠/等待'
|
|
3211
|
+
WHEN (SELECT render_q4_pct FROM analysis) > 50 THEN
|
|
3212
|
+
'RenderThread 等待: ' || (SELECT render_q4_pct FROM analysis) || '% 时间在休眠'
|
|
3213
|
+
WHEN (SELECT main_q2_pct FROM analysis) > 50 THEN
|
|
3214
|
+
'CPU 亲和性问题: 主线程 ' || (SELECT main_q2_pct FROM analysis) || '% 时间运行在小核'
|
|
3215
|
+
WHEN (SELECT app_jank FROM analysis) > 0 THEN
|
|
3216
|
+
'应用级问题: ' || (SELECT app_jank FROM analysis) || ' 帧因应用原因掉帧,平均帧耗时 ' || ROUND((SELECT avg_dur_ms FROM analysis), 1) || 'ms'
|
|
3217
|
+
ELSE
|
|
3218
|
+
'分析数据不足,建议查看详细帧数据'
|
|
3219
|
+
END as root_cause_summary,
|
|
3220
|
+
-- 证据列表 (JSON 数组)
|
|
3221
|
+
'[' ||
|
|
3222
|
+
'"总帧数: ' || (SELECT total_frames FROM analysis) || '",' ||
|
|
3223
|
+
'"App 掉帧: ' || (SELECT app_jank FROM analysis) || '",' ||
|
|
3224
|
+
'"SF 掉帧: ' || (SELECT sf_jank FROM analysis) || '",' ||
|
|
3225
|
+
'"主线程 Q3 (等待调度): ' || COALESCE((SELECT main_q3_pct FROM analysis), 0) || '%",' ||
|
|
3226
|
+
'"主线程 Q4 (休眠阻塞): ' || COALESCE((SELECT main_q4_pct FROM analysis), 0) || '%",' ||
|
|
3227
|
+
'"Binder 最大耗时: ' || COALESCE(ROUND((SELECT binder_max_ms FROM analysis), 1), 0) || 'ms"' ||
|
|
3228
|
+
']' as evidence,
|
|
3229
|
+
-- 优化建议
|
|
3230
|
+
CASE
|
|
3231
|
+
WHEN (SELECT sf_jank FROM analysis) > (SELECT app_jank FROM analysis) * 2 THEN
|
|
3232
|
+
'检查系统负载和 SurfaceFlinger 状态'
|
|
3233
|
+
WHEN (SELECT main_q3_pct FROM analysis) > 15 THEN
|
|
3234
|
+
'减少后台任务,考虑提高主线程优先级'
|
|
3235
|
+
WHEN (SELECT main_q4_pct FROM analysis) > 30 AND (SELECT binder_max_ms FROM analysis) > 5 THEN
|
|
3236
|
+
'优化 Binder 调用,考虑异步化或缓存'
|
|
3237
|
+
WHEN (SELECT main_q4_pct FROM analysis) > 30 THEN
|
|
3238
|
+
'检查主线程阻塞原因 (IO/锁/Binder)'
|
|
3239
|
+
WHEN (SELECT render_q4_pct FROM analysis) > 50 THEN
|
|
3240
|
+
'优化绘制流程,减少主线程耗时操作'
|
|
3241
|
+
WHEN (SELECT main_q2_pct FROM analysis) > 50 THEN
|
|
3242
|
+
'考虑使用 setThreadAffinity 或提高线程优先级'
|
|
3243
|
+
ELSE
|
|
3244
|
+
'查看详细帧分析,定位具体问题'
|
|
3245
|
+
END as suggestion
|
|
3246
|
+
save_as: conclusion
|
|
3247
|
+
condition: "frame_timeline.data[0]?.has_frame_timeline === 1 && (perf_summary?.data?.[0]?.total_frames || 0) > 0 && enable_frame_details === true"
|
|
3248
|
+
|
|
3249
|
+
# ==========================================================================
|
|
3250
|
+
# Fallback: 当 FrameTimeline 数据不可用时提供基础信息
|
|
3251
|
+
# ==========================================================================
|
|
3252
|
+
- id: fallback_no_frame_timeline
|
|
3253
|
+
type: atomic
|
|
3254
|
+
name: "数据源不可用提示"
|
|
3255
|
+
condition: "frame_timeline.data[0]?.has_frame_timeline === 0"
|
|
3256
|
+
display:
|
|
3257
|
+
level: summary
|
|
3258
|
+
layer: overview
|
|
3259
|
+
title: "滑动分析 - 数据源缺失"
|
|
3260
|
+
columns:
|
|
3261
|
+
- name: status
|
|
3262
|
+
label: "状态"
|
|
3263
|
+
type: string
|
|
3264
|
+
- name: missing_table
|
|
3265
|
+
label: "缺失数据表"
|
|
3266
|
+
type: string
|
|
3267
|
+
- name: suggestion
|
|
3268
|
+
label: "建议"
|
|
3269
|
+
type: string
|
|
3270
|
+
sql: |
|
|
3271
|
+
SELECT
|
|
3272
|
+
'⚠️ 无法执行帧分析' as status,
|
|
3273
|
+
'actual_frame_timeline_slice' as missing_table,
|
|
3274
|
+
'请确保 trace 采集时启用了 Frame Timeline (需要 Android 12+ 且开启 Choreographer tracing)' as suggestion
|
|
3275
|
+
UNION ALL
|
|
3276
|
+
SELECT
|
|
3277
|
+
'ℹ️ 可用替代方案' as status,
|
|
3278
|
+
CASE
|
|
3279
|
+
WHEN EXISTS (SELECT 1 FROM sqlite_master WHERE type='table' AND name='frame_slice') THEN 'frame_slice (可用)'
|
|
3280
|
+
ELSE 'frame_slice (不可用)'
|
|
3281
|
+
END as missing_table,
|
|
3282
|
+
'可尝试使用 frame_slice 进行基础帧耗时分析' as suggestion
|
|
3283
|
+
save_as: fallback_info
|
|
3284
|
+
|
|
3285
|
+
output:
|
|
3286
|
+
format: layered
|
|
3287
|
+
default_expanded: [overview, list]
|
|
3288
|
+
# 结论输出映射
|
|
3289
|
+
conclusion:
|
|
3290
|
+
category: $conclusion.problem_category
|
|
3291
|
+
component: $conclusion.problem_component
|
|
3292
|
+
confidence: $conclusion.confidence
|
|
3293
|
+
summary: $conclusion.root_cause_summary
|
|
3294
|
+
evidence: $conclusion.evidence
|
|
3295
|
+
suggestion: $conclusion.suggestion
|