@ohos-cpf/3rdloop 0.0.2 → 0.0.4
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/README.md +290 -244
- package/bin/3rdloop.mjs +46 -46
- package/lib/cli.js +781 -781
- package/lib/config-cmd.js +451 -451
- package/lib/config.js +318 -318
- package/lib/doctor.js +113 -113
- package/lib/exit-codes.js +30 -30
- package/lib/opencode.js +155 -155
- package/lib/orch.js +426 -426
- package/lib/queries.js +263 -263
- package/lib/step.js +325 -325
- package/lib/ui.js +222 -222
- package/lib/update.js +279 -279
- package/lib/workflow.js +308 -308
- package/lib/workflows.js +131 -131
- package/package.json +50 -50
- package/vendor/Server/Agent/SkillSelector/README.md +343 -343
- package/vendor/Server/Agent/SkillSelector/core/Agent.js +207 -207
- package/vendor/Server/Agent/SkillSelector/index.js +14 -14
- package/vendor/Server/Agent/SkillSelector/llm/llmClient.js +313 -313
- package/vendor/Server/Agent/SkillSelector/llm/prompts.js +161 -161
- package/vendor/Server/Agent/SkillSelector/llm/reactSteps.js +144 -144
- package/vendor/Server/Agent/SkillSelector/matcher/fuzzyMatcher.js +433 -433
- package/vendor/Server/Agent/SkillSelector/scanner/skillScanner.js +382 -382
- package/vendor/Server/Agent/SkillSelector/utils/actionWords.js +59 -59
- package/vendor/Server/Brain/AnalysisStrategies.js +422 -422
- package/vendor/Server/Brain/Brain.js +686 -686
- package/vendor/Server/Brain/DecompositionStrategies.js +621 -621
- package/vendor/Server/Brain/PlanPersistence.js +196 -196
- package/vendor/Server/Brain/SkillExecutor.js +251 -251
- package/vendor/Server/Brain/index.js +11 -11
- package/vendor/Server/CLI/cli.js +275 -275
- package/vendor/Server/CLI/deveco-code/index.js +71 -71
- package/vendor/Server/CLI/deveco-code.js +5 -5
- package/vendor/Server/CLI/opencode/index.js +817 -818
- package/vendor/Server/CLI/opencode.js +5 -5
- package/vendor/Server/DbUse/MessageArchive.js +61 -61
- package/vendor/Server/DbUse/StorageManager.js +107 -107
- package/vendor/Server/DbUse/adapters/BaseAdapter.js +94 -94
- package/vendor/Server/DbUse/adapters/FileAdapter.js +138 -138
- package/vendor/Server/DbUse/adapters/JsonAdapter.js +138 -138
- package/vendor/Server/DbUse/adapters/JsonlAdapter.js +114 -114
- package/vendor/Server/DbUse/adapters/SqliteAdapter.js +157 -157
- package/vendor/Server/DbUse/index.js +160 -160
- package/vendor/Server/DbUse/stores/SessionStore.js +279 -279
- package/vendor/Server/DbUse/stores/TaskExecutionStore.js +133 -133
- package/vendor/Server/DbUse/stores/TaskRegistryStore.js +262 -262
- package/vendor/Server/DbUse/stores/TaskStepStore.js +279 -279
- package/vendor/Server/FlexRunner/FlexRunner.js +1759 -1759
- package/vendor/Server/FlexRunner/index.js +12 -12
- package/vendor/Server/Knowledge/KnowledgeImporter.js +523 -523
- package/vendor/Server/Knowledge/KnowledgeManager.js +341 -341
- package/vendor/Server/Knowledge/index.js +33 -33
- package/vendor/Server/LoopEngine/LoopEngine.js +1133 -1133
- package/vendor/Server/LoopEngine/index.js +11 -11
- package/vendor/Server/Orchestrator/Orchestrator.js +0 -3
- package/vendor/Server/Orchestrator/StepNode.js +312 -312
- package/vendor/Server/Orchestrator/index.js +13 -13
- package/vendor/Server/Routes/controllers/BrainController.js +241 -241
- package/vendor/Server/Routes/controllers/FlexRunnerController.js +1125 -1125
- package/vendor/Server/Routes/controllers/HealthController.js +44 -44
- package/vendor/Server/Routes/controllers/KnowledgeImportController.js +355 -355
- package/vendor/Server/Routes/controllers/LoopEngineController.js +788 -788
- package/vendor/Server/Routes/controllers/StatsController.js +57 -57
- package/vendor/Server/Routes/controllers/StreamController.js +67 -67
- package/vendor/Server/Routes/library/logger.js +179 -179
- package/vendor/Server/Routes/library/zipArchive.js +172 -172
- package/vendor/Server/Routes/router/Router.js +204 -204
- package/vendor/Server/Routes/routes/brain.js +47 -47
- package/vendor/Server/Routes/routes/flexrunner.js +72 -72
- package/vendor/Server/Routes/routes/health.js +28 -28
- package/vendor/Server/Routes/routes/index.js +57 -57
- package/vendor/Server/Routes/routes/knowledge.js +55 -55
- package/vendor/Server/Routes/routes/loopengine.js +58 -58
- package/vendor/Server/Routes/routes/orchestrator.js +61 -61
- package/vendor/Server/Routes/routes/registry.js +97 -97
- package/vendor/Server/Routes/routes/stats.js +23 -23
- package/vendor/Server/Routes/routes/stream.js +30 -30
- package/vendor/Server/Routes/server.js +203 -203
- package/vendor/Server/Routes/sse/SseHub.js +308 -308
- package/vendor/Server/Skills/acceptance-check/SKILL.md +191 -191
- package/vendor/Server/Skills/acceptance-check/references/PHASE1_ARTIFACT_COLLECTION.md +52 -52
- package/vendor/Server/Skills/acceptance-check/references/PHASE2_CRITERIA_EVALUATION.md +77 -77
- package/vendor/Server/Skills/acceptance-check/references/PHASE2_EVIDENCE_VERIFICATION.md +70 -70
- package/vendor/Server/Skills/arkts-code-check/SKILL.md +320 -320
- package/vendor/Server/Skills/arkts-code-check/references/CODE_CHECK_GUIDE.md +210 -210
- package/vendor/Server/Skills/arkts-code-check/references/FILE_TYPE_GUIDE.md +28 -28
- package/vendor/Server/Skills/arkts-code-check/references/PHASE1_INFO_COLLECTION.md +233 -233
- package/vendor/Server/Skills/arkts-code-check/references/REPORT_TEMPLATE.md +219 -219
- package/vendor/Server/Skills/arkts-library-compile-validate/SKILL.md +328 -328
- package/vendor/Server/Skills/arkts-library-compile-validate/scripts/build.ps1 +93 -93
- package/vendor/Server/Skills/arkts-library-compile-validate/scripts/code-linter.cjs +432 -432
- package/vendor/Server/Skills/arkts-library-compile-validate/scripts/migrate.cjs +851 -851
- package/vendor/Server/Skills/arkts-library-compile-validate/scripts/ohpm-switch.cjs +788 -788
- package/vendor/Server/Skills/arkts-library-demo-code/SKILL.md +291 -291
- package/vendor/Server/Skills/arkts-library-demo-code/references/API_SIGNATURE_CHECKS.md +68 -68
- package/vendor/Server/Skills/arkts-library-demo-code/references/BUILD_VALIDATION.md +184 -184
- package/vendor/Server/Skills/arkts-library-demo-code/references/CODE_STANDARDS.md +337 -337
- package/vendor/Server/Skills/arkts-library-demo-code/references/EXAMPLES.md +400 -400
- package/vendor/Server/Skills/arkts-library-demo-code/references/SYSTEM_API_LOOKUP.md +98 -98
- package/vendor/Server/Skills/arkts-library-demo-code/references/TEMPLATE.md +544 -544
- package/vendor/Server/Skills/arkts-library-demo-code/scripts/build.ps1 +93 -93
- package/vendor/Server/Skills/arkts-library-demo-code/scripts/code-linter.cjs +432 -432
- package/vendor/Server/Skills/arkts-library-demo-code/scripts/migrate.cjs +851 -851
- package/vendor/Server/Skills/arkts-library-demo-code/scripts/ohpm-switch.cjs +788 -788
- package/vendor/Server/Skills/arkts-library-demo-coverage/SKILL.md +174 -174
- package/vendor/Server/Skills/arkts-library-demo-scenario/SKILL.md +321 -321
- package/vendor/Server/Skills/arkts-library-demo-scenario/references/EXAMPLES.md +100 -100
- package/vendor/Server/Skills/arkts-library-demo-scenario/references/TEMPLATE.md +185 -185
- package/vendor/Server/Skills/arkts-library-documentation-quality-check/SKILL.md +233 -233
- package/vendor/Server/Skills/arkts-library-documentation-quality-check/assets/REPORT_TEMPLATE.md +102 -102
- package/vendor/Server/Skills/arkts-library-documentation-quality-check/references/CHECK_DIMENSIONS.md +89 -89
- package/vendor/Server/Skills/arkts-library-documentation-quality-check/references/COMPLIANCE_CHECKLIST.md +62 -62
- package/vendor/Server/Skills/arkts-library-documentation-quality-check/references/KB_QUERY_GUIDE.md +107 -107
- package/vendor/Server/Skills/arkts-library-documentation-quality-check/references/MCP_TOOL_DISCOVERY.md +124 -124
- package/vendor/Server/Skills/arkts-library-documentation-quality-check/references/REPORT_TEMPLATE.md +90 -90
- package/vendor/Server/Skills/arkts-library-documentation-quality-check/references/SCORING_FORMULA.md +57 -57
- package/vendor/Server/Skills/arkts-library-documentation-quality-check/scripts/validate-skill.cjs +259 -259
- package/vendor/Server/Skills/arkts-library-interface-spec/SKILL.md +97 -97
- package/vendor/Server/Skills/arkts-library-memory-leak-check/SKILL.md +391 -391
- package/vendor/Server/Skills/arkts-library-source-clone/SKILL.md +113 -113
- package/vendor/Server/Skills/arkts-library-stability-check/SKILL.md +312 -312
- package/vendor/Server/Skills/arkts-library-stability-check/assets/REPORT_TEMPLATE.md +154 -154
- package/vendor/Server/Skills/arkts-library-stability-check/references/CHECKLIST.md +165 -165
- package/vendor/Server/Skills/arkts-library-stability-check/references/CODE_EXAMPLES.md +308 -308
- package/vendor/Server/Skills/arkts-library-stability-check/references/SCORING_RULES.md +90 -90
- package/vendor/Server/Skills/arkts-library-stability-check/scripts/validate-skill.cjs +282 -282
- package/vendor/Server/Skills/arkts-library-test-coverage-check/SKILL.md +360 -360
- package/vendor/Server/Skills/arkts-library-test-coverage-check/assets/REPORT_TEMPLATE.md +145 -145
- package/vendor/Server/Skills/arkts-library-test-coverage-check/references/CHECKLIST.md +252 -252
- package/vendor/Server/Skills/arkts-library-test-coverage-check/references/MCP_TOOL_USAGE.md +114 -114
- package/vendor/Server/Skills/arkts-library-test-coverage-check/scripts/validate-skill.cjs +262 -262
- package/vendor/Server/Skills/arkts-library-xts-code/SKILL.md +455 -455
- package/vendor/Server/Skills/arkts-library-xts-code/assets/report-template.md +60 -60
- package/vendor/Server/Skills/arkts-library-xts-code/references/ACCESS_MODIFIER_PRECHECK.md +76 -76
- package/vendor/Server/Skills/arkts-library-xts-code/references/BUILD_VERIFICATION.md +200 -200
- package/vendor/Server/Skills/arkts-library-xts-code/references/CODE_STANDARDS.md +518 -518
- package/vendor/Server/Skills/arkts-library-xts-code/references/SUBAGENT_PROMPT_TEMPLATE.md +276 -276
- package/vendor/Server/Skills/arkts-library-xts-code/references/SYSTEM_API_LOOKUP.md +92 -92
- package/vendor/Server/Skills/arkts-library-xts-code/references/XTS_TEMPLATE.md +767 -767
- package/vendor/Server/Skills/arkts-library-xts-code/scripts/build.ps1 +93 -93
- package/vendor/Server/Skills/arkts-library-xts-code/scripts/code-linter.cjs +432 -432
- package/vendor/Server/Skills/arkts-library-xts-code/scripts/migrate.cjs +851 -851
- package/vendor/Server/Skills/arkts-library-xts-code/scripts/ohpm-switch.cjs +788 -788
- package/vendor/Server/Skills/arkts-library-xts-code/scripts/precheck-access-modifiers.cjs +221 -221
- package/vendor/Server/Skills/arkts-library-xts-code-fix/SKILL.md +228 -228
- package/vendor/Server/Skills/arkts-library-xts-coverage/SKILL.md +97 -97
- package/vendor/Server/Skills/arkts-library-xts-doc/SKILL.md +194 -194
- package/vendor/Server/Skills/arkts-library-xts-doc/references/EXAMPLES.md +575 -575
- package/vendor/Server/Skills/arkts-library-xts-doc/references/TEMPLATE.md +574 -574
- package/vendor/Server/Skills/arkts-library-xts-doc/references/TESTABILITY_GUIDE.md +182 -182
- package/vendor/Server/Skills/arkts-library-xts-execution/SKILL.md +490 -490
- package/vendor/Server/Skills/arkts-library-xts-execution/references/error-fixing-examples.md +217 -217
- package/vendor/Server/Skills/arkts-library-xts-execution/scripts/build.ps1 +93 -93
- package/vendor/Server/Skills/arkts-library-xts-execution/scripts/code-linter.cjs +432 -432
- package/vendor/Server/Skills/arkts-library-xts-execution/scripts/migrate.cjs +851 -851
- package/vendor/Server/Skills/arkts-library-xts-execution/scripts/ohpm-switch.cjs +788 -788
- package/vendor/Server/Skills/flutter-code-check/SKILL.md +299 -299
- package/vendor/Server/Skills/flutter-code-check/assets/OUTPUT_TEMPLATE.md +311 -311
- package/vendor/Server/Skills/flutter-code-check/references/CHECKLIST.md +190 -190
- package/vendor/Server/Skills/flutter-code-check/references/PLATFORMS.md +133 -133
- package/vendor/Server/Skills/flutter-code-check/scripts/validate-skill.cjs +259 -259
- package/vendor/Server/Skills/flutter-interface/README.md +75 -75
- package/vendor/Server/Skills/flutter-interface/SKILL.md +291 -291
- package/vendor/Server/Skills/flutter-interface/references/EXAMPLES.md +336 -336
- package/vendor/Server/Skills/flutter-interface/references/GIT_CLONE_GUIDE.md +190 -190
- package/vendor/Server/Skills/flutter-interface/references/SCRIPT_REFERENCE.md +258 -258
- package/vendor/Server/Skills/flutter-interface/references/TEMPLATE.md +254 -254
- package/vendor/Server/Skills/flutter-library-consistency-check/SKILL.md +517 -517
- package/vendor/Server/Skills/flutter-library-consistency-check/references/CHECKLIST.md +381 -381
- package/vendor/Server/Skills/flutter-library-consistency-check/references/FUNCTION_COMPARISON_GUIDE.md +341 -341
- package/vendor/Server/Skills/flutter-library-consistency-check/references/PLATFORM_LIMITATION_GUIDE.md +71 -71
- package/vendor/Server/Skills/flutter-library-documentation-quality-check/SKILL.md +518 -518
- package/vendor/Server/Skills/flutter-library-documentation-quality-check/references/CHECKLIST.md +406 -406
- package/vendor/Server/Skills/flutter-library-memory-leak-check/SKILL.md +652 -652
- package/vendor/Server/Skills/flutter-library-memory-leak-check/references/CHECKLIST.md +396 -396
- package/vendor/Server/Skills/flutter-library-stability-check/SKILL.md +744 -744
- package/vendor/Server/Skills/flutter-library-stability-check/references/CHECKLIST.md +720 -720
- package/vendor/Server/Skills/flutter-library-test-coverage-check/SKILL.md +414 -414
- package/vendor/Server/Skills/flutter-library-test-coverage-check/assets/REPORT_TEMPLATE.md +150 -150
- package/vendor/Server/Skills/flutter-library-test-coverage-check/references/CHECKLIST.md +304 -304
- package/vendor/Server/Skills/flutter-library-test-coverage-check/references/SCORING_RULES.md +265 -265
- package/vendor/Server/Skills/flutter-library-test-coverage-check/references/SCRIPT_USAGE.md +286 -286
- package/vendor/Server/Skills/knowledge-import/SKILL.md +383 -383
- package/vendor/Server/Skills/knowledge-import/references/MCP_TOOL_USAGE.md +165 -165
- package/vendor/Server/Skills/knowledge-import/references/SKILL_LOCATOR_GUIDE.md +91 -91
- package/vendor/Server/Skills/knowledge-import/references/SKILL_OPTIMIZATION_GUIDE.md +127 -127
- package/vendor/Server/Skills/ohos-lib-pr-push/SKILL.md +453 -301
- package/vendor/Server/Skills/ohos-lib-pr-push/assets/PR_CHECKLIST.md +151 -0
- package/vendor/Server/Skills/ohos-lib-pr-push/assets/PR_ISSUE_TEMPLATE.md +257 -105
- package/vendor/Server/Skills/ohos-lib-pr-push/references/GITCODE_API.md +191 -127
- package/vendor/Server/Skills/ohos-lib-pr-push/scripts/gitcode-api.cjs +317 -208
- package/vendor/Server/Skills/rn-code-check/SKILL.md +320 -320
- package/vendor/Server/Skills/rn-code-check/references/API-GUIDE.md +234 -234
- package/vendor/Server/Skills/rn-code-check/references/CHECKLIST.md +188 -188
- package/vendor/Server/Skills/rn-code-check/references/REPORT-TEMPLATE.md +246 -246
- package/vendor/Server/Skills/rn-lib-add-example/SKILL.md +198 -198
- package/vendor/Server/Skills/rn-lib-add-example/references/APP_RENAME_GUIDE.md +40 -40
- package/vendor/Server/Skills/rn-lib-add-example/references/SHELL_ADAPTATION_CHECKLIST.md +78 -78
- package/vendor/Server/Skills/rn-lib-add-example/references/TEMPLATE_REPO_GUIDE.md +70 -70
- package/vendor/Server/Skills/rn-lib-add-example/references/VERIFICATION_GUIDE.md +47 -47
- package/vendor/Server/Skills/rn-lib-add-example/scripts/create-example.cjs +252 -252
- package/vendor/Server/Skills/rn-lib-update-doc/SKILL.md +176 -176
- package/vendor/Server/Skills/rn-lib-update-doc/config.json +5 -5
- package/vendor/Server/Skills/rn-lib-update-doc/references/changelog-template.md +35 -35
- package/vendor/Server/Skills/rn-lib-update-doc/references/format-diff.md +137 -137
- package/vendor/Server/Skills/rn-lib-update-doc/references/link-registry.json +33 -33
- package/vendor/Server/Skills/rn-lib-update-doc/references/model-0.4.2-overview.md +40 -40
- package/vendor/Server/Skills/rn-lib-update-doc/references/model-0.4.2.md +429 -429
- package/vendor/Server/Skills/rn-lib-update-doc/scripts/detect-readme-format.cjs +105 -105
- package/vendor/Server/Skills/rn-lib-update-doc/scripts/find-usage-doc.cjs +90 -90
- package/vendor/Server/Skills/rn-lib-update-doc/scripts/link-verify.cjs +213 -213
- package/vendor/Server/Skills/rn-lib-update-doc/scripts/normalize-changelog.cjs +73 -73
- package/vendor/Server/Skills/rn-lib-update-doc/scripts/normalize-package-meta.cjs +258 -258
- package/vendor/Server/Skills/rn-lib-update-doc/scripts/normalize-readme-links.cjs +341 -341
- package/vendor/Server/Skills/rn-lib-update-doc/scripts/resolve-usage-docs.cjs +67 -67
- package/vendor/Server/Skills/rn-library-consistency-check/SKILL.md +299 -299
- package/vendor/Server/Skills/rn-library-consistency-check/assets/REPORT_TEMPLATE.md +293 -293
- package/vendor/Server/Skills/rn-library-consistency-check/references/ARKTS_COMPONENT_CHECK_GUIDE.md +857 -857
- package/vendor/Server/Skills/rn-library-consistency-check/references/ARKTS_TURBOMODULE_CHECK_GUIDE.md +856 -856
- package/vendor/Server/Skills/rn-library-consistency-check/references/CHECKLIST.md +157 -157
- package/vendor/Server/Skills/rn-library-consistency-check/references/CPP_COMPONENT_CHECK_GUIDE.md +801 -801
- package/vendor/Server/Skills/rn-library-consistency-check/references/CPP_TURBOMODULE_CHECK_GUIDE.md +683 -683
- package/vendor/Server/Skills/rn-library-consistency-check/references/FUNCTION_COMPARISON_GUIDE.md +233 -233
- package/vendor/Server/Skills/rn-library-consistency-check/references/NATIVE_COMPONENT_IDENTIFICATION.md +1373 -1373
- package/vendor/Server/Skills/rn-library-consistency-check/references/SCORING_STANDARD.md +220 -220
- package/vendor/Server/Skills/rn-library-consistency-check/scripts/validate-skill.py +245 -245
- package/vendor/Server/Skills/rn-library-documentation-quality-check/SKILL.md +263 -263
- package/vendor/Server/Skills/rn-library-documentation-quality-check/assets/MODEL.md +414 -414
- package/vendor/Server/Skills/rn-library-documentation-quality-check/assets/MODEL_en.md +413 -413
- package/vendor/Server/Skills/rn-library-documentation-quality-check/assets/REPORT_TEMPLATE.md +311 -311
- package/vendor/Server/Skills/rn-library-documentation-quality-check/references/CHECK_CHECKLIST.md +355 -355
- package/vendor/Server/Skills/rn-library-documentation-quality-check/references/CROSS_VALIDATION_GUIDE.md +115 -115
- package/vendor/Server/Skills/rn-library-documentation-quality-check/references/DOC_COLLECTION_GUIDE.md +139 -139
- package/vendor/Server/Skills/rn-library-documentation-quality-check/references/EXAMPLES.md +586 -586
- package/vendor/Server/Skills/rn-library-documentation-quality-check/references/GOTCHAS.md +57 -57
- package/vendor/Server/Skills/rn-library-documentation-quality-check/scripts/validate-skill.py +259 -259
- package/vendor/Server/Skills/rn-library-interface-analyzer/SKILL.md +301 -301
- package/vendor/Server/Skills/rn-library-interface-analyzer/assets/REPORT_TEMPLATE.md +148 -148
- package/vendor/Server/Skills/rn-library-interface-analyzer/references/DOC_ANNOTATION_GUIDE.md +118 -118
- package/vendor/Server/Skills/rn-library-interface-analyzer/references/SCRIPT_USAGE_GUIDE.md +168 -168
- package/vendor/Server/Skills/rn-library-interface-analyzer/references/URL_PARSING_RULES.md +176 -176
- package/vendor/Server/Skills/rn-library-issue-generalizer/SKILL.md +274 -274
- package/vendor/Server/Skills/rn-library-issue-generalizer/assets/case-template.md +45 -45
- package/vendor/Server/Skills/rn-library-issue-generalizer/assets/rule-template.md +25 -25
- package/vendor/Server/Skills/rn-library-issue-generalizer/references/PR_FETCH_GUIDE.md +61 -61
- package/vendor/Server/Skills/rn-library-issue-generalizer/references/RULE_TEMPLATE_GUIDE.md +165 -165
- package/vendor/Server/Skills/rn-library-issue-generalizer/scripts/fetch-pr-info.py +239 -239
- package/vendor/Server/Skills/rn-library-known-issue-check/SKILL.md +263 -263
- package/vendor/Server/Skills/rn-library-known-issue-check/assets/REPORT_TEMPLATE.md +96 -96
- package/vendor/Server/Skills/rn-library-known-issue-check/references/COMPLIANCE_CHECKLIST.md +57 -57
- package/vendor/Server/Skills/rn-library-known-issue-check/references/INSPECTION_GUIDE.md +99 -99
- package/vendor/Server/Skills/rn-library-known-issue-check/references/PRESCREEN_GUIDE.md +64 -64
- package/vendor/Server/Skills/rn-library-known-issue-check/references/SOURCE_PREP_GUIDE.md +74 -74
- package/vendor/Server/Skills/rn-library-known-issue-check/scripts/validate-known-issue-report.py +164 -164
- package/vendor/Server/Skills/rn-library-memory-leak-check/SKILL.md +356 -339
- package/vendor/Server/Skills/rn-library-memory-leak-check/assets/REPORT_TEMPLATE.md +85 -83
- package/vendor/Server/Skills/rn-library-memory-leak-check/references/CHECKLIST.md +905 -859
- package/vendor/Server/Skills/rn-library-memory-leak-check/references/HARMONY_CODE_PATTERNS.md +124 -122
- package/vendor/Server/Skills/rn-library-memory-leak-check/scripts/scan_harmony_code.py +287 -279
- package/vendor/Server/Skills/rn-library-stability-check/SKILL.md +273 -273
- package/vendor/Server/Skills/rn-library-stability-check/assets/REPORT_TEMPLATE.md +129 -129
- package/vendor/Server/Skills/rn-library-stability-check/references/CHECKLIST.md +581 -581
- package/vendor/Server/Skills/rn-library-stability-check/references/SCORING_RULES.md +138 -138
- package/vendor/Server/Skills/rn-library-stability-check/scripts/scan-harmony-code.py +168 -168
- package/vendor/Server/Skills/rn-library-test-coverage-check/SKILL.md +526 -506
- package/vendor/Server/Skills/rn-library-test-coverage-check/references/CHECKLIST.md +321 -280
- package/vendor/Server/Skills/rn-library-test-coverage-check/references/DEMO_LOCATION.md +221 -221
- package/vendor/Server/Skills/rn-library-test-coverage-check/references/REPORT_TEMPLATE.md +220 -209
- package/vendor/Server/Skills/rn-library-test-coverage-check/references/SCRIPT_USAGE.md +325 -325
- package/vendor/Server/Skills/rn-ohos-xts-generator/SKILL.md +279 -279
- package/vendor/Server/Skills/rn-ohos-xts-generator/assets/TEST_FILE_TEMPLATES.md +404 -404
- package/vendor/Server/Skills/rn-ohos-xts-generator/references/BUILD_TROUBLESHOOTING.md +185 -185
- package/vendor/Server/Skills/rn-ohos-xts-generator/references/BUILD_WORKFLOW.md +265 -265
- package/vendor/Server/Skills/rn-ohos-xts-generator/references/COMMON_CONFIG.md +189 -189
- package/vendor/Server/Skills/rn-ohos-xts-generator/references/CONFIG_GUIDE.md +203 -203
- package/vendor/Server/Skills/rn-ohos-xts-generator/references/COVERAGE_ANALYZER.md +147 -147
- package/vendor/Server/Skills/rn-ohos-xts-generator/references/DESIGN_DOC_GUIDE.md +148 -148
- package/vendor/Server/Skills/rn-ohos-xts-generator/references/GENERATION_FLOW.md +165 -165
- package/vendor/Server/Skills/rn-ohos-xts-generator/references/GENERATION_STRATEGY.md +195 -195
- package/vendor/Server/Skills/rn-ohos-xts-generator/references/HARMONY_SCANNER.md +249 -249
- package/vendor/Server/Skills/rn-ohos-xts-generator/references/JEST_FRAMEWORK.md +235 -235
- package/vendor/Server/Skills/rn-ohos-xts-generator/references/PLATFORM_COMPAT.md +161 -161
- package/vendor/Server/Skills/rn-ohos-xts-generator/references/RN_TEST_PATTERNS.md +413 -413
- package/vendor/Server/Skills/rn-ohos-xts-generator/references/SOURCE_PARSER.md +235 -235
- package/vendor/Server/Skills/rn-ohos-xts-generator/references/TEST_CONVENTIONS.md +245 -245
- package/vendor/Server/Skills/rn-ohos-xts-generator/references/TROUBLESHOOTING.md +282 -282
- package/vendor/Server/Skills/rn-ohos-xts-generator/references/USAGE_GUIDE.md +251 -251
- package/vendor/Server/Skills/rnoh-cptf-api-test/SKILL.md +469 -469
- package/vendor/Server/Skills/rnoh-cptf-api-test/assets/CPTF_TEST_TEMPLATE.md +310 -310
- package/vendor/Server/Skills/rnoh-cptf-api-test/assets/DEMO_PAGE_TEMPLATE.md +303 -303
- package/vendor/Server/Skills/rnoh-cptf-api-test/references/CPTF_TEST_GENERATION_GUIDE.md +421 -421
- package/vendor/Server/Skills/rnoh-cptf-api-test/references/DEMO_GENERATION_GUIDE.md +358 -358
- package/vendor/Server/Skills/rnoh-cptf-api-test/references/QUALITY_CHECKLIST.md +114 -114
- package/vendor/Server/Skills/rnoh-cptf-api-test/references/SPEC_PARSING_GUIDE.md +274 -274
- package/vendor/Server/Skills/rnoh-cptf-api-test/scripts/validate-rnoh-cptf-api-test.sh +185 -185
- package/vendor/Server/Skills/rnoh-cptf-demo-test/SKILL.md +191 -191
- package/vendor/Server/Skills/rnoh-cptf-demo-test/assets/TEST_TEMPLATE.md +216 -216
- package/vendor/Server/Skills/rnoh-cptf-demo-test/references/CPTF_SETUP.md +107 -107
- package/vendor/Server/Skills/rnoh-cptf-demo-test/references/DEMO_ANALYSIS.md +120 -120
- package/vendor/Server/Skills/rnoh-cptf-demo-test/scripts/validate-rnoh-cptf-test.sh +108 -108
- package/vendor/Server/Skills/rnoh-cptf-test-run/SKILL.md +237 -237
- package/vendor/Server/Skills/rnoh-cptf-test-run/references/DEBUG_PLAYBOOK.md +261 -261
- package/vendor/Server/Skills/rnoh-cptf-test-run/scripts/validate-run-env.sh +112 -112
- package/vendor/Server/Skills/rnoh-lib-code-adapt/SKILL.md +497 -497
- package/vendor/Server/Skills/rnoh-lib-code-adapt/references/adapt-checklist.md +270 -270
- package/vendor/Server/Skills/rnoh-lib-code-adapt/references/api-migration-checklist.md +164 -164
- package/vendor/Server/Skills/rnoh-lib-code-adapt/references/common-compile-errors.md +556 -556
- package/vendor/Server/Skills/rnoh-lib-code-adapt/references/deveco-cli-tools.md +459 -459
- package/vendor/Server/Skills/rnoh-lib-code-adapt/references/edge-cases.md +65 -65
- package/vendor/Server/Skills/rnoh-lib-code-adapt/references/har-tgz-build.md +512 -512
- package/vendor/Server/Skills/rnoh-lib-code-adapt/references/version-compat-matrix.md +132 -132
- package/vendor/Server/Skills/rnoh-lib-code-adapt/scripts/auto-integrate.sh +424 -424
- package/vendor/Server/Skills/rnoh-lib-demo-coverage/SKILL.md +137 -137
- package/vendor/Server/Skills/rnoh-lib-demo-create/SKILL.md +306 -306
- package/vendor/Server/Skills/rnoh-lib-demo-create/assets/DEMO_PAGE_TEMPLATE.md +485 -485
- package/vendor/Server/Skills/rnoh-lib-demo-create/assets/INDEX_TEMPLATE.md +172 -172
- package/vendor/Server/Skills/rnoh-lib-demo-create/references/DEMO_CODE_RULES.md +422 -422
- package/vendor/Server/Skills/rnoh-lib-demo-create/references/QUALITY_CHECKLIST.md +95 -95
- package/vendor/Server/Skills/rnoh-lib-demo-create/references/SOURCE_EXPLORATION.md +169 -169
- package/vendor/Server/Skills/rnoh-lib-demo-doc/SKILL.md +554 -554
- package/vendor/Server/Skills/rnoh-lib-demo-doc/assets/DEMO_DOC_TEMPLATE.md +106 -106
- package/vendor/Server/Skills/rnoh-lib-demo-doc/references/COVERAGE_INCREMENTAL.md +216 -216
- package/vendor/Server/Skills/rnoh-lib-demo-doc/references/DEMO_DESIGN_RULES.md +413 -413
- package/vendor/Server/Skills/rnoh-lib-demo-doc/references/OUTPUT_FORMAT.md +269 -269
- package/vendor/Server/Skills/rnoh-lib-demo-doc/references/QUALITY_CHECKLIST.md +98 -98
- package/vendor/Server/Skills/rnoh-lib-func-test/SKILL.md +337 -337
- package/vendor/Server/Skills/rnoh-lib-rnt-search/SKILL.md +722 -722
- package/vendor/Server/Skills/rnoh-lib-rnt-search/assets/PORT_REPORT_TEMPLATE.md +219 -219
- package/vendor/Server/Skills/rnoh-lib-rnt-search/references/DEMO_PORTING_GUIDE.md +345 -345
- package/vendor/Server/Skills/rnoh-lib-rnt-search/references/PORT_VERIFICATION.md +269 -269
- package/vendor/Server/Skills/rnoh-lib-rnt-search/references/RNT_PROJECT_STRUCTURE.md +173 -173
- package/vendor/Server/Skills/rnoh-lib-rnt-search/scripts/analyze-demo-deps.cjs +267 -267
- package/vendor/Server/Skills/rnoh-lib-rnt-search/scripts/detect-rnoh-version.cjs +174 -174
- package/vendor/Server/Skills/rnoh-lib-rnt-search/scripts/find-rnt-demo.sh +111 -111
- package/vendor/Server/Skills/rnoh-lib-rnt-search/scripts/port-demo.sh +186 -186
- package/vendor/Server/Skills/rnoh-lib-rnt-search/scripts/read-lib-meta.cjs +150 -150
- package/vendor/Server/Skills/rnoh-lib-test-align/SKILL.md +296 -296
- package/vendor/Server/Skills/rnoh-lib-test-align/references/jest-troubleshooting.md +371 -371
- package/vendor/Server/Skills/rnoh-lib-test-align/references/port-test-demo-guide.md +212 -212
- package/vendor/Server/Skills/rnoh-lib-test-align/references/runtime-troubleshooting.md +345 -345
- package/vendor/Server/Skills/rnoh-lib-test-align/references/unit-test-template.md +223 -223
- package/vendor/Server/Skills/rnoh-lib-test-align/scripts/port-test-demo.sh +1053 -1053
- package/vendor/Server/Skills/rnoh-lib-version-diff/SKILL.md +295 -255
- package/vendor/Server/Skills/rnoh-lib-version-diff/references/OHOS_ADAPTATION.md +82 -77
- package/vendor/Server/Skills/rnoh-lib-version-diff/references/OHOS_API_LOOKUP.md +224 -224
- package/vendor/Server/Skills/rnoh-lib-version-diff/references/script-reference.md +175 -174
- package/vendor/Server/Skills/rnoh-lib-version-diff/scripts/detect-upstream-version.js +967 -967
- package/vendor/Server/Skills/rnoh-lib-version-diff/scripts/generate-diff.js +1798 -1798
- package/vendor/Server/Skills/rnoh-lib-version-diff/scripts/package.json +5 -5
- package/vendor/Server/Skills/rnoh-lib-version-diff/templates/report-template.md +180 -137
- package/vendor/Server/Skills/rnoh-lib-xts-coverage/SKILL.md +145 -145
- package/vendor/Server/Skills/skill-generator/SKILL.md +365 -365
- package/vendor/Server/Skills/skill-generator/assets/SKILL_TEMPLATE.md +183 -183
- package/vendor/Server/Skills/skill-generator/references/COMPLIANCE_CHECKLIST.md +82 -82
- package/vendor/Server/Skills/skill-generator/references/KB_QUERY_GUIDE.md +110 -110
- package/vendor/Server/Skills/skill-generator/references/MCP_TOOL_DISCOVERY.md +122 -122
- package/vendor/Server/Skills/skill-generator/references/SKILL_SPEC.md +121 -121
- package/vendor/Server/Skills/skill-generator/scripts/validate-skill.cjs +259 -259
- package/vendor/Server/Skills/task-analysis/SKILL.md +234 -234
- package/vendor/Server/Skills/task-analysis/assets/OUTPUT_EXAMPLES.md +160 -160
- package/vendor/Server/Skills/task-analysis/references/ACCEPTANCE_CRITERIA_GUIDE.md +190 -190
- package/vendor/Server/Skills/task-analysis/references/ANALYSIS_SCHEMA.md +224 -224
- package/vendor/Server/Skills/task-analysis/references/INTEGRATION_CONTEXT.md +162 -162
- package/vendor/Server/Skills/task-analysis/references/LESSONS_LEARNED.md +55 -55
- package/vendor/Server/Skills/task-analysis/references/REPLAN_CONTEXT_GUIDE.md +126 -126
- package/vendor/Server/Skills/task-analysis/scripts/validate-analysis-output.sh +256 -256
- package/vendor/Server/Skills/task-decomposition/SKILL.md +528 -528
- package/vendor/Server/Skills/task-decomposition/assets/OUTPUT_EXAMPLES.md +451 -451
- package/vendor/Server/Skills/task-decomposition/references/ACCEPTANCE_CRITERIA_GUIDE.md +179 -179
- package/vendor/Server/Skills/task-decomposition/references/DEPENDENCY_GRAPH_GUIDE.md +152 -152
- package/vendor/Server/Skills/task-decomposition/references/INTEGRATION_CONTEXT.md +175 -175
- package/vendor/Server/Skills/task-decomposition/references/REPLAN_CONTEXT_GUIDE.md +195 -195
- package/vendor/Server/Skills/task-decomposition/references/TASK_DECOMPOSITION_TEMPLATES.md +226 -226
- package/vendor/Server/Skills/task-decomposition/scripts/list-available-skills.cjs +263 -263
- package/vendor/Server/Skills/task-decomposition/scripts/skill-blacklist.json +29 -29
- package/vendor/Server/Skills/task-decomposition/scripts/validate-decomposition-output.cjs +376 -376
- package/vendor/Server/Skills/task-decomposition/scripts/validate-param-consistency.cjs +259 -259
- package/vendor/Server/Skills/task-decomposition/scripts/validate-specified-skills.cjs +216 -216
- package/vendor/Server/Skills/task-decomposition/scripts/validate-step-graph.cjs +424 -424
- package/vendor/Server/Skills/tpc-cpp-check/SKILL.md +427 -427
- package/vendor/Server/Skills/tpc-cpp-check/references/CHECKLIST.md +214 -214
- package/vendor/Server/Skills/tpc-cpp-check/references/HPKBUILD_GUIDE.md +235 -235
- package/vendor/Server/Skills/tpc-cpp-check/references/REPORT_TEMPLATE.md +250 -250
- package/vendor/Server/TestCheck/TestCheck.js +775 -775
- package/vendor/Server/TestCheck/index.js +11 -11
- package/vendor/Server/library/McpToolGuide.js +280 -280
- package/vendor/Server/library/StatsService.js +126 -126
- package/vendor/Server/library/cstTime.js +16 -16
- package/vendor/VERSION +3 -3
- package/workflows/pr-check.mjs +105 -105
- package/workflows/pr-push.mjs +192 -192
- package/vendor/Server/Agent/SkillSelector/types.js +0 -63
|
@@ -1,653 +1,653 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: flutter-library-memory-leak-check
|
|
3
|
-
description: 对 Flutter 三方库的**鸿蒙化代码**进行内存泄露检视,聚焦 ohos 目录下的 ArkTS/ETS 和 C++ 代码,分析资源管理不当、循环引用、未释放对象等潜在内存泄露问题,生成严苛评分报告(0-100分)。作为 Flutter 仓库检视流程的第五阶段,依赖编码质量检视结果。
|
|
4
|
-
license: Apache-2.0
|
|
5
|
-
compatibility: 需要访问 Git 仓库、分析 ohos 目录下的 ETS/C++ 源码
|
|
6
|
-
metadata:
|
|
7
|
-
version: "1.0.0"
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# FlutterLibraryMemoryLeakCheckSkill
|
|
11
|
-
|
|
12
|
-
对 Flutter 三方库的**鸿蒙化实现代码**进行内存泄露检视,评估库在内存管理方面的安全性,识别潜在的内存泄露风险。
|
|
13
|
-
|
|
14
|
-
> ⚠️ **核心定位**:本 SKILL **仅检视鸿蒙化代码**,不检视 Flutter Dart 层或非鸿蒙化部分的代码。检视范围包括:
|
|
15
|
-
> - 鸿蒙平台特有的 ArkTS/ETS 代码(常见目录:`ohos/ets/`、`harmony/ets/`、`src/ohos/` 等)
|
|
16
|
-
> - 鸿蒙 Native C++ 代码(常见目录:`ohos/src/`、`ohos/cpp/`、`native/` 等)
|
|
17
|
-
> - 鸿蒙平台特有的 API 资源管理(如 GattClientDevice、NAPI 引用、@ohos 模块等)
|
|
18
|
-
>
|
|
19
|
-
> **重要**:目录名称不固定,需通过源码扫描识别鸿蒙化代码特征
|
|
20
|
-
|
|
21
|
-
---
|
|
22
|
-
|
|
23
|
-
## 任务参数
|
|
24
|
-
|
|
25
|
-
| 参数 | 必需 | 说明 |
|
|
26
|
-
|------|------|------|
|
|
27
|
-
| `repoUrl` | ✅ | Git 仓库地址,支持分支 `?branch=xxx` |
|
|
28
|
-
| `outputDir` | ✅ | 输出目录绝对路径,存放检视报告 |
|
|
29
|
-
| `interfaceDocPath` | ✅ | 接口规格说明文档路径 |
|
|
30
|
-
| `repoName` | ✅ | 仓库名称(用于报告标识) |
|
|
31
|
-
|
|
32
|
-
---
|
|
33
|
-
|
|
34
|
-
## 输入依赖
|
|
35
|
-
|
|
36
|
-
本 SKILL 是 Flutter 仓库检视流程的**第五阶段**,依赖:
|
|
37
|
-
|
|
38
|
-
- **前置 SKILL**: `flutter-library-code-quality-check`
|
|
39
|
-
- **输入文件**: `接口规格说明.md`、`编码质量检视报告.md`
|
|
40
|
-
- **仓库源码**: 已克隆到 `{outputDir}/source/`,重点分析 `ohos/` 目录
|
|
41
|
-
|
|
42
|
-
---
|
|
43
|
-
|
|
44
|
-
## 工作流程
|
|
45
|
-
|
|
46
|
-
### Phase 0:鸿蒙代码定位与范围识别
|
|
47
|
-
|
|
48
|
-
首先扫描源码,**通过代码特征识别鸿蒙化实现**,而非仅依赖目录名称。
|
|
49
|
-
|
|
50
|
-
#### 0.1 鸿蒙代码特征识别
|
|
51
|
-
|
|
52
|
-
扫描源码文件,识别以下鸿蒙化特征:
|
|
53
|
-
|
|
54
|
-
**ArkTS/ETS 代码特征**:
|
|
55
|
-
```typescript
|
|
56
|
-
// 特征 1:@ohos 模块导入
|
|
57
|
-
import ble from '@ohos.bluetooth';
|
|
58
|
-
import connection from '@ohos.bluetooth.connection';
|
|
59
|
-
import geoLocationManager from '@ohos.geoLocationManager';
|
|
60
|
-
import { GattClientDevice } from '@ohos.bluetooth.ble';
|
|
61
|
-
|
|
62
|
-
// 特征 2:鸿蒙特有的 API 调用
|
|
63
|
-
ble.createGattClientDevice();
|
|
64
|
-
ble.startBLEScan();
|
|
65
|
-
connection.pairDevice();
|
|
66
|
-
geoLocationManager.on('locationChange');
|
|
67
|
-
|
|
68
|
-
// 特征 3:FlutterPlugin 鸦蒙实现
|
|
69
|
-
class XxxPlugin implements FlutterPlugin {
|
|
70
|
-
onAttachedToEngine(binding: FlutterPluginBinding): void { ... }
|
|
71
|
-
onDetachedFromEngine(binding: FlutterPluginBinding): void { ... }
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
// 特征 4:.ets 文件扩展名
|
|
75
|
-
*.ets // ArkTS 文件
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
**C++ Native 代码特征**:
|
|
79
|
-
```cpp
|
|
80
|
-
// 特征 1:NAPI 相关头文件
|
|
81
|
-
#include <napi/native_api.h>
|
|
82
|
-
#include <napi/js_native_api.h>
|
|
83
|
-
#include <napi/js_native_api_types.h>
|
|
84
|
-
|
|
85
|
-
// 特征 2:NAPI 函数调用
|
|
86
|
-
napi_create_reference(env, value, 1, &ref);
|
|
87
|
-
napi_delete_reference(env, ref);
|
|
88
|
-
napi_open_handle_scope(env, &scope);
|
|
89
|
-
napi_close_handle_scope(env, scope);
|
|
90
|
-
napi_get_value_string_utf8(env, value, buf, bufsize, &len);
|
|
91
|
-
|
|
92
|
-
// 特征 3:鸿蒙特有的 Native API
|
|
93
|
-
OH_NativeXxx();
|
|
94
|
-
HarmonyOS_NativeXxx();
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
**常见鸿蒙化目录(仅供参考,不作为唯一判定依据)**:
|
|
98
|
-
```
|
|
99
|
-
常见目录名称:
|
|
100
|
-
├── ohos/ # 最常见
|
|
101
|
-
├── harmony/ # 部分库使用
|
|
102
|
-
├── harmonyos/ # 部分库使用
|
|
103
|
-
├── src/ohos/ # 嵌入式结构
|
|
104
|
-
├── platform/ohos/ # 平台分离结构
|
|
105
|
-
├── native/ # Native 实现(需检查 NAPI 特征)
|
|
106
|
-
├── ets/ # 独立 ETS 目录
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
#### 0.2 扫描流程
|
|
110
|
-
|
|
111
|
-
```
|
|
112
|
-
扫描流程:
|
|
113
|
-
├── Step 1:扫描所有 .ets 文件
|
|
114
|
-
│ ├── 查找 @ohos 模块导入
|
|
115
|
-
│ ├── 查找鸿蒙 API 调用(ble.createGattClientDevice 等)\│ ├── 查找 FlutterPlugin 实现类
|
|
116
|
-
│ └── 记录鸿蒙化代码文件路径
|
|
117
|
-
├── Step 2:扫描所有 .cpp/.h 文件
|
|
118
|
-
│ ├── 查找 NAPI 头文件引用
|
|
119
|
-
│ ├── 查找 napi_xxx 函数调用
|
|
120
|
-
│ ├── 记录鸿蒙 Native 代码文件路径
|
|
121
|
-
├── Step 3:综合判定
|
|
122
|
-
│ ├── 若发现鸿蒙代码特征 → 进入 Phase 1 深度分析
|
|
123
|
-
│ ├── 若未发现任何鸿蒙代码特征 → **报告评分 0 分**,标注"未实现鸿蒙化"
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
**判定规则**:
|
|
127
|
-
- **优先通过代码特征识别**,而非仅依赖目录名称
|
|
128
|
-
- 若扫描到 `@ohos` 模块导入或 NAPI 函数调用 → **确认鸿蒙化实现**,进入 Phase 1
|
|
129
|
-
- 若存在 `.ets` 文件且包含鸿蒙 API 调用 → **确认鸿蒙化实现**,进入 Phase 1
|
|
130
|
-
- 若扫描整个源码均未发现鸿蒙代码特征 → **报告评分 0 分**,标注"未实现鸿蒙化"
|
|
131
|
-
- **注意**:即使没有 ohos 目录,但源码中存在鸿蒙化实现(如在 src/ 或其他目录),仍需检视
|
|
132
|
-
|
|
133
|
-
---
|
|
134
|
-
|
|
135
|
-
### Phase 1:Plugin 生命周期资源管理检查
|
|
136
|
-
|
|
137
|
-
#### 1.1 FlutterPlugin 生命周期绑定(致命项,20分)
|
|
138
|
-
|
|
139
|
-
Flutter Plugin 在鸿蒙平台必须正确绑定生命周期事件。
|
|
140
|
-
|
|
141
|
-
| 检查项 | 问题描述 | 扣分规则 |
|
|
142
|
-
|--------|----------|----------|
|
|
143
|
-
| `onAttachedToEngine` | 资源初始化是否完整 | 初始化不完整扣 5 分 |
|
|
144
|
-
| `onDetachedFromEngine` | 是否释放**所有**资源 | **未释放扣 20 分(致命)** |
|
|
145
|
-
| `setMethodCallHandler(null)` | 是否取消 MethodChannel handler | 未取消扣 10 分 |
|
|
146
|
-
| Map 数据清理 | `mConnectedDevices`、`mMtu` 等是否清空 | 未清空扣 12 分 |
|
|
147
|
-
| 释放顺序 | 是否按正确顺序释放(先取消监听再清数据) | 顺序错误扣 8 分 |
|
|
148
|
-
|
|
149
|
-
**代码示例**:
|
|
150
|
-
|
|
151
|
-
```typescript
|
|
152
|
-
// ❌ 致命错误:onDetachedFromEngine 未释放所有资源
|
|
153
|
-
onDetachedFromEngine(binding: FlutterPluginBinding): void {
|
|
154
|
-
if (this.channel != null) {
|
|
155
|
-
this.channel.setMethodCallHandler(null) // 仅取消 handler
|
|
156
|
-
}
|
|
157
|
-
// 缺失:mConnectedDevices、mMtu、mScanFilters 等未清空
|
|
158
|
-
// 缺失:ble.stopBLEScan() 未调用
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
// ✅ 正确实现
|
|
162
|
-
onDetachedFromEngine(binding: FlutterPluginBinding): void {
|
|
163
|
-
// 1. 取消所有事件监听
|
|
164
|
-
connection.off("bondStateChange", this.bondStateCallback);
|
|
165
|
-
ble.off("BLEDeviceFind", this.scanCallback);
|
|
166
|
-
|
|
167
|
-
// 2. 停止进行中的操作
|
|
168
|
-
ble.stopBLEScan();
|
|
169
|
-
|
|
170
|
-
// 3. 清空 Map 数据
|
|
171
|
-
this.mConnectedDevices.clear();
|
|
172
|
-
this.mMtu.clear();
|
|
173
|
-
this.mScanFilters.clear();
|
|
174
|
-
|
|
175
|
-
// 4. 取消 MethodChannel handler
|
|
176
|
-
if (this.channel != null) {
|
|
177
|
-
this.channel.setMethodCallHandler(null);
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
// 5. 释放其他资源
|
|
181
|
-
for (const device of this.mConnectedDevices.values()) {
|
|
182
|
-
device.close(); // 释放 GattClientDevice
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
#### 1.2 Ability 生命周期绑定(严苛项,15分)
|
|
188
|
-
|
|
189
|
-
Activity/Ability 生命周期资源必须正确绑定。
|
|
190
|
-
|
|
191
|
-
| 检查项 | 问题描述 | 扣分规则 |
|
|
192
|
-
|--------|----------|----------|
|
|
193
|
-
| `onAttachedToAbility` | Ability 附加时资源注册 | 未处理扣 8 分 |
|
|
194
|
-
| `onDetachedFromAbility` | Ability 分离时资源释放 | **未释放扣 15 分** |
|
|
195
|
-
| 配置变更处理 | 屏幕旋转等配置变更时的资源处理 | 未处理扣 10 分 |
|
|
196
|
-
|
|
197
|
-
**关键检查**:
|
|
198
|
-
- 在 `onAttachedToAbility` 注册的监听器,必须在 `onDetachedFromAbility` 取消
|
|
199
|
-
- Ability 级监听器(如 `bondStateChange`)不应依赖 `onDetachedFromEngine` 释放
|
|
200
|
-
|
|
201
|
-
---
|
|
202
|
-
|
|
203
|
-
### Phase 2:事件监听器管理检查
|
|
204
|
-
|
|
205
|
-
#### 2.1 鸿蒙 API 事件订阅(致命项,25分)
|
|
206
|
-
|
|
207
|
-
鸿蒙系统 API(@ohos 模块)的事件订阅必须严格管理。
|
|
208
|
-
|
|
209
|
-
| 检查项 | 问题描述 | 扣分规则 |
|
|
210
|
-
|--------|----------|----------|
|
|
211
|
-
| `on/off` 对称性 | 每个 `on()` 是否有对应 `off()` | **无对应 off 扣 20 分(致命)** |
|
|
212
|
-
| 回调参数匹配 | `off()` 是否传入正确的回调函数 | 参数错误扣 12 分 |
|
|
213
|
-
| 多次注册风险 | 同一事件是否可能被多次注册监听 | 存在风险扣 15 分 |
|
|
214
|
-
| 订阅状态追踪 | 是否有标志位追踪订阅状态 | 无追踪扣 8 分 |
|
|
215
|
-
|
|
216
|
-
**致命问题示例**:
|
|
217
|
-
|
|
218
|
-
```typescript
|
|
219
|
-
// ❌ 致命:每次调用都注册新监听器,无对应取消
|
|
220
|
-
async setNotifyValue(remoteId: string, characteristic: ble.BLECharacteristic): Promise<void> {
|
|
221
|
-
const gatt = this.mConnectedDevices.get(remoteId);
|
|
222
|
-
gatt.on('BLECharacteristicChange', (data) => {
|
|
223
|
-
this.onCharacteristicReceived(remoteId, data);
|
|
224
|
-
});
|
|
225
|
-
// ⚠️ 每次调用注册新监听器,断开连接时未取消!
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
// ✅ 正确实现
|
|
229
|
-
private characteristicCallbacks: Map<string, Function> = new Map();
|
|
230
|
-
|
|
231
|
-
async setNotifyValue(remoteId: string, characteristic: ble.BLECharacteristic): Promise<void> {
|
|
232
|
-
const gatt = this.mConnectedDevices.get(remoteId);
|
|
233
|
-
|
|
234
|
-
// 先取消旧的监听器
|
|
235
|
-
const oldCallback = this.characteristicCallbacks.get(remoteId);
|
|
236
|
-
if (oldCallback) {
|
|
237
|
-
gatt.off('BLECharacteristicChange', oldCallback);
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
// 注册新的监听器并保存
|
|
241
|
-
const newCallback = (data) => this.onCharacteristicReceived(remoteId, data);
|
|
242
|
-
gatt.on('BLECharacteristicChange', newCallback);
|
|
243
|
-
this.characteristicCallbacks.set(remoteId, newCallback);
|
|
244
|
-
}
|
|
245
|
-
```
|
|
246
|
-
|
|
247
|
-
#### 2.2 特殊系统资源释放(严苛项,20分)
|
|
248
|
-
|
|
249
|
-
鸿蒙平台特有资源必须显式释放。
|
|
250
|
-
|
|
251
|
-
| 检查项 | 问题描述 | 扣分规则 |
|
|
252
|
-
|--------|----------|----------|
|
|
253
|
-
| GattClientDevice.close | BLE Gatt 客户端是否调用 close() | **未调用扣 20 分(致命)** |
|
|
254
|
-
| 扫描状态清理 | `ble.stopBLEScan()` 是否在适当时机调用 | 未调用扣 15 分 |
|
|
255
|
-
| 地理位置监听 | `geoLocationManager.off()` 是否取消 | 未取消扣 15 分 |
|
|
256
|
-
| 网络状态监听 | `connection.on/off` 是否对称 | 不对称扣 12 分 |
|
|
257
|
-
|
|
258
|
-
**致命泄漏场景**:
|
|
259
|
-
|
|
260
|
-
```typescript
|
|
261
|
-
// ❌ 致命:GattClientDevice 创建后未释放
|
|
262
|
-
async scanCallback(device: ble.ScanResult): void {
|
|
263
|
-
// 在扫描回调中创建 GattClientDevice 获取设备名称
|
|
264
|
-
const gattClient = ble.createGattClientDevice(device.getMac());
|
|
265
|
-
const deviceName = await gattClient.getDeviceName();
|
|
266
|
-
// ⚠️ gattClient 未调用 close(),每次扫描都泄漏!
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
// ❌ 致命:服务查询创建的 GattClientDevice 未释放
|
|
270
|
-
async getServices(remoteId: string): Promise<ble.GattService[]> {
|
|
271
|
-
const gattClient = ble.createGattClientDevice(remoteId);
|
|
272
|
-
const services = await gattClient.getServices();
|
|
273
|
-
// ⚠️ 返回结果但未释放 gattClient
|
|
274
|
-
return services;
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
// ✅ 正确实现
|
|
278
|
-
async getServices(remoteId: string): Promise<ble.GattService[]> {
|
|
279
|
-
const gattClient = ble.createGattClientDevice(remoteId);
|
|
280
|
-
try {
|
|
281
|
-
const services = await gattClient.getServices();
|
|
282
|
-
return services;
|
|
283
|
-
} finally {
|
|
284
|
-
gattClient.close(); // 必须释放
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
```
|
|
288
|
-
|
|
289
|
-
---
|
|
290
|
-
|
|
291
|
-
### Phase 3:ArkTS 内存管理检查
|
|
292
|
-
|
|
293
|
-
#### 3.1 闭包循环引用(致命项,20分)
|
|
294
|
-
|
|
295
|
-
ArkTS 箭头函数闭包可能导致 `this` 循环引用。
|
|
296
|
-
|
|
297
|
-
| 检查项 | 问题描述 | 扣分规则 |
|
|
298
|
-
|--------|----------|----------|
|
|
299
|
-
| this 捕获 | 箭头函数是否捕获 `this` 引用 | 捕获且未释放扣 15 分 |
|
|
300
|
-
| 闭包保留 | 闭包是否保留外部变量引用 | 保留且无法释放扣 12 分 |
|
|
301
|
-
| 匿名函数累积 | 是否反复创建匿名函数作为回调 | 累积风险扣 10 分 |
|
|
302
|
-
|
|
303
|
-
**循环引用检测**:
|
|
304
|
-
|
|
305
|
-
```typescript
|
|
306
|
-
// ❌ 风险:箭头函数捕获 this,形成循环引用
|
|
307
|
-
class MyPlugin {
|
|
308
|
-
private gatt: ble.GattClientDevice;
|
|
309
|
-
|
|
310
|
-
connect(): void {
|
|
311
|
-
// 箭头函数捕获 this,this.gatt 持有回调,回调持有 this
|
|
312
|
-
this.gatt.on('BLEConnectionStateChange', (state) => {
|
|
313
|
-
this.onConnectionStateChanged(state); // this 被捕获
|
|
314
|
-
});
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
// ✅ 正确实现:使用普通函数或弱引用
|
|
319
|
-
class MyPlugin {
|
|
320
|
-
private gatt: ble.GattClientDevice;
|
|
321
|
-
private connectionCallback: Function;
|
|
322
|
-
|
|
323
|
-
constructor() {
|
|
324
|
-
// 在构造函数中预创建回调
|
|
325
|
-
this.connectionCallback = (state: ble.ProfileConnectionState) => {
|
|
326
|
-
this.onConnectionStateChanged(state);
|
|
327
|
-
};
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
connect(): void {
|
|
331
|
-
this.gatt.on('BLEConnectionStateChange', this.connectionCallback);
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
disconnect(): void {
|
|
335
|
-
this.gatt.off('BLEConnectionStateChange', this.connectionCallback);
|
|
336
|
-
this.connectionCallback = null; // 清除引用
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
```
|
|
340
|
-
|
|
341
|
-
#### 3.2 Map/Set 数据清理(严苛项,15分)
|
|
342
|
-
|
|
343
|
-
持久化的 Map/Set 数据必须提供清理机制。
|
|
344
|
-
|
|
345
|
-
| 检查项 | 问题描述 | 扣分规则 |
|
|
346
|
-
|--------|----------|----------|
|
|
347
|
-
| Map.clear() | 是否在适当时机调用 clear() | 未清理扣 12 分 |
|
|
348
|
-
| Map.delete() | 单项数据是否正确删除 | 删除不完整扣 8 分 |
|
|
349
|
-
| 静态 Map 风险 | 静态 Map 是否无限累积 | **累积风险扣 15 分** |
|
|
350
|
-
| 缓存上限 | 是否设置缓存大小上限 | 无上限扣 10 分 |
|
|
351
|
-
|
|
352
|
-
**Map 清理检查**:
|
|
353
|
-
|
|
354
|
-
```typescript
|
|
355
|
-
// ❌ 问题:Map 数据未在适当时机清理
|
|
356
|
-
private mScanFilters: Map<string, Object> = new Map();
|
|
357
|
-
|
|
358
|
-
async startScan(filters: Object): void {
|
|
359
|
-
this.mScanFilters.set('current', filters);
|
|
360
|
-
ble.startBLEScan(filters);
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
async stopScan(): void {
|
|
364
|
-
ble.stopBLEScan();
|
|
365
|
-
// ⚠️ mScanFilters 未清理!
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
// ✅ 正确实现
|
|
369
|
-
async stopScan(): void {
|
|
370
|
-
ble.stopBLEScan();
|
|
371
|
-
this.mScanFilters.clear(); // 清理扫描过滤器
|
|
372
|
-
}
|
|
373
|
-
```
|
|
374
|
-
|
|
375
|
-
#### 3.3 静态变量与全局状态(严苛项,10分)
|
|
376
|
-
|
|
377
|
-
静态变量和全局状态可能导致内存无法释放。
|
|
378
|
-
|
|
379
|
-
| 检查项 | 问题描述 | 扣分规则 |
|
|
380
|
-
|--------|----------|----------|
|
|
381
|
-
| static 可变集合 | 静态 List/Map 是否无限增长 | 增长风险扣 10 分 |
|
|
382
|
-
| 全局缓存清理 | 是否提供全局缓存清理方法 | 无清理扣 8 分 |
|
|
383
|
-
| 单例资源释放 | 单例模式是否正确释放资源 | 未释放扣 10 分 |
|
|
384
|
-
|
|
385
|
-
---
|
|
386
|
-
|
|
387
|
-
### Phase 4:C++ Native 内存检查
|
|
388
|
-
|
|
389
|
-
#### 4.1 NAPI 引用管理(致命项,25分)
|
|
390
|
-
|
|
391
|
-
NAPI 引用是鸿蒙 Native 层最核心的资源,错误管理会导致内存泄漏或崩溃。
|
|
392
|
-
|
|
393
|
-
| 检查项 | 问题描述 | 扣分规则 |
|
|
394
|
-
|--------|----------|----------|
|
|
395
|
-
| `napi_ref` 创建 | 是否为需要长期持有的对象创建 `napi_ref` | 缺失扣 5 分 |
|
|
396
|
-
| `napi_ref` 释放 | 是否在 dispose/destroy 时调用 `napi_delete_reference` | **未释放扣 25 分(致命)** |
|
|
397
|
-
| 引用计数平衡 | `napi_create_reference` 和 `napi_delete_reference` 数量是否匹配 | 不平衡扣 18 分 |
|
|
398
|
-
| Handle Scope 清理 | 是否正确关闭 `napi_handle_scope` | **未关闭扣 20 分(致命)** |
|
|
399
|
-
|
|
400
|
-
**C++ NAPI 管理示例**:
|
|
401
|
-
|
|
402
|
-
```cpp
|
|
403
|
-
// ❌ 致命:NAPI 引用未释放
|
|
404
|
-
class NativePlugin {
|
|
405
|
-
private:
|
|
406
|
-
napi_ref callbackRef;
|
|
407
|
-
|
|
408
|
-
public:
|
|
409
|
-
void registerCallback(napi_env env, napi_value callback) {
|
|
410
|
-
napi_create_reference(env, callback, 1, &this->callbackRef);
|
|
411
|
-
// 缺少释放逻辑!
|
|
412
|
-
}
|
|
413
|
-
|
|
414
|
-
// 没有 destroy 方法释放 napi_ref
|
|
415
|
-
};
|
|
416
|
-
|
|
417
|
-
// ✅ 正确实现
|
|
418
|
-
class NativePlugin {
|
|
419
|
-
private:
|
|
420
|
-
napi_ref callbackRef = nullptr;
|
|
421
|
-
|
|
422
|
-
public:
|
|
423
|
-
void registerCallback(napi_env env, napi_value callback) {
|
|
424
|
-
if (this->callbackRef) {
|
|
425
|
-
napi_delete_reference(env, this->callbackRef);
|
|
426
|
-
}
|
|
427
|
-
napi_create_reference(env, callback, 1, &this->callbackRef);
|
|
428
|
-
}
|
|
429
|
-
|
|
430
|
-
void destroy(napi_env env) {
|
|
431
|
-
if (this->callbackRef) {
|
|
432
|
-
napi_delete_reference(env, this->callbackRef); // 必须释放
|
|
433
|
-
this->callbackRef = nullptr;
|
|
434
|
-
}
|
|
435
|
-
}
|
|
436
|
-
};
|
|
437
|
-
```
|
|
438
|
-
|
|
439
|
-
#### 4.2 Native 内存分配释放(致命项,20分)
|
|
440
|
-
|
|
441
|
-
C++ 内存分配必须有对应释放。
|
|
442
|
-
|
|
443
|
-
| 检查项 | 问题描述 | 扣分规则 |
|
|
444
|
-
|--------|----------|----------|
|
|
445
|
-
| malloc/free 匹配 | 每个 `malloc` 是否有对应 `free` | **不匹配扣 20 分(致命)** |
|
|
446
|
-
| new/delete 匹配 | 每个 `new` 是否有对应 `delete` | **不匹配扣 20 分(致命)** |
|
|
447
|
-
| 异常路径释放 | 异常发生时是否释放已分配内存 | 未释放扣 15 分 |
|
|
448
|
-
| RAII 模式 | 是否优先使用智能指针 | 未使用扣 10 分 |
|
|
449
|
-
|
|
450
|
-
**RAII 推荐模式**:
|
|
451
|
-
|
|
452
|
-
```cpp
|
|
453
|
-
// ✅ 使用智能指针自动管理
|
|
454
|
-
#include <memory>
|
|
455
|
-
|
|
456
|
-
void processData() {
|
|
457
|
-
std::unique_ptr<Buffer> buffer = std::make_unique<Buffer>(1024);
|
|
458
|
-
// 自动释放,无需手动 delete
|
|
459
|
-
|
|
460
|
-
// 或使用 std::shared_ptr 处理共享所有权
|
|
461
|
-
std::shared_ptr<Resource> resource = std::make_shared<Resource>();
|
|
462
|
-
}
|
|
463
|
-
|
|
464
|
-
// ✅ RAII wrapper 模式
|
|
465
|
-
class BufferGuard {
|
|
466
|
-
private:
|
|
467
|
-
void* buf;
|
|
468
|
-
public:
|
|
469
|
-
BufferGuard(size_t size) : buf(malloc(size)) {}
|
|
470
|
-
~BufferGuard() {
|
|
471
|
-
if (buf) free(buf); // 自动释放
|
|
472
|
-
}
|
|
473
|
-
};
|
|
474
|
-
```
|
|
475
|
-
|
|
476
|
-
---
|
|
477
|
-
|
|
478
|
-
### Phase 5:严苛评分计算
|
|
479
|
-
|
|
480
|
-
采用**严苛扣分制**,从 100 分开始扣减:
|
|
481
|
-
|
|
482
|
-
```
|
|
483
|
-
初始分数:100 分
|
|
484
|
-
|
|
485
|
-
扣分类型:
|
|
486
|
-
├── 致命问题:-20 分(最多扣 60 分,超过直接评 0 分)
|
|
487
|
-
│ ├── GattClientDevice 未释放
|
|
488
|
-
│ ├── NAPI 引用未释放
|
|
489
|
-
│ ├── Handle Scope 未关闭
|
|
490
|
-
│ ├── malloc/free 不匹配
|
|
491
|
-
│ ├── new/delete 不匹配
|
|
492
|
-
│ ├── 事件订阅无对应取消
|
|
493
|
-
│ └── onDetachedFromEngine 未释放资源
|
|
494
|
-
├── 严重问题:-15 分
|
|
495
|
-
│ ├── 闭包循环引用风险
|
|
496
|
-
│ ├── Map 数据未清理
|
|
497
|
-
│ ├── 静态集合累积风险
|
|
498
|
-
│ ├── Ability 生命周期未绑定
|
|
499
|
-
├── 中等问题:-10 分
|
|
500
|
-
│ ├── 订阅状态未追踪
|
|
501
|
-
│ ├── 回调参数匹配错误
|
|
502
|
-
│ ├── 缓存无上限
|
|
503
|
-
│ ├── 单例资源释放不完整
|
|
504
|
-
├── 轻微问题:-5 分
|
|
505
|
-
│ ├── 释放顺序不当
|
|
506
|
-
│ ├── 初始化不完整
|
|
507
|
-
|
|
508
|
-
特殊规则(直接 0 分):
|
|
509
|
-
├── 未发现鸿蒙代码特征 → 0 分
|
|
510
|
-
├── 致命问题 ≥ 3 个 → 0 分
|
|
511
|
-
├── 致命问题 ≥ 2 个 + 严重问题 ≥ 3 个 → 0 分
|
|
512
|
-
├── 累计扣分超过 60 分 → 0 分
|
|
513
|
-
|
|
514
|
-
最低分数:0 分
|
|
515
|
-
```
|
|
516
|
-
|
|
517
|
-
---
|
|
518
|
-
|
|
519
|
-
## 输出文件(必须遵守)
|
|
520
|
-
|
|
521
|
-
检视完成后**必须**生成以下文件:
|
|
522
|
-
|
|
523
|
-
| 文件 | 说明 |
|
|
524
|
-
|------|------|
|
|
525
|
-
| `{outputDir}/内存泄露检视报告.md` | 详细检视报告,含严苛评分(**独立文件,禁止只写入 result 执行结果文件**) |
|
|
526
|
-
|
|
527
|
-
> ⚠️ **输出文件自检**:写入结果文件前,先确认 `{outputDir}/内存泄露检视报告.md` 已存在且内容完整。若报告内容仅在草稿中,必须先将其保存为上述独立文件。
|
|
528
|
-
|
|
529
|
-
---
|
|
530
|
-
|
|
531
|
-
## 输出格式规范
|
|
532
|
-
|
|
533
|
-
报告必须严格遵循以下格式,确保 `_parseFlutterLibraryScore` 函数能正确解析:
|
|
534
|
-
|
|
535
|
-
```markdown
|
|
536
|
-
# ${repoName} 内存泄露检视报告
|
|
537
|
-
|
|
538
|
-
## 📊 内存泄露检视评分
|
|
539
|
-
|
|
540
|
-
**综合评分:78/100**
|
|
541
|
-
|
|
542
|
-
> 评分说明:采用严苛扣分制,从 100 分开始扣减,最低 0 分
|
|
543
|
-
|
|
544
|
-
| 维度 | 满分 | 得分 | 扣分详情 |
|
|
545
|
-
|------|------|------|----------|
|
|
546
|
-
| Plugin 生命周期绑定 | 20 | 15 | onDetachedFromEngine 资源清理不完整 -5 |
|
|
547
|
-
| Ability 生命周期绑定 | 15 | 10 | onDetachedFromAbility 缺失 -5 |
|
|
548
|
-
| 鸿蒙 API 事件订阅 | 25 | 5 | BLECharacteristicChange 监听器未取消 -20 |
|
|
549
|
-
| 特殊系统资源释放 | 20 | 0 | GattClientDevice 未释放 -20 |
|
|
550
|
-
| 闭包循环引用 | 20 | 15 | 箭头函数捕获 this -5 |
|
|
551
|
-
| Map/Set 数据清理 | 15 | 10 | mScanFilters 未清理 -5 |
|
|
552
|
-
| 静态变量与全局状态 | 10 | 8 | 无全局缓存清理方法 -2 |
|
|
553
|
-
| NAPI 引用管理 | 25 | 25 | 无 NAPI 实现 |
|
|
554
|
-
| Native 内存分配释放 | 20 | 20 | 无 C++ 实现 |
|
|
555
|
-
| **总计** | **100** | **78** | 累计扣分 22 分 |
|
|
556
|
-
|
|
557
|
-
**扣分明细**:
|
|
558
|
-
- BLECharacteristicChange 监听器未取消(致命):-20 分
|
|
559
|
-
- GattClientDevice 未释放(致命):-20 分
|
|
560
|
-
- onDetachedFromEngine 资源清理不完整(中等):-5 分
|
|
561
|
-
- ...
|
|
562
|
-
|
|
563
|
-
---
|
|
564
|
-
|
|
565
|
-
## 🔍 详细检视结果
|
|
566
|
-
|
|
567
|
-
### 1. Plugin 生命周期资源管理检查
|
|
568
|
-
|
|
569
|
-
#### 1.1 FlutterPlugin 生命周期绑定
|
|
570
|
-
|
|
571
|
-
| 检查项 | 规范要求 | 实际情况 | 状态 |
|
|
572
|
-
|--------|----------|----------|------|
|
|
573
|
-
| onAttachedToEngine | 初始化所有资源 | MethodChannel 初始化完整 | ✅ 通过 |
|
|
574
|
-
| onDetachedFromEngine | 释放所有资源 | 仅取消 handler,Map 未清理 | ❌ 失败 |
|
|
575
|
-
| setMethodCallHandler(null) | 取消 MethodChannel handler | 已取消 | ✅ 通过 |
|
|
576
|
-
|
|
577
|
-
**问题详情**:
|
|
578
|
-
|
|
579
|
-
| 问题类型 | 文件位置 | 行号 | 严重度 | 说明 |
|
|
580
|
-
|----------|----------|------|--------|------|
|
|
581
|
-
| **资源未清理** | FlutterBluePlusOhosPlugin.ets | 87-97 | **致命** | onDetachedFromEngine 未清理 mConnectedDevices、mMtu 等 Map 数据 |
|
|
582
|
-
|
|
583
|
-
**代码示例 - 问题代码**:
|
|
584
|
-
...
|
|
585
|
-
|
|
586
|
-
### 2. 事件监听器管理检查
|
|
587
|
-
...
|
|
588
|
-
|
|
589
|
-
### 3. ArkTS 内存管理检查
|
|
590
|
-
...
|
|
591
|
-
|
|
592
|
-
### 4. C++ Native 内存检查
|
|
593
|
-
...
|
|
594
|
-
|
|
595
|
-
---
|
|
596
|
-
|
|
597
|
-
## 📋 改进建议
|
|
598
|
-
|
|
599
|
-
### 高优先级(致命问题)
|
|
600
|
-
|
|
601
|
-
1. **释放 GattClientDevice**
|
|
602
|
-
- 问题:scanCallback 中创建的 GattClientDevice 未调用 close()
|
|
603
|
-
- 建议:使用 try-finally 确保 GattClientDevice.close() 被调用
|
|
604
|
-
|
|
605
|
-
2. **取消 BLECharacteristicChange 监听**
|
|
606
|
-
- 问题:每次 setNotifyValue 都注册新监听器,断开时未取消
|
|
607
|
-
- 建议:使用 Map 保存回调引用,在 disconnect 时取消
|
|
608
|
-
|
|
609
|
-
### 中优先级
|
|
610
|
-
|
|
611
|
-
...
|
|
612
|
-
|
|
613
|
-
### 低优先级
|
|
614
|
-
|
|
615
|
-
...
|
|
616
|
-
```
|
|
617
|
-
|
|
618
|
-
---
|
|
619
|
-
|
|
620
|
-
## 检视清单
|
|
621
|
-
|
|
622
|
-
详细检查项参见 [references/CHECKLIST.md](references/CHECKLIST.md)
|
|
623
|
-
|
|
624
|
-
---
|
|
625
|
-
|
|
626
|
-
## 输出要求
|
|
627
|
-
|
|
628
|
-
1. 报告必须以 `## 📊 内存泄露检视评分` 开头,包含评分表格
|
|
629
|
-
2. 评分格式必须是:`**综合评分:XX/100**`
|
|
630
|
-
3. 评分必须是 0-100 的整数
|
|
631
|
-
4. 仅检视 ohos/ 目录下的 ETS/C++ 代码,不检视 Flutter Dart 层
|
|
632
|
-
5. 详细列出每项扣分(文件位置、行号、扣分值)
|
|
633
|
-
6. 给出具体改进建议,按优先级排序
|
|
634
|
-
7. 使用中文撰写内容
|
|
635
|
-
|
|
636
|
-
### 结构化指标输出(必须执行)
|
|
637
|
-
|
|
638
|
-
执行环境会在任务 prompt 中下发一个**结构化指标文件输出路径**(`stepId{X}_loop{L}_meta_{N}.json`)。
|
|
639
|
-
检视完成后,**必须**将最终评分以下述 JSON 对象写入该路径:
|
|
640
|
-
|
|
641
|
-
```json
|
|
642
|
-
{
|
|
643
|
-
"memoryLeakScore": 85,
|
|
644
|
-
"scoreReason": "致命问题1处-20,资源未释放2处-16等(一句话判定依据,≤50字;触发一票否决时必须注明)"
|
|
645
|
-
}
|
|
646
|
-
```
|
|
647
|
-
|
|
648
|
-
| 字段 | 类型 | 说明 |
|
|
649
|
-
|------|------|------|
|
|
650
|
-
| `memoryLeakScore` | number | 内存泄露检视评分(0-100 整数,与报告中 `**综合评分:XX/100**` 的数值一致) |
|
|
651
|
-
| `scoreReason` | string | 评分判定依据摘要(可选,前端悬浮提示展示;0 分时强烈建议写明触发规则) |
|
|
652
|
-
|
|
1
|
+
---
|
|
2
|
+
name: flutter-library-memory-leak-check
|
|
3
|
+
description: 对 Flutter 三方库的**鸿蒙化代码**进行内存泄露检视,聚焦 ohos 目录下的 ArkTS/ETS 和 C++ 代码,分析资源管理不当、循环引用、未释放对象等潜在内存泄露问题,生成严苛评分报告(0-100分)。作为 Flutter 仓库检视流程的第五阶段,依赖编码质量检视结果。
|
|
4
|
+
license: Apache-2.0
|
|
5
|
+
compatibility: 需要访问 Git 仓库、分析 ohos 目录下的 ETS/C++ 源码
|
|
6
|
+
metadata:
|
|
7
|
+
version: "1.0.0"
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# FlutterLibraryMemoryLeakCheckSkill
|
|
11
|
+
|
|
12
|
+
对 Flutter 三方库的**鸿蒙化实现代码**进行内存泄露检视,评估库在内存管理方面的安全性,识别潜在的内存泄露风险。
|
|
13
|
+
|
|
14
|
+
> ⚠️ **核心定位**:本 SKILL **仅检视鸿蒙化代码**,不检视 Flutter Dart 层或非鸿蒙化部分的代码。检视范围包括:
|
|
15
|
+
> - 鸿蒙平台特有的 ArkTS/ETS 代码(常见目录:`ohos/ets/`、`harmony/ets/`、`src/ohos/` 等)
|
|
16
|
+
> - 鸿蒙 Native C++ 代码(常见目录:`ohos/src/`、`ohos/cpp/`、`native/` 等)
|
|
17
|
+
> - 鸿蒙平台特有的 API 资源管理(如 GattClientDevice、NAPI 引用、@ohos 模块等)
|
|
18
|
+
>
|
|
19
|
+
> **重要**:目录名称不固定,需通过源码扫描识别鸿蒙化代码特征
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## 任务参数
|
|
24
|
+
|
|
25
|
+
| 参数 | 必需 | 说明 |
|
|
26
|
+
|------|------|------|
|
|
27
|
+
| `repoUrl` | ✅ | Git 仓库地址,支持分支 `?branch=xxx` |
|
|
28
|
+
| `outputDir` | ✅ | 输出目录绝对路径,存放检视报告 |
|
|
29
|
+
| `interfaceDocPath` | ✅ | 接口规格说明文档路径 |
|
|
30
|
+
| `repoName` | ✅ | 仓库名称(用于报告标识) |
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## 输入依赖
|
|
35
|
+
|
|
36
|
+
本 SKILL 是 Flutter 仓库检视流程的**第五阶段**,依赖:
|
|
37
|
+
|
|
38
|
+
- **前置 SKILL**: `flutter-library-code-quality-check`
|
|
39
|
+
- **输入文件**: `接口规格说明.md`、`编码质量检视报告.md`
|
|
40
|
+
- **仓库源码**: 已克隆到 `{outputDir}/source/`,重点分析 `ohos/` 目录
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## 工作流程
|
|
45
|
+
|
|
46
|
+
### Phase 0:鸿蒙代码定位与范围识别
|
|
47
|
+
|
|
48
|
+
首先扫描源码,**通过代码特征识别鸿蒙化实现**,而非仅依赖目录名称。
|
|
49
|
+
|
|
50
|
+
#### 0.1 鸿蒙代码特征识别
|
|
51
|
+
|
|
52
|
+
扫描源码文件,识别以下鸿蒙化特征:
|
|
53
|
+
|
|
54
|
+
**ArkTS/ETS 代码特征**:
|
|
55
|
+
```typescript
|
|
56
|
+
// 特征 1:@ohos 模块导入
|
|
57
|
+
import ble from '@ohos.bluetooth';
|
|
58
|
+
import connection from '@ohos.bluetooth.connection';
|
|
59
|
+
import geoLocationManager from '@ohos.geoLocationManager';
|
|
60
|
+
import { GattClientDevice } from '@ohos.bluetooth.ble';
|
|
61
|
+
|
|
62
|
+
// 特征 2:鸿蒙特有的 API 调用
|
|
63
|
+
ble.createGattClientDevice();
|
|
64
|
+
ble.startBLEScan();
|
|
65
|
+
connection.pairDevice();
|
|
66
|
+
geoLocationManager.on('locationChange');
|
|
67
|
+
|
|
68
|
+
// 特征 3:FlutterPlugin 鸦蒙实现
|
|
69
|
+
class XxxPlugin implements FlutterPlugin {
|
|
70
|
+
onAttachedToEngine(binding: FlutterPluginBinding): void { ... }
|
|
71
|
+
onDetachedFromEngine(binding: FlutterPluginBinding): void { ... }
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// 特征 4:.ets 文件扩展名
|
|
75
|
+
*.ets // ArkTS 文件
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
**C++ Native 代码特征**:
|
|
79
|
+
```cpp
|
|
80
|
+
// 特征 1:NAPI 相关头文件
|
|
81
|
+
#include <napi/native_api.h>
|
|
82
|
+
#include <napi/js_native_api.h>
|
|
83
|
+
#include <napi/js_native_api_types.h>
|
|
84
|
+
|
|
85
|
+
// 特征 2:NAPI 函数调用
|
|
86
|
+
napi_create_reference(env, value, 1, &ref);
|
|
87
|
+
napi_delete_reference(env, ref);
|
|
88
|
+
napi_open_handle_scope(env, &scope);
|
|
89
|
+
napi_close_handle_scope(env, scope);
|
|
90
|
+
napi_get_value_string_utf8(env, value, buf, bufsize, &len);
|
|
91
|
+
|
|
92
|
+
// 特征 3:鸿蒙特有的 Native API
|
|
93
|
+
OH_NativeXxx();
|
|
94
|
+
HarmonyOS_NativeXxx();
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
**常见鸿蒙化目录(仅供参考,不作为唯一判定依据)**:
|
|
98
|
+
```
|
|
99
|
+
常见目录名称:
|
|
100
|
+
├── ohos/ # 最常见
|
|
101
|
+
├── harmony/ # 部分库使用
|
|
102
|
+
├── harmonyos/ # 部分库使用
|
|
103
|
+
├── src/ohos/ # 嵌入式结构
|
|
104
|
+
├── platform/ohos/ # 平台分离结构
|
|
105
|
+
├── native/ # Native 实现(需检查 NAPI 特征)
|
|
106
|
+
├── ets/ # 独立 ETS 目录
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
#### 0.2 扫描流程
|
|
110
|
+
|
|
111
|
+
```
|
|
112
|
+
扫描流程:
|
|
113
|
+
├── Step 1:扫描所有 .ets 文件
|
|
114
|
+
│ ├── 查找 @ohos 模块导入
|
|
115
|
+
│ ├── 查找鸿蒙 API 调用(ble.createGattClientDevice 等)\│ ├── 查找 FlutterPlugin 实现类
|
|
116
|
+
│ └── 记录鸿蒙化代码文件路径
|
|
117
|
+
├── Step 2:扫描所有 .cpp/.h 文件
|
|
118
|
+
│ ├── 查找 NAPI 头文件引用
|
|
119
|
+
│ ├── 查找 napi_xxx 函数调用
|
|
120
|
+
│ ├── 记录鸿蒙 Native 代码文件路径
|
|
121
|
+
├── Step 3:综合判定
|
|
122
|
+
│ ├── 若发现鸿蒙代码特征 → 进入 Phase 1 深度分析
|
|
123
|
+
│ ├── 若未发现任何鸿蒙代码特征 → **报告评分 0 分**,标注"未实现鸿蒙化"
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
**判定规则**:
|
|
127
|
+
- **优先通过代码特征识别**,而非仅依赖目录名称
|
|
128
|
+
- 若扫描到 `@ohos` 模块导入或 NAPI 函数调用 → **确认鸿蒙化实现**,进入 Phase 1
|
|
129
|
+
- 若存在 `.ets` 文件且包含鸿蒙 API 调用 → **确认鸿蒙化实现**,进入 Phase 1
|
|
130
|
+
- 若扫描整个源码均未发现鸿蒙代码特征 → **报告评分 0 分**,标注"未实现鸿蒙化"
|
|
131
|
+
- **注意**:即使没有 ohos 目录,但源码中存在鸿蒙化实现(如在 src/ 或其他目录),仍需检视
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
### Phase 1:Plugin 生命周期资源管理检查
|
|
136
|
+
|
|
137
|
+
#### 1.1 FlutterPlugin 生命周期绑定(致命项,20分)
|
|
138
|
+
|
|
139
|
+
Flutter Plugin 在鸿蒙平台必须正确绑定生命周期事件。
|
|
140
|
+
|
|
141
|
+
| 检查项 | 问题描述 | 扣分规则 |
|
|
142
|
+
|--------|----------|----------|
|
|
143
|
+
| `onAttachedToEngine` | 资源初始化是否完整 | 初始化不完整扣 5 分 |
|
|
144
|
+
| `onDetachedFromEngine` | 是否释放**所有**资源 | **未释放扣 20 分(致命)** |
|
|
145
|
+
| `setMethodCallHandler(null)` | 是否取消 MethodChannel handler | 未取消扣 10 分 |
|
|
146
|
+
| Map 数据清理 | `mConnectedDevices`、`mMtu` 等是否清空 | 未清空扣 12 分 |
|
|
147
|
+
| 释放顺序 | 是否按正确顺序释放(先取消监听再清数据) | 顺序错误扣 8 分 |
|
|
148
|
+
|
|
149
|
+
**代码示例**:
|
|
150
|
+
|
|
151
|
+
```typescript
|
|
152
|
+
// ❌ 致命错误:onDetachedFromEngine 未释放所有资源
|
|
153
|
+
onDetachedFromEngine(binding: FlutterPluginBinding): void {
|
|
154
|
+
if (this.channel != null) {
|
|
155
|
+
this.channel.setMethodCallHandler(null) // 仅取消 handler
|
|
156
|
+
}
|
|
157
|
+
// 缺失:mConnectedDevices、mMtu、mScanFilters 等未清空
|
|
158
|
+
// 缺失:ble.stopBLEScan() 未调用
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// ✅ 正确实现
|
|
162
|
+
onDetachedFromEngine(binding: FlutterPluginBinding): void {
|
|
163
|
+
// 1. 取消所有事件监听
|
|
164
|
+
connection.off("bondStateChange", this.bondStateCallback);
|
|
165
|
+
ble.off("BLEDeviceFind", this.scanCallback);
|
|
166
|
+
|
|
167
|
+
// 2. 停止进行中的操作
|
|
168
|
+
ble.stopBLEScan();
|
|
169
|
+
|
|
170
|
+
// 3. 清空 Map 数据
|
|
171
|
+
this.mConnectedDevices.clear();
|
|
172
|
+
this.mMtu.clear();
|
|
173
|
+
this.mScanFilters.clear();
|
|
174
|
+
|
|
175
|
+
// 4. 取消 MethodChannel handler
|
|
176
|
+
if (this.channel != null) {
|
|
177
|
+
this.channel.setMethodCallHandler(null);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// 5. 释放其他资源
|
|
181
|
+
for (const device of this.mConnectedDevices.values()) {
|
|
182
|
+
device.close(); // 释放 GattClientDevice
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
#### 1.2 Ability 生命周期绑定(严苛项,15分)
|
|
188
|
+
|
|
189
|
+
Activity/Ability 生命周期资源必须正确绑定。
|
|
190
|
+
|
|
191
|
+
| 检查项 | 问题描述 | 扣分规则 |
|
|
192
|
+
|--------|----------|----------|
|
|
193
|
+
| `onAttachedToAbility` | Ability 附加时资源注册 | 未处理扣 8 分 |
|
|
194
|
+
| `onDetachedFromAbility` | Ability 分离时资源释放 | **未释放扣 15 分** |
|
|
195
|
+
| 配置变更处理 | 屏幕旋转等配置变更时的资源处理 | 未处理扣 10 分 |
|
|
196
|
+
|
|
197
|
+
**关键检查**:
|
|
198
|
+
- 在 `onAttachedToAbility` 注册的监听器,必须在 `onDetachedFromAbility` 取消
|
|
199
|
+
- Ability 级监听器(如 `bondStateChange`)不应依赖 `onDetachedFromEngine` 释放
|
|
200
|
+
|
|
201
|
+
---
|
|
202
|
+
|
|
203
|
+
### Phase 2:事件监听器管理检查
|
|
204
|
+
|
|
205
|
+
#### 2.1 鸿蒙 API 事件订阅(致命项,25分)
|
|
206
|
+
|
|
207
|
+
鸿蒙系统 API(@ohos 模块)的事件订阅必须严格管理。
|
|
208
|
+
|
|
209
|
+
| 检查项 | 问题描述 | 扣分规则 |
|
|
210
|
+
|--------|----------|----------|
|
|
211
|
+
| `on/off` 对称性 | 每个 `on()` 是否有对应 `off()` | **无对应 off 扣 20 分(致命)** |
|
|
212
|
+
| 回调参数匹配 | `off()` 是否传入正确的回调函数 | 参数错误扣 12 分 |
|
|
213
|
+
| 多次注册风险 | 同一事件是否可能被多次注册监听 | 存在风险扣 15 分 |
|
|
214
|
+
| 订阅状态追踪 | 是否有标志位追踪订阅状态 | 无追踪扣 8 分 |
|
|
215
|
+
|
|
216
|
+
**致命问题示例**:
|
|
217
|
+
|
|
218
|
+
```typescript
|
|
219
|
+
// ❌ 致命:每次调用都注册新监听器,无对应取消
|
|
220
|
+
async setNotifyValue(remoteId: string, characteristic: ble.BLECharacteristic): Promise<void> {
|
|
221
|
+
const gatt = this.mConnectedDevices.get(remoteId);
|
|
222
|
+
gatt.on('BLECharacteristicChange', (data) => {
|
|
223
|
+
this.onCharacteristicReceived(remoteId, data);
|
|
224
|
+
});
|
|
225
|
+
// ⚠️ 每次调用注册新监听器,断开连接时未取消!
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
// ✅ 正确实现
|
|
229
|
+
private characteristicCallbacks: Map<string, Function> = new Map();
|
|
230
|
+
|
|
231
|
+
async setNotifyValue(remoteId: string, characteristic: ble.BLECharacteristic): Promise<void> {
|
|
232
|
+
const gatt = this.mConnectedDevices.get(remoteId);
|
|
233
|
+
|
|
234
|
+
// 先取消旧的监听器
|
|
235
|
+
const oldCallback = this.characteristicCallbacks.get(remoteId);
|
|
236
|
+
if (oldCallback) {
|
|
237
|
+
gatt.off('BLECharacteristicChange', oldCallback);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// 注册新的监听器并保存
|
|
241
|
+
const newCallback = (data) => this.onCharacteristicReceived(remoteId, data);
|
|
242
|
+
gatt.on('BLECharacteristicChange', newCallback);
|
|
243
|
+
this.characteristicCallbacks.set(remoteId, newCallback);
|
|
244
|
+
}
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
#### 2.2 特殊系统资源释放(严苛项,20分)
|
|
248
|
+
|
|
249
|
+
鸿蒙平台特有资源必须显式释放。
|
|
250
|
+
|
|
251
|
+
| 检查项 | 问题描述 | 扣分规则 |
|
|
252
|
+
|--------|----------|----------|
|
|
253
|
+
| GattClientDevice.close | BLE Gatt 客户端是否调用 close() | **未调用扣 20 分(致命)** |
|
|
254
|
+
| 扫描状态清理 | `ble.stopBLEScan()` 是否在适当时机调用 | 未调用扣 15 分 |
|
|
255
|
+
| 地理位置监听 | `geoLocationManager.off()` 是否取消 | 未取消扣 15 分 |
|
|
256
|
+
| 网络状态监听 | `connection.on/off` 是否对称 | 不对称扣 12 分 |
|
|
257
|
+
|
|
258
|
+
**致命泄漏场景**:
|
|
259
|
+
|
|
260
|
+
```typescript
|
|
261
|
+
// ❌ 致命:GattClientDevice 创建后未释放
|
|
262
|
+
async scanCallback(device: ble.ScanResult): void {
|
|
263
|
+
// 在扫描回调中创建 GattClientDevice 获取设备名称
|
|
264
|
+
const gattClient = ble.createGattClientDevice(device.getMac());
|
|
265
|
+
const deviceName = await gattClient.getDeviceName();
|
|
266
|
+
// ⚠️ gattClient 未调用 close(),每次扫描都泄漏!
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// ❌ 致命:服务查询创建的 GattClientDevice 未释放
|
|
270
|
+
async getServices(remoteId: string): Promise<ble.GattService[]> {
|
|
271
|
+
const gattClient = ble.createGattClientDevice(remoteId);
|
|
272
|
+
const services = await gattClient.getServices();
|
|
273
|
+
// ⚠️ 返回结果但未释放 gattClient
|
|
274
|
+
return services;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
// ✅ 正确实现
|
|
278
|
+
async getServices(remoteId: string): Promise<ble.GattService[]> {
|
|
279
|
+
const gattClient = ble.createGattClientDevice(remoteId);
|
|
280
|
+
try {
|
|
281
|
+
const services = await gattClient.getServices();
|
|
282
|
+
return services;
|
|
283
|
+
} finally {
|
|
284
|
+
gattClient.close(); // 必须释放
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
### Phase 3:ArkTS 内存管理检查
|
|
292
|
+
|
|
293
|
+
#### 3.1 闭包循环引用(致命项,20分)
|
|
294
|
+
|
|
295
|
+
ArkTS 箭头函数闭包可能导致 `this` 循环引用。
|
|
296
|
+
|
|
297
|
+
| 检查项 | 问题描述 | 扣分规则 |
|
|
298
|
+
|--------|----------|----------|
|
|
299
|
+
| this 捕获 | 箭头函数是否捕获 `this` 引用 | 捕获且未释放扣 15 分 |
|
|
300
|
+
| 闭包保留 | 闭包是否保留外部变量引用 | 保留且无法释放扣 12 分 |
|
|
301
|
+
| 匿名函数累积 | 是否反复创建匿名函数作为回调 | 累积风险扣 10 分 |
|
|
302
|
+
|
|
303
|
+
**循环引用检测**:
|
|
304
|
+
|
|
305
|
+
```typescript
|
|
306
|
+
// ❌ 风险:箭头函数捕获 this,形成循环引用
|
|
307
|
+
class MyPlugin {
|
|
308
|
+
private gatt: ble.GattClientDevice;
|
|
309
|
+
|
|
310
|
+
connect(): void {
|
|
311
|
+
// 箭头函数捕获 this,this.gatt 持有回调,回调持有 this
|
|
312
|
+
this.gatt.on('BLEConnectionStateChange', (state) => {
|
|
313
|
+
this.onConnectionStateChanged(state); // this 被捕获
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
// ✅ 正确实现:使用普通函数或弱引用
|
|
319
|
+
class MyPlugin {
|
|
320
|
+
private gatt: ble.GattClientDevice;
|
|
321
|
+
private connectionCallback: Function;
|
|
322
|
+
|
|
323
|
+
constructor() {
|
|
324
|
+
// 在构造函数中预创建回调
|
|
325
|
+
this.connectionCallback = (state: ble.ProfileConnectionState) => {
|
|
326
|
+
this.onConnectionStateChanged(state);
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
connect(): void {
|
|
331
|
+
this.gatt.on('BLEConnectionStateChange', this.connectionCallback);
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
disconnect(): void {
|
|
335
|
+
this.gatt.off('BLEConnectionStateChange', this.connectionCallback);
|
|
336
|
+
this.connectionCallback = null; // 清除引用
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
#### 3.2 Map/Set 数据清理(严苛项,15分)
|
|
342
|
+
|
|
343
|
+
持久化的 Map/Set 数据必须提供清理机制。
|
|
344
|
+
|
|
345
|
+
| 检查项 | 问题描述 | 扣分规则 |
|
|
346
|
+
|--------|----------|----------|
|
|
347
|
+
| Map.clear() | 是否在适当时机调用 clear() | 未清理扣 12 分 |
|
|
348
|
+
| Map.delete() | 单项数据是否正确删除 | 删除不完整扣 8 分 |
|
|
349
|
+
| 静态 Map 风险 | 静态 Map 是否无限累积 | **累积风险扣 15 分** |
|
|
350
|
+
| 缓存上限 | 是否设置缓存大小上限 | 无上限扣 10 分 |
|
|
351
|
+
|
|
352
|
+
**Map 清理检查**:
|
|
353
|
+
|
|
354
|
+
```typescript
|
|
355
|
+
// ❌ 问题:Map 数据未在适当时机清理
|
|
356
|
+
private mScanFilters: Map<string, Object> = new Map();
|
|
357
|
+
|
|
358
|
+
async startScan(filters: Object): void {
|
|
359
|
+
this.mScanFilters.set('current', filters);
|
|
360
|
+
ble.startBLEScan(filters);
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
async stopScan(): void {
|
|
364
|
+
ble.stopBLEScan();
|
|
365
|
+
// ⚠️ mScanFilters 未清理!
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
// ✅ 正确实现
|
|
369
|
+
async stopScan(): void {
|
|
370
|
+
ble.stopBLEScan();
|
|
371
|
+
this.mScanFilters.clear(); // 清理扫描过滤器
|
|
372
|
+
}
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
#### 3.3 静态变量与全局状态(严苛项,10分)
|
|
376
|
+
|
|
377
|
+
静态变量和全局状态可能导致内存无法释放。
|
|
378
|
+
|
|
379
|
+
| 检查项 | 问题描述 | 扣分规则 |
|
|
380
|
+
|--------|----------|----------|
|
|
381
|
+
| static 可变集合 | 静态 List/Map 是否无限增长 | 增长风险扣 10 分 |
|
|
382
|
+
| 全局缓存清理 | 是否提供全局缓存清理方法 | 无清理扣 8 分 |
|
|
383
|
+
| 单例资源释放 | 单例模式是否正确释放资源 | 未释放扣 10 分 |
|
|
384
|
+
|
|
385
|
+
---
|
|
386
|
+
|
|
387
|
+
### Phase 4:C++ Native 内存检查
|
|
388
|
+
|
|
389
|
+
#### 4.1 NAPI 引用管理(致命项,25分)
|
|
390
|
+
|
|
391
|
+
NAPI 引用是鸿蒙 Native 层最核心的资源,错误管理会导致内存泄漏或崩溃。
|
|
392
|
+
|
|
393
|
+
| 检查项 | 问题描述 | 扣分规则 |
|
|
394
|
+
|--------|----------|----------|
|
|
395
|
+
| `napi_ref` 创建 | 是否为需要长期持有的对象创建 `napi_ref` | 缺失扣 5 分 |
|
|
396
|
+
| `napi_ref` 释放 | 是否在 dispose/destroy 时调用 `napi_delete_reference` | **未释放扣 25 分(致命)** |
|
|
397
|
+
| 引用计数平衡 | `napi_create_reference` 和 `napi_delete_reference` 数量是否匹配 | 不平衡扣 18 分 |
|
|
398
|
+
| Handle Scope 清理 | 是否正确关闭 `napi_handle_scope` | **未关闭扣 20 分(致命)** |
|
|
399
|
+
|
|
400
|
+
**C++ NAPI 管理示例**:
|
|
401
|
+
|
|
402
|
+
```cpp
|
|
403
|
+
// ❌ 致命:NAPI 引用未释放
|
|
404
|
+
class NativePlugin {
|
|
405
|
+
private:
|
|
406
|
+
napi_ref callbackRef;
|
|
407
|
+
|
|
408
|
+
public:
|
|
409
|
+
void registerCallback(napi_env env, napi_value callback) {
|
|
410
|
+
napi_create_reference(env, callback, 1, &this->callbackRef);
|
|
411
|
+
// 缺少释放逻辑!
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
// 没有 destroy 方法释放 napi_ref
|
|
415
|
+
};
|
|
416
|
+
|
|
417
|
+
// ✅ 正确实现
|
|
418
|
+
class NativePlugin {
|
|
419
|
+
private:
|
|
420
|
+
napi_ref callbackRef = nullptr;
|
|
421
|
+
|
|
422
|
+
public:
|
|
423
|
+
void registerCallback(napi_env env, napi_value callback) {
|
|
424
|
+
if (this->callbackRef) {
|
|
425
|
+
napi_delete_reference(env, this->callbackRef);
|
|
426
|
+
}
|
|
427
|
+
napi_create_reference(env, callback, 1, &this->callbackRef);
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
void destroy(napi_env env) {
|
|
431
|
+
if (this->callbackRef) {
|
|
432
|
+
napi_delete_reference(env, this->callbackRef); // 必须释放
|
|
433
|
+
this->callbackRef = nullptr;
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
};
|
|
437
|
+
```
|
|
438
|
+
|
|
439
|
+
#### 4.2 Native 内存分配释放(致命项,20分)
|
|
440
|
+
|
|
441
|
+
C++ 内存分配必须有对应释放。
|
|
442
|
+
|
|
443
|
+
| 检查项 | 问题描述 | 扣分规则 |
|
|
444
|
+
|--------|----------|----------|
|
|
445
|
+
| malloc/free 匹配 | 每个 `malloc` 是否有对应 `free` | **不匹配扣 20 分(致命)** |
|
|
446
|
+
| new/delete 匹配 | 每个 `new` 是否有对应 `delete` | **不匹配扣 20 分(致命)** |
|
|
447
|
+
| 异常路径释放 | 异常发生时是否释放已分配内存 | 未释放扣 15 分 |
|
|
448
|
+
| RAII 模式 | 是否优先使用智能指针 | 未使用扣 10 分 |
|
|
449
|
+
|
|
450
|
+
**RAII 推荐模式**:
|
|
451
|
+
|
|
452
|
+
```cpp
|
|
453
|
+
// ✅ 使用智能指针自动管理
|
|
454
|
+
#include <memory>
|
|
455
|
+
|
|
456
|
+
void processData() {
|
|
457
|
+
std::unique_ptr<Buffer> buffer = std::make_unique<Buffer>(1024);
|
|
458
|
+
// 自动释放,无需手动 delete
|
|
459
|
+
|
|
460
|
+
// 或使用 std::shared_ptr 处理共享所有权
|
|
461
|
+
std::shared_ptr<Resource> resource = std::make_shared<Resource>();
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
// ✅ RAII wrapper 模式
|
|
465
|
+
class BufferGuard {
|
|
466
|
+
private:
|
|
467
|
+
void* buf;
|
|
468
|
+
public:
|
|
469
|
+
BufferGuard(size_t size) : buf(malloc(size)) {}
|
|
470
|
+
~BufferGuard() {
|
|
471
|
+
if (buf) free(buf); // 自动释放
|
|
472
|
+
}
|
|
473
|
+
};
|
|
474
|
+
```
|
|
475
|
+
|
|
476
|
+
---
|
|
477
|
+
|
|
478
|
+
### Phase 5:严苛评分计算
|
|
479
|
+
|
|
480
|
+
采用**严苛扣分制**,从 100 分开始扣减:
|
|
481
|
+
|
|
482
|
+
```
|
|
483
|
+
初始分数:100 分
|
|
484
|
+
|
|
485
|
+
扣分类型:
|
|
486
|
+
├── 致命问题:-20 分(最多扣 60 分,超过直接评 0 分)
|
|
487
|
+
│ ├── GattClientDevice 未释放
|
|
488
|
+
│ ├── NAPI 引用未释放
|
|
489
|
+
│ ├── Handle Scope 未关闭
|
|
490
|
+
│ ├── malloc/free 不匹配
|
|
491
|
+
│ ├── new/delete 不匹配
|
|
492
|
+
│ ├── 事件订阅无对应取消
|
|
493
|
+
│ └── onDetachedFromEngine 未释放资源
|
|
494
|
+
├── 严重问题:-15 分
|
|
495
|
+
│ ├── 闭包循环引用风险
|
|
496
|
+
│ ├── Map 数据未清理
|
|
497
|
+
│ ├── 静态集合累积风险
|
|
498
|
+
│ ├── Ability 生命周期未绑定
|
|
499
|
+
├── 中等问题:-10 分
|
|
500
|
+
│ ├── 订阅状态未追踪
|
|
501
|
+
│ ├── 回调参数匹配错误
|
|
502
|
+
│ ├── 缓存无上限
|
|
503
|
+
│ ├── 单例资源释放不完整
|
|
504
|
+
├── 轻微问题:-5 分
|
|
505
|
+
│ ├── 释放顺序不当
|
|
506
|
+
│ ├── 初始化不完整
|
|
507
|
+
|
|
508
|
+
特殊规则(直接 0 分):
|
|
509
|
+
├── 未发现鸿蒙代码特征 → 0 分
|
|
510
|
+
├── 致命问题 ≥ 3 个 → 0 分
|
|
511
|
+
├── 致命问题 ≥ 2 个 + 严重问题 ≥ 3 个 → 0 分
|
|
512
|
+
├── 累计扣分超过 60 分 → 0 分
|
|
513
|
+
|
|
514
|
+
最低分数:0 分
|
|
515
|
+
```
|
|
516
|
+
|
|
517
|
+
---
|
|
518
|
+
|
|
519
|
+
## 输出文件(必须遵守)
|
|
520
|
+
|
|
521
|
+
检视完成后**必须**生成以下文件:
|
|
522
|
+
|
|
523
|
+
| 文件 | 说明 |
|
|
524
|
+
|------|------|
|
|
525
|
+
| `{outputDir}/内存泄露检视报告.md` | 详细检视报告,含严苛评分(**独立文件,禁止只写入 result 执行结果文件**) |
|
|
526
|
+
|
|
527
|
+
> ⚠️ **输出文件自检**:写入结果文件前,先确认 `{outputDir}/内存泄露检视报告.md` 已存在且内容完整。若报告内容仅在草稿中,必须先将其保存为上述独立文件。
|
|
528
|
+
|
|
529
|
+
---
|
|
530
|
+
|
|
531
|
+
## 输出格式规范
|
|
532
|
+
|
|
533
|
+
报告必须严格遵循以下格式,确保 `_parseFlutterLibraryScore` 函数能正确解析:
|
|
534
|
+
|
|
535
|
+
```markdown
|
|
536
|
+
# ${repoName} 内存泄露检视报告
|
|
537
|
+
|
|
538
|
+
## 📊 内存泄露检视评分
|
|
539
|
+
|
|
540
|
+
**综合评分:78/100**
|
|
541
|
+
|
|
542
|
+
> 评分说明:采用严苛扣分制,从 100 分开始扣减,最低 0 分
|
|
543
|
+
|
|
544
|
+
| 维度 | 满分 | 得分 | 扣分详情 |
|
|
545
|
+
|------|------|------|----------|
|
|
546
|
+
| Plugin 生命周期绑定 | 20 | 15 | onDetachedFromEngine 资源清理不完整 -5 |
|
|
547
|
+
| Ability 生命周期绑定 | 15 | 10 | onDetachedFromAbility 缺失 -5 |
|
|
548
|
+
| 鸿蒙 API 事件订阅 | 25 | 5 | BLECharacteristicChange 监听器未取消 -20 |
|
|
549
|
+
| 特殊系统资源释放 | 20 | 0 | GattClientDevice 未释放 -20 |
|
|
550
|
+
| 闭包循环引用 | 20 | 15 | 箭头函数捕获 this -5 |
|
|
551
|
+
| Map/Set 数据清理 | 15 | 10 | mScanFilters 未清理 -5 |
|
|
552
|
+
| 静态变量与全局状态 | 10 | 8 | 无全局缓存清理方法 -2 |
|
|
553
|
+
| NAPI 引用管理 | 25 | 25 | 无 NAPI 实现 |
|
|
554
|
+
| Native 内存分配释放 | 20 | 20 | 无 C++ 实现 |
|
|
555
|
+
| **总计** | **100** | **78** | 累计扣分 22 分 |
|
|
556
|
+
|
|
557
|
+
**扣分明细**:
|
|
558
|
+
- BLECharacteristicChange 监听器未取消(致命):-20 分
|
|
559
|
+
- GattClientDevice 未释放(致命):-20 分
|
|
560
|
+
- onDetachedFromEngine 资源清理不完整(中等):-5 分
|
|
561
|
+
- ...
|
|
562
|
+
|
|
563
|
+
---
|
|
564
|
+
|
|
565
|
+
## 🔍 详细检视结果
|
|
566
|
+
|
|
567
|
+
### 1. Plugin 生命周期资源管理检查
|
|
568
|
+
|
|
569
|
+
#### 1.1 FlutterPlugin 生命周期绑定
|
|
570
|
+
|
|
571
|
+
| 检查项 | 规范要求 | 实际情况 | 状态 |
|
|
572
|
+
|--------|----------|----------|------|
|
|
573
|
+
| onAttachedToEngine | 初始化所有资源 | MethodChannel 初始化完整 | ✅ 通过 |
|
|
574
|
+
| onDetachedFromEngine | 释放所有资源 | 仅取消 handler,Map 未清理 | ❌ 失败 |
|
|
575
|
+
| setMethodCallHandler(null) | 取消 MethodChannel handler | 已取消 | ✅ 通过 |
|
|
576
|
+
|
|
577
|
+
**问题详情**:
|
|
578
|
+
|
|
579
|
+
| 问题类型 | 文件位置 | 行号 | 严重度 | 说明 |
|
|
580
|
+
|----------|----------|------|--------|------|
|
|
581
|
+
| **资源未清理** | FlutterBluePlusOhosPlugin.ets | 87-97 | **致命** | onDetachedFromEngine 未清理 mConnectedDevices、mMtu 等 Map 数据 |
|
|
582
|
+
|
|
583
|
+
**代码示例 - 问题代码**:
|
|
584
|
+
...
|
|
585
|
+
|
|
586
|
+
### 2. 事件监听器管理检查
|
|
587
|
+
...
|
|
588
|
+
|
|
589
|
+
### 3. ArkTS 内存管理检查
|
|
590
|
+
...
|
|
591
|
+
|
|
592
|
+
### 4. C++ Native 内存检查
|
|
593
|
+
...
|
|
594
|
+
|
|
595
|
+
---
|
|
596
|
+
|
|
597
|
+
## 📋 改进建议
|
|
598
|
+
|
|
599
|
+
### 高优先级(致命问题)
|
|
600
|
+
|
|
601
|
+
1. **释放 GattClientDevice**
|
|
602
|
+
- 问题:scanCallback 中创建的 GattClientDevice 未调用 close()
|
|
603
|
+
- 建议:使用 try-finally 确保 GattClientDevice.close() 被调用
|
|
604
|
+
|
|
605
|
+
2. **取消 BLECharacteristicChange 监听**
|
|
606
|
+
- 问题:每次 setNotifyValue 都注册新监听器,断开时未取消
|
|
607
|
+
- 建议:使用 Map 保存回调引用,在 disconnect 时取消
|
|
608
|
+
|
|
609
|
+
### 中优先级
|
|
610
|
+
|
|
611
|
+
...
|
|
612
|
+
|
|
613
|
+
### 低优先级
|
|
614
|
+
|
|
615
|
+
...
|
|
616
|
+
```
|
|
617
|
+
|
|
618
|
+
---
|
|
619
|
+
|
|
620
|
+
## 检视清单
|
|
621
|
+
|
|
622
|
+
详细检查项参见 [references/CHECKLIST.md](references/CHECKLIST.md)
|
|
623
|
+
|
|
624
|
+
---
|
|
625
|
+
|
|
626
|
+
## 输出要求
|
|
627
|
+
|
|
628
|
+
1. 报告必须以 `## 📊 内存泄露检视评分` 开头,包含评分表格
|
|
629
|
+
2. 评分格式必须是:`**综合评分:XX/100**`
|
|
630
|
+
3. 评分必须是 0-100 的整数
|
|
631
|
+
4. 仅检视 ohos/ 目录下的 ETS/C++ 代码,不检视 Flutter Dart 层
|
|
632
|
+
5. 详细列出每项扣分(文件位置、行号、扣分值)
|
|
633
|
+
6. 给出具体改进建议,按优先级排序
|
|
634
|
+
7. 使用中文撰写内容
|
|
635
|
+
|
|
636
|
+
### 结构化指标输出(必须执行)
|
|
637
|
+
|
|
638
|
+
执行环境会在任务 prompt 中下发一个**结构化指标文件输出路径**(`stepId{X}_loop{L}_meta_{N}.json`)。
|
|
639
|
+
检视完成后,**必须**将最终评分以下述 JSON 对象写入该路径:
|
|
640
|
+
|
|
641
|
+
```json
|
|
642
|
+
{
|
|
643
|
+
"memoryLeakScore": 85,
|
|
644
|
+
"scoreReason": "致命问题1处-20,资源未释放2处-16等(一句话判定依据,≤50字;触发一票否决时必须注明)"
|
|
645
|
+
}
|
|
646
|
+
```
|
|
647
|
+
|
|
648
|
+
| 字段 | 类型 | 说明 |
|
|
649
|
+
|------|------|------|
|
|
650
|
+
| `memoryLeakScore` | number | 内存泄露检视评分(0-100 整数,与报告中 `**综合评分:XX/100**` 的数值一致) |
|
|
651
|
+
| `scoreReason` | string | 评分判定依据摘要(可选,前端悬浮提示展示;0 分时强烈建议写明触发规则) |
|
|
652
|
+
|
|
653
653
|
**说明**:该文件由执行框架自动收割入库(前端/历史列表直接读取评分,无需解析报告文本)。若 prompt 未下发该路径则跳过本节。
|