@ohos-cpf/3rdloop 0.0.1 → 0.0.3
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 +245 -425
- package/bin/3rdloop.mjs +46 -46
- package/lib/cli.js +781 -740
- package/lib/config-cmd.js +452 -0
- package/lib/config.js +318 -317
- 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 +280 -0
- package/lib/workflow.js +308 -290
- 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 -243
- package/vendor/Server/CLI/deveco-code/index.js +71 -0
- package/vendor/Server/CLI/deveco-code.js +5 -0
- package/vendor/Server/CLI/opencode/index.js +817 -804
- 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 -202
- package/vendor/Server/Routes/sse/SseHub.js +308 -308
- package/vendor/Server/Skills/acceptance-check/SKILL.md +191 -174
- 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 -0
- package/vendor/Server/Skills/arkts-code-check/SKILL.md +320 -313
- package/vendor/Server/Skills/arkts-code-check/references/CODE_CHECK_GUIDE.md +210 -159
- 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 -222
- 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 +193 -0
- package/vendor/Server/Agent/SkillSelector/types.js +0 -63
package/vendor/Server/Skills/rn-library-consistency-check/references/CPP_TURBOMODULE_CHECK_GUIDE.md
CHANGED
|
@@ -1,684 +1,684 @@
|
|
|
1
|
-
# C++ TurboModule 层一致性检视指南
|
|
2
|
-
|
|
3
|
-
本指南定义 RN 鸿蒙化一致性检视中 **C++ TurboModule 层**(TurboModuleFactoryDelegate、TurboModule JSIBinder)的检视规范,确保 AI Agent 能系统性地读取和分析 C++ TurboModule 代码,检测 TurboModule 注册缺失、方法绑定不完整等问题。
|
|
4
|
-
|
|
5
|
-
> 📖 **ArkTS TurboModule 层检视**(方法实现、Stub 检测、常量导出、回调逻辑等)已独立为 [ARKTS_TURBOMODULE_CHECK_GUIDE.md](ARKTS_TURBOMODULE_CHECK_GUIDE.md),本指南仅覆盖 C++ 层。
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## 1. 适用条件与前置依赖
|
|
10
|
-
|
|
11
|
-
### 1.1 适用条件
|
|
12
|
-
|
|
13
|
-
当 `harmony/<module>/src/main/cpp/` 目录存在 TurboModule 相关文件时,必须执行本指南的检视流程。判定条件:
|
|
14
|
-
|
|
15
|
-
| 条件 | 判定 |
|
|
16
|
-
|------|------|
|
|
17
|
-
| `generated/RNOH/generated/turbo_modules/` 目录存在 | ✅ Codegen TurboModule(必须检视) |
|
|
18
|
-
| `cpp/` 下存在 `*TurboModule*FactoryDelegate*` 文件 | ✅ Legacy TurboModule(必须检视) |
|
|
19
|
-
| 以上均不存在 | ⚠️ 无 TurboModule C++ 层,跳过本指南 |
|
|
20
|
-
|
|
21
|
-
> 📖 **ArkTS TurboModule 实现检视**:当 `harmony/<module>/src/main/ets/*TurboModule.ets` 存在时,需额外执行 [ARKTS_TURBOMODULE_CHECK_GUIDE.md](ARKTS_TURBOMODULE_CHECK_GUIDE.md)。
|
|
22
|
-
|
|
23
|
-
### 1.2 前置依赖
|
|
24
|
-
|
|
25
|
-
- Phase 0 中已定位的 TurboModule 名(从 Package 或 JS Spec 提取)
|
|
26
|
-
- JS 层 TurboModule Spec 定义(`NativeRNCWebViewModule.ts` 等文件)
|
|
27
|
-
|
|
28
|
-
---
|
|
29
|
-
|
|
30
|
-
## 2. 文件定位与读取
|
|
31
|
-
|
|
32
|
-
### 2.1 TurboModuleFactoryDelegate 定位
|
|
33
|
-
|
|
34
|
-
| 模式 | 文件位置 | 说明 |
|
|
35
|
-
|------|----------|------|
|
|
36
|
-
| Codegen | `generated/RNOH/generated/BaseReactNative*Package.h` 中的 `TurboModuleFactoryDelegate` 类 | 自动生成,包含所有 TurboModule 名 |
|
|
37
|
-
| Legacy | `cpp/*TurboModuleFactoryDelegate.h` 或 `*Package.h/cpp` 中手写的 TurboModule 工厂 | 手动实现,需逐条件读取 |
|
|
38
|
-
|
|
39
|
-
**必须读取的内容**:
|
|
40
|
-
|
|
41
|
-
```
|
|
42
|
-
1. createTurboModule(ctx, name) 方法
|
|
43
|
-
→ 提取所有 if (name == "TurboModule名") 条件
|
|
44
|
-
→ 每个条件对应一个注册的 TurboModule
|
|
45
|
-
|
|
46
|
-
2. 每个 TurboModule 的构造方式
|
|
47
|
-
→ std::make_shared<XxxTurboModule>(ctx, name)
|
|
48
|
-
→ 对应 ArkTS TurboModule 实现类
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
**TurboModule 注册提取模板**:
|
|
52
|
-
|
|
53
|
-
```markdown
|
|
54
|
-
| # | TurboModule 名 | C++ FactoryDelegate 注册 | C++ 文件:行号 | JS Spec 注册名 | 状态 |
|
|
55
|
-
|---|--------------|------------------------|-------------|--------------|------|
|
|
56
|
-
| 1 | `RNCWebViewModule` | ✅ if (name == "RNCWebViewModule") | `BaseReactNativeWebviewPackage.h:22` | `RNCWebViewModule` ✅ | ✅ 一致 |
|
|
57
|
-
| 2 | `AIRMapManager` | ✅ if (name == "AIRMapManager") | `MapsPackage.h:18` | `AIRMapManager` ✅ | ✅ 一致 |
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
> 📖 **ArkTS TurboModule 类名与 NAME 常量对比**详见 [ARKTS_TURBOMODULE_CHECK_GUIDE.md](ARKTS_TURBOMODULE_CHECK_GUIDE.md) 第 2.2 维度 A。
|
|
61
|
-
|
|
62
|
-
### 2.2 TurboModule JSIBinder 定位与读取
|
|
63
|
-
|
|
64
|
-
| 模式 | 文件位置 |
|
|
65
|
-
|------|----------|
|
|
66
|
-
| Codegen | `generated/RNOH/generated/turbo_modules/TurboModuleNameJSIBinder.h`(若存在) |
|
|
67
|
-
| Legacy | `cpp/TurboModuleNameJSIBinder.h` |
|
|
68
|
-
|
|
69
|
-
**必须读取的内容**:
|
|
70
|
-
|
|
71
|
-
```
|
|
72
|
-
1. createJSIBinder() 方法
|
|
73
|
-
→ 提取所有方法名的 JSI HostFunction 注册
|
|
74
|
-
→ 每个方法对应一个 JS→C++ 的方法桥接
|
|
75
|
-
|
|
76
|
-
2. 方法签名
|
|
77
|
-
→ 提取每个 HostFunction 的参数数量和类型
|
|
78
|
-
→ 与 JS Spec 的方法签名对比
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
> **注意**:部分 Codegen TurboModule 仅在 `turbo_modules/TurboModuleName.h` 中定义类声明,实际方法绑定在 `TurboModuleName.cpp` 中实现。需同时读取 `.h` 和 `.cpp` 文件。
|
|
82
|
-
|
|
83
|
-
### 2.3 ArkTS TurboModule generated 类型与实现
|
|
84
|
-
|
|
85
|
-
> 📖 **ArkTS TurboModule 实现的完整检视流程**(generated Spec 类型读取、ArkTS 实现类读取、方法实现完整性、Stub 检测、常量导出、回调逻辑)已独立为 [ARKTS_TURBOMODULE_CHECK_GUIDE.md](ARKTS_TURBOMODULE_CHECK_GUIDE.md) 第 2 节。
|
|
86
|
-
|
|
87
|
-
本指南仅提取 C++→ArkTS 映射所需的关键信息:
|
|
88
|
-
|
|
89
|
-
**C++ FactoryDelegate → ArkTS TurboModule 类映射**:
|
|
90
|
-
|
|
91
|
-
```
|
|
92
|
-
1. 从 C++ FactoryDelegate 的 createTurboModule() 方法中提取每个 TurboModule 的构造类名
|
|
93
|
-
→ std::make_shared<XxxTurboModule>(ctx, name) 中的 XxxTurboModule 类名
|
|
94
|
-
→ 此类名对应 ArkTS TurboModule 实现类(需在 ArkTS 层确认)
|
|
95
|
-
|
|
96
|
-
2. TurboModule 注册名→ArkTS NAME 常量映射
|
|
97
|
-
→ C++ if (name == "RNCWebViewModule") 对应 ArkTS TM.RNCWebViewModule.NAME
|
|
98
|
-
→ 需在 ArkTS 层确认 NAME 常量值是否与 C++ 注册名一致
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
---
|
|
102
|
-
|
|
103
|
-
## 3. 检视项与扣分规则
|
|
104
|
-
|
|
105
|
-
> 本指南覆盖 `cppTM` 类型实体,检视项按三个关键检查点组织:**函数签名、返回值、实现逻辑**。每个检查点覆盖三个检视维度:**①契约一致性**、**②平台实现差异**、**③架构桥接一致性**。
|
|
106
|
-
|
|
107
|
-
### 3.1 检查点:函数签名(方法名、参数、注册名一致性)
|
|
108
|
-
|
|
109
|
-
#### 检查项概要
|
|
110
|
-
|
|
111
|
-
| 维度 | # | 检查项 | 致命度 |
|
|
112
|
-
|------|---|--------|--------|
|
|
113
|
-
| ①契约一致性 | 1 | TurboModule 名一致性 | 中等 |
|
|
114
|
-
| ①契约一致性 | 2 | 方法名一致性 | 严重 |
|
|
115
|
-
| ①契约一致性 | 3 | 方法存在性 | 致命 |
|
|
116
|
-
| ①契约一致性 | 4 | 参数数量 | 致命 |
|
|
117
|
-
| ①契约一致性 | 5 | 参数类型 | 致命 |
|
|
118
|
-
| ①契约一致性 | 6 | 参数顺序 | 中等 |
|
|
119
|
-
| ②平台实现差异 | 7 | 方法签名 vs Android | — |
|
|
120
|
-
| ②平台实现差异 | 8 | 方法签名 vs iOS | — |
|
|
121
|
-
| ③架构桥接一致性 | 9 | TurboModule 注册完整性 | 致命 |
|
|
122
|
-
|
|
123
|
-
#### ①契约一致性
|
|
124
|
-
|
|
125
|
-
##### 检查项 1:TurboModule 名一致性
|
|
126
|
-
|
|
127
|
-
- **检查项**:TurboModule 名一致性
|
|
128
|
-
- **特征检索方式**:
|
|
129
|
-
- C++ FactoryDelegate:grep `if (name == "XXX")` 或 `if (name ==` 于 `*Package.h`、`*TurboModuleFactoryDelegate.h/cpp`
|
|
130
|
-
- JS Spec:grep `TurboModuleRegistry.getEnforcing` 于 `*.ts` Spec 文件
|
|
131
|
-
- ArkTS:grep `NAME` 常量于 `*TurboModule.ets`(参考 [ARKTS_TURBOMODULE_CHECK_GUIDE.md](ARKTS_TURBOMODULE_CHECK_GUIDE.md))
|
|
132
|
-
- **检视步骤**:
|
|
133
|
-
1. 读取 C++ FactoryDelegate.h/cpp 文件,定位 `createTurboModule(ctx, name)` 方法,提取所有 `if (name == "TurboModule名")` 条件 → 得到 C++ 注册名列表
|
|
134
|
-
2. 读取 JS Spec 文件,提取所有 `TurboModuleRegistry.getEnforcing<Spec>('模块名')` 调用 → 得到 JS 注册名列表
|
|
135
|
-
3. 读取 ArkTS TurboModule.ets,提取 `NAME` 常量值(如 `static readonly NAME = 'RNCWebViewModule'`) → 得到 ArkTS NAME 列表
|
|
136
|
-
4. 以 JS Spec 注册名为基准,逐一对比 C++ 注册名和 ArkTS NAME 常量
|
|
137
|
-
5. **判定规则**:三层注册名必须完全一致(大小写敏感);C++ 缺失注册名 → 致命问题归入检查项 9;JS Spec 缺失 → 标记为 JS 层遗漏;ArkTS NAME 不一致 → 归入 ArkTS 检视
|
|
138
|
-
- **扣分规则**:不一致扣 5 分/个
|
|
139
|
-
- **输出格式**:
|
|
140
|
-
|
|
141
|
-
```markdown
|
|
142
|
-
| # | TurboModule 名 | C++ FactoryDelegate 注册名 | JS Spec 注册名 | ArkTS NAME 常量 | C++ 文件:行号 | JS Spec 文件:行号 | 状态 | 扣分 |
|
|
143
|
-
|---|--------------|------------------------|--------------|--------------|-------------|-------------|------|------|
|
|
144
|
-
| 1 | {TM名} | {if(name=="XXX")提取值} | {getEnforcing提取值} | {NAME常量值} | {文件:行号} | {文件:行号} | ✅一致 / ❌不一致 | {扣分} |
|
|
145
|
-
```
|
|
146
|
-
|
|
147
|
-
##### 检查项 2:方法名一致性
|
|
148
|
-
|
|
149
|
-
- **检查项**:方法名一致性(C++ JSIBinder HostFunction 方法名 vs JS Spec 方法名)
|
|
150
|
-
- **特征检索方式**:
|
|
151
|
-
- C++ JSIBinder:grep `HostFunction` 或 `obj.setProperty(rt,` 于 `*JSIBinder.h/cpp`
|
|
152
|
-
- JS Spec:读取 Spec 接口定义,提取所有方法名
|
|
153
|
-
- **检视步骤**:
|
|
154
|
-
1. 读取 TurboModule JSIBinder.h/cpp 文件,定位 `createJSIBinder()` 方法,提取所有 `obj.setProperty(rt, "methodName", ...)` 注册 → 得到 C++ 方法名列表
|
|
155
|
-
2. 读取 JS Spec 文件,提取 Spec 接口中所有方法定义 → 得到 JS Spec 方法名列表
|
|
156
|
-
3. 以 JS Spec 方法名列表为基准,逐一检查 C++ JSIBinder 中是否存在同名 HostFunction 注册
|
|
157
|
-
4. **判定规则**:JS Spec 有但 C++ JSIBinder 无 → 方法缺失(归入检查项 3);C++ JSIBinder 有但 JS Spec 无 → C++ 多余绑定(标记为冗余);方法名拼写不一致 → 方法名不匹配
|
|
158
|
-
- **扣分规则**:C++ JSIBinder 方法名不匹配扣 8 分/个
|
|
159
|
-
- **输出格式**:
|
|
160
|
-
|
|
161
|
-
```markdown
|
|
162
|
-
| # | 方法名 | JS Spec 方法名 | C++ JSIBinder 方法名 | C++ 文件:行号 | 状态 | 扣分 |
|
|
163
|
-
|---|--------|-------------|-------------------|-------------|------|------|
|
|
164
|
-
| 1 | {方法名} | {Spec中的方法名} | {JSIBinder中的方法名} | {文件:行号} | ✅一致 / ❌不匹配 | {扣分} |
|
|
165
|
-
```
|
|
166
|
-
|
|
167
|
-
##### 检查项 3:方法存在性(方法 JSI 绑定完整性)
|
|
168
|
-
|
|
169
|
-
- **检查项**:JS Spec 方法是否在 C++ JSIBinder 中有 HostFunction 注册
|
|
170
|
-
- **特征检索方式**:同检查项 2;在文档中搜索不支持标注
|
|
171
|
-
- **检视步骤**:
|
|
172
|
-
1. 读取 JS Spec 文件,提取所有方法名 → 得到 JS Spec 完整方法列表
|
|
173
|
-
2. 读取 C++ JSIBinder.h/cpp,提取所有 `obj.setProperty(rt, "methodName", ...)` → 得到 C++ 已绑定方法列表
|
|
174
|
-
3. 逐一对比:对每个 JS Spec 方法,检查 C++ JSIBinder 中是否存在对应的 HostFunction 注册
|
|
175
|
-
4. **🟢 豁免检查(优先级高于扣分)**:对每个缺失的方法,检查文档是否标注不支持(接口规格说明、OHOS README、源码注释)
|
|
176
|
-
5. **判定规则**:
|
|
177
|
-
- 🟢 **文档已标注不支持** → 豁免,0分,标注"🟢 文档标注不支持(来源:文件:行号)"
|
|
178
|
-
- ❌ **文档未标注不支持** → 方法绑定缺失(致命),扣 10 分/个
|
|
179
|
-
- **扣分规则**:C++ JSIBinder 方法缺失扣 10 分/个;文档标注不支持→豁免0分(不计入致命问题计数)
|
|
180
|
-
- **输出格式**:
|
|
181
|
-
|
|
182
|
-
```markdown
|
|
183
|
-
| # | 方法名 | JS Spec 定义 | C++ JSIBinder 绑定 | 文档标注不支持 | 文档来源 | 绑定状态 | 扣分 |
|
|
184
|
-
|---|--------|-------------|------------------|--------------|---------|---------|------|
|
|
185
|
-
| 1 | {方法名} | ✅ {Spec文件:行号} | ✅ {JSIBinder文件:行号} | — | — | ✅已绑定 | 0 |
|
|
186
|
-
| 2 | `clearFormData` | ✅ | ❌ 无绑定 | ✅ Android only | README.md:380 | 🟢 豁免不扣分 | 0 |
|
|
187
|
-
| 3 | {方法名} | ✅ | ❌ 无绑定 | ❌ 无标注 | — | ❌缺失 | -10 |
|
|
188
|
-
```
|
|
189
|
-
|
|
190
|
-
##### 检查项 4:参数数量
|
|
191
|
-
|
|
192
|
-
- **检查项**:JS Spec 参数数量 vs C++ JSIBinder 参数数量
|
|
193
|
-
- **特征检索方式**:
|
|
194
|
-
- C++ JSIBinder:在 HostFunction lambda 中计数 `args[n]` 或 `argv[n]` 访问
|
|
195
|
-
- JS Spec:从 Spec 接口方法签名中计数参数
|
|
196
|
-
- **检视步骤**:
|
|
197
|
-
1. 读取 JS Spec,对每个方法提取参数列表 → 记录参数数量
|
|
198
|
-
2. 读取 C++ JSIBinder.h/cpp,对每个 HostFunction lambda 提取参数访问模式(如 `args[0]`、`args[1]`、`argv[0]`)→ 记录 C++ 实际使用的参数数量
|
|
199
|
-
3. 逐一对比每个方法的参数数量
|
|
200
|
-
4. **判定规则**:C++ 参数数量与 JS Spec 不匹配 → 致命;C++ 多于 JS Spec → 标记为冗余参数;C++ 少于 JS Spec → 标记为参数缺失
|
|
201
|
-
- **扣分规则**:不匹配扣 8 分/个(致命度)
|
|
202
|
-
- **输出格式**:
|
|
203
|
-
|
|
204
|
-
```markdown
|
|
205
|
-
| # | 方法名 | JS Spec 参数数量 | JS Spec 参数列表 | C++ 参数数量 | C++ 参数访问 | C++ 文件:行号 | 状态 | 扣分 |
|
|
206
|
-
|---|--------|-------------|-------------|-----------|-----------|-------------|------|------|
|
|
207
|
-
| 1 | {方法名} | {数量} | {参数名列表} | {数量} | {args[n]列表} | {文件:行号} | ✅一致 / ❌不匹配 | {扣分} |
|
|
208
|
-
```
|
|
209
|
-
|
|
210
|
-
##### 检查项 5:参数类型
|
|
211
|
-
|
|
212
|
-
- **检查项**:C++ JSIBinder 方法参数 napi 类型转换 vs JS Spec 参数类型
|
|
213
|
-
- **特征检索方式**:
|
|
214
|
-
- C++ JSIBinder:grep `napi_get_string_utf8`、`napi_get_double`、`napi_get_boolean`、`napi_get_value_int32`、`napi_get_object` 等类型转换函数于 `*JSIBinder.h/cpp`
|
|
215
|
-
- JS Spec:从 Spec 接口提取参数类型声明(如 `string`、`boolean`、`number`、`Object`、`Function`)
|
|
216
|
-
- **检视步骤**:
|
|
217
|
-
1. 读取 JS Spec,对每个方法的每个参数提取类型声明 → 得到 JS Spec 参数类型列表
|
|
218
|
-
2. 读取 C++ JSIBinder.h/cpp,对每个 HostFunction lambda 提取参数 napi 类型转换模式 → 建立映射表:
|
|
219
|
-
|
|
220
|
-
```
|
|
221
|
-
JS Spec 类型 → 预期 napi 转换函数:
|
|
222
|
-
string → napi_get_string_utf8 / napi_get_value_string_utf8
|
|
223
|
-
boolean → napi_get_boolean / napi_get_value_bool
|
|
224
|
-
number → napi_get_double / napi_get_value_double / napi_get_value_int32
|
|
225
|
-
Object → napi_get_object / napi_get_value_object
|
|
226
|
-
Function → napi_get_function / napi_get_value_function
|
|
227
|
-
Array → napi_get_array / napi_get_value_array
|
|
228
|
-
```
|
|
229
|
-
|
|
230
|
-
3. 逐一对比每个参数的类型映射是否正确
|
|
231
|
-
4. **判定规则**:napi 类型转换函数与 JS Spec 参数类型不对应 → 类型致命错误
|
|
232
|
-
- **扣分规则**:类型转换致命错误扣 10 分/个
|
|
233
|
-
- **输出格式**:
|
|
234
|
-
|
|
235
|
-
```markdown
|
|
236
|
-
| # | 方法名 | 参数名 | JS Spec 类型 | 预期 napi 转换 | C++ 实际 napi 转换 | C++ 文件:行号 | 状态 | 扣分 |
|
|
237
|
-
|---|--------|------|-------------|-------------|-----------------|-------------|------|------|
|
|
238
|
-
| 1 | {方法名} | {参数名} | {JS Spec类型} | {预期转换函数} | {实际转换函数} | {文件:行号} | ✅一致 / ❌类型错误 | {扣分} |
|
|
239
|
-
```
|
|
240
|
-
|
|
241
|
-
##### 检查项 6:参数顺序
|
|
242
|
-
|
|
243
|
-
- **检查项**:JS Spec 参数位置 vs C++ JSIBinder 参数位置
|
|
244
|
-
- **特征检索方式**:同检查项 4 和 5,关注参数索引顺序
|
|
245
|
-
- **检视步骤**:
|
|
246
|
-
1. 读取 JS Spec,对每个方法按定义顺序提取参数列表 → 得到 JS Spec 参数顺序
|
|
247
|
-
2. 读取 C++ JSIBinder.h/cpp,对每个 HostFunction lambda 按 `args[n]` / `argv[n]` 索引顺序提取参数访问 → 得到 C++ 参数访问顺序
|
|
248
|
-
3. 逐一对比每个方法中参数的位置顺序:JS Spec 第 1 个参数应对应 C++ `args[0]`,第 2 个对应 `args[1]`,以此类推
|
|
249
|
-
4. **判定规则**:C++ 参数访问顺序与 JS Spec 参数定义顺序不一致 → 顺序错误
|
|
250
|
-
- **扣分规则**:顺序错误扣 6 分/个
|
|
251
|
-
- **输出格式**:
|
|
252
|
-
|
|
253
|
-
```markdown
|
|
254
|
-
| # | 方法名 | JS Spec 参数顺序 | C++ args 索引顺序 | 顺序差异 | C++ 文件:行号 | 状态 | 扣分 |
|
|
255
|
-
|---|--------|-------------|---------------|---------|-------------|------|------|
|
|
256
|
-
| 1 | {方法名} | {参数1, 参数2, ...} | {args[0]=参数?, args[1]=参数?, ...} | {无 / 描述差异} | {文件:行号} | ✅一致 / ❌顺序错误 | {扣分} |
|
|
257
|
-
```
|
|
258
|
-
|
|
259
|
-
#### ②平台实现差异
|
|
260
|
-
|
|
261
|
-
##### 检查项 7:方法签名 vs Android
|
|
262
|
-
|
|
263
|
-
- **检查项**:C++ JSIBinder 方法签名 vs Android @ReactMethod 方法签名
|
|
264
|
-
- **特征检索方式**:
|
|
265
|
-
- C++ JSIBinder:grep HostFunction 注册于 `*JSIBinder.h/cpp`
|
|
266
|
-
- Android:grep `@ReactMethod` 于 Java/Kotlin 文件
|
|
267
|
-
- **检视步骤**:
|
|
268
|
-
1. 从 C++ JSIBinder 提取方法签名列表(方法名 + 参数数量/类型 + 返回值类型)
|
|
269
|
-
2. 从 Android Java/Kotlin 文件读取所有 `@ReactMethod` 注解方法及其签名
|
|
270
|
-
3. 对每个方法,对比 C++ 签名与 Android 签名的差异(参数数量、参数类型)
|
|
271
|
-
4. **判定规则**:C++ 与 Android 签名差异不独立扣分,与 JS Spec 一致性检查合并计算——如果 C++ 与 JS Spec 一致但与 Android 不一致,说明 Android 实现存在偏差;如果 C++ 与 JS Spec 也不一致,则以 JS Spec 检查项扣分为主
|
|
272
|
-
- **扣分规则**:签名差异(参数数量/类型)与 JS Spec 一致性检查合并计算,不独立扣分
|
|
273
|
-
- **输出格式**:
|
|
274
|
-
|
|
275
|
-
```markdown
|
|
276
|
-
| # | 方法名 | JS Spec 签名 | C++ JSIBinder 签名 | Android @ReactMethod 签名 | C++ vs JS Spec 状态 | C++ vs Android 状态 | 备注 |
|
|
277
|
-
|---|--------|-------------|-------------------|--------------------------|-------------------|-------------------|------|
|
|
278
|
-
| 1 | {方法名} | {签名} | {签名} | {签名} | {一致/不一致} | {一致/不一致} | {合并扣分归属} |
|
|
279
|
-
```
|
|
280
|
-
|
|
281
|
-
##### 检查项 8:方法签名 vs iOS
|
|
282
|
-
|
|
283
|
-
- **检查项**:C++ JSIBinder 方法签名 vs iOS RCT_EXPORT_METHOD 方法签名
|
|
284
|
-
- **特征检索方式**:
|
|
285
|
-
- C++ JSIBinder:grep HostFunction 注册于 `*JSIBinder.h/cpp`
|
|
286
|
-
- iOS:grep `RCT_EXPORT_METHOD` 于 ObjC 文件或 Swift 方法导出声明
|
|
287
|
-
- **检视步骤**:
|
|
288
|
-
1. 从 C++ JSIBinder 提取方法签名列表
|
|
289
|
-
2. 从 iOS Swift/ObjC 文件读取所有 `RCT_EXPORT_METHOD` 定义及其签名
|
|
290
|
-
3. 对每个方法,对比 C++ 签名与 iOS 签名的差异
|
|
291
|
-
4. **判定规则**:同检查项 7,差异与 JS Spec 一致性检查合并计算
|
|
292
|
-
- **扣分规则**:签名差异与 JS Spec 一致性检查合并计算,不独立扣分
|
|
293
|
-
- **输出格式**:
|
|
294
|
-
|
|
295
|
-
```markdown
|
|
296
|
-
| # | 方法名 | JS Spec 签名 | C++ JSIBinder 签名 | iOS RCT_EXPORT_METHOD 签名 | C++ vs JS Spec 状态 | C++ vs iOS 状态 | 备注 |
|
|
297
|
-
|---|--------|-------------|-------------------|--------------------------|-------------------|---------------|------|
|
|
298
|
-
| 1 | {方法名} | {签名} | {签名} | {签名} | {一致/不一致} | {一致/不一致} | {合并扣分归属} |
|
|
299
|
-
```
|
|
300
|
-
|
|
301
|
-
#### ③架构桥接一致性
|
|
302
|
-
|
|
303
|
-
##### 检查项 9:TurboModule 注册完整性
|
|
304
|
-
|
|
305
|
-
- **检查项**:C++ FactoryDelegate 注册名 vs JS 层所有 TurboModuleRegistry 注册名
|
|
306
|
-
- **特征检索方式**:
|
|
307
|
-
- C++ FactoryDelegate:grep `if (name ==` 于 `*Package.h`、`*TurboModuleFactoryDelegate.h/cpp`
|
|
308
|
-
- JS 层:grep `TurboModuleRegistry.getEnforcing` 或 `TurboModuleRegistry.get` 于所有 `*.ts` 文件
|
|
309
|
-
- **检视步骤**:
|
|
310
|
-
1. 读取 C++ FactoryDelegate.h/cpp,从 `createTurboModule()` 方法中提取所有 `if (name == "TurboModule名")` 条件 → 得到 C++ 已注册 TurboModule 名列表
|
|
311
|
-
2. 在 JS 层所有 `.ts` 文件中搜索 `TurboModuleRegistry.getEnforcing<Spec>('模块名')` 和 `TurboModuleRegistry.get('模块名')` → 得到 JS 层所有 TurboModule 注册名列表
|
|
312
|
-
3. 以 JS 层注册名列表为基准,逐一检查 C++ FactoryDelegate 中是否有对应的注册条件
|
|
313
|
-
4. **判定规则**:JS 层注册了 TurboModule 但 C++ FactoryDelegate 无对应 `if (name == "XXX")` 条件 → C++ 缺失 TurboModule 注册(致命)
|
|
314
|
-
- **扣分规则**:C++ 缺失 TurboModule 注册扣 10 分/个
|
|
315
|
-
- **输出格式**:
|
|
316
|
-
|
|
317
|
-
```markdown
|
|
318
|
-
| # | TurboModule 名 | JS 层 TurboModuleRegistry 注册 | C++ FactoryDelegate 注册 | C++ 文件:行号 | 状态 | 扣分 |
|
|
319
|
-
|---|--------------|--------------------------|------------------------|-------------|------|------|
|
|
320
|
-
| 1 | {TM名} | ✅ {JS文件:行号} | ✅ {C++文件:行号} / ❌ 无注册 | {文件:行号} | ✅已注册 / ❌缺失注册 | {扣分} |
|
|
321
|
-
```
|
|
322
|
-
|
|
323
|
-
---
|
|
324
|
-
|
|
325
|
-
### 3.2 检查点:返回值(返回值类型与语义一致性)
|
|
326
|
-
|
|
327
|
-
#### 检查项概要
|
|
328
|
-
|
|
329
|
-
| 维度 | # | 检查项 | 致命度 |
|
|
330
|
-
|------|---|--------|--------|
|
|
331
|
-
| ①契约一致性 | 1 | 返回值类型 | 致命 |
|
|
332
|
-
| ①契约一致性 | 2 | 返回值语义 | 严重 |
|
|
333
|
-
| ①契约一致性 | 3 | Promise 处理 | 中等 |
|
|
334
|
-
| ①契约一致性 | 4 | C++ getConstants() | 中等 |
|
|
335
|
-
| ②平台实现差异 | 5 | 返回值 vs Android | — |
|
|
336
|
-
| ②平台实现差异 | 6 | 返回值 vs iOS | — |
|
|
337
|
-
| ③架构桥接一致性 | — | 已在①中覆盖 | — |
|
|
338
|
-
|
|
339
|
-
#### ①契约一致性
|
|
340
|
-
|
|
341
|
-
##### 检查项 1:返回值类型
|
|
342
|
-
|
|
343
|
-
- **检查项**:C++ TurboModule 方法返回值 vs JS Spec 期望返回值
|
|
344
|
-
- **特征检索方式**:
|
|
345
|
-
- C++ JSIBinder:grep `napi_create_string_utf8`、`napi_create_double`、`napi_create_boolean`、`napi_create_object`、`napi_create_array`、`napi_create_promise`、`napi_create_null`、`napi_create_int32` 等返回值构造函数于 `*JSIBinder.h/cpp`
|
|
346
|
-
- JS Spec:从 Spec 接口提取方法返回值类型声明
|
|
347
|
-
- **检视步骤**:
|
|
348
|
-
1. 读取 JS Spec,对每个方法提取返回值类型 → 得到 JS Spec 期望返回值类型列表
|
|
349
|
-
2. 读取 C++ JSIBinder.h/cpp,对每个 HostFunction lambda 提取返回值构造模式 → 建立映射表:
|
|
350
|
-
|
|
351
|
-
```
|
|
352
|
-
JS Spec 返回类型 → 预期 napi 构造函数:
|
|
353
|
-
string → napi_create_string_utf8
|
|
354
|
-
boolean → napi_create_boolean
|
|
355
|
-
number → napi_create_double / napi_create_int32
|
|
356
|
-
Object → napi_create_object
|
|
357
|
-
Array → napi_create_array
|
|
358
|
-
Promise<T> → napi_create_promise
|
|
359
|
-
void → napi_create_null / napi_get_null
|
|
360
|
-
null → napi_create_null / napi_get_null
|
|
361
|
-
```
|
|
362
|
-
|
|
363
|
-
3. 逐一对比每个方法的返回值类型映射
|
|
364
|
-
4. **判定规则**:C++ 返回值构造函数与 JS Spec 期望返回值类型不对应 → 返回值类型致命错误
|
|
365
|
-
- **扣分规则**:返回值类型错误扣 10 分/个
|
|
366
|
-
- **输出格式**:
|
|
367
|
-
|
|
368
|
-
```markdown
|
|
369
|
-
| # | 方法名 | JS Spec 返回类型 | 预期 napi 构造 | C++ 实际 napi 构造 | C++ 文件:行号 | 状态 | 扣分 |
|
|
370
|
-
|---|--------|-------------|-------------|-----------------|-------------|------|------|
|
|
371
|
-
| 1 | {方法名} | {JS Spec返回类型} | {预期构造函数} | {实际构造函数} | {文件:行号} | ✅一致 / ❌类型错误 | {扣分} |
|
|
372
|
-
```
|
|
373
|
-
|
|
374
|
-
##### 检查项 2:返回值语义
|
|
375
|
-
|
|
376
|
-
- **检查项**:C++ TurboModule 返回内容是否符合接口语义
|
|
377
|
-
- **特征检索方式**:
|
|
378
|
-
- C++ JSIBinder + TurboModule 实现:读取 HostFunction lambda 返回值构造的具体内容
|
|
379
|
-
- JS Spec:读取方法语义描述和返回值文档
|
|
380
|
-
- **检视步骤**:
|
|
381
|
-
1. 读取 C++ TurboModule 实现代码(JSIBinder 中的 HostFunction lambda 或 TurboModule.cpp 方法实现),验证返回值的具体内容是否正确
|
|
382
|
-
2. 读取 JS Spec,提取每个方法的语义描述(如方法名 `isFileUploadSupported` 应返回布尔值表示是否支持文件上传)
|
|
383
|
-
3. 对比 C++ 返回值内容与 JS Spec 语义描述是否一致
|
|
384
|
-
4. **判定规则**:返回值语义与 JS Spec 描述不一致 → 语义错误;例如方法名暗示返回布尔值但 C++ 固定返回 `napi_create_null`
|
|
385
|
-
- **扣分规则**:语义错误扣 8 分/个
|
|
386
|
-
- **输出格式**:
|
|
387
|
-
|
|
388
|
-
```markdown
|
|
389
|
-
| # | 方法名 | JS Spec 返回语义 | C++ 返回值内容 | C++ 文件:行号 | 语义一致性 | 扣分 |
|
|
390
|
-
|---|--------|-------------|-----------|-------------|---------|------|
|
|
391
|
-
| 1 | {方法名} | {语义描述} | {实际返回内容} | {文件:行号} | ✅一致 / ❌语义错误 | {扣分} |
|
|
392
|
-
```
|
|
393
|
-
|
|
394
|
-
##### 检查项 3:Promise 处理
|
|
395
|
-
|
|
396
|
-
- **检查项**:异步方法是否正确返回 Promise
|
|
397
|
-
- **特征检索方式**:
|
|
398
|
-
- C++ JSIBinder:grep `napi_create_promise`、`napi_resolve_deferred`、`napi_reject_deferred` 于 `*JSIBinder.h/cpp`
|
|
399
|
-
- JS Spec:从 Spec 接口提取返回 `Promise<T>` 的方法
|
|
400
|
-
- **检视步骤**:
|
|
401
|
-
1. 读取 JS Spec,识别所有返回值为 `Promise<T>` 的异步方法
|
|
402
|
-
2. 读取 C++ JSIBinder.h/cpp,对每个异步方法检查是否使用了 `napi_create_promise` 创建 Promise
|
|
403
|
-
3. 检查 Promise 的 resolve/reject 模式:是否有 `napi_resolve_deferred` 和 `napi_reject_deferred` 的正确调用
|
|
404
|
-
4. **判定规则**:JS Spec 标记为异步方法但 C++ 未使用 Promise 模式 → Promise 处理不正确;C++ 使用了 Promise 但未正确 resolve/reject → Promise 不完整
|
|
405
|
-
- **扣分规则**:不正确扣 6 分/个
|
|
406
|
-
- **输出格式**:
|
|
407
|
-
|
|
408
|
-
```markdown
|
|
409
|
-
| # | 方法名 | JS Spec 返回类型 | C++ Promise 创建 | C++ resolve/reject | C++ 文件:行号 | 状态 | 扣分 |
|
|
410
|
-
|---|--------|-------------|---------------|------------------|-------------|------|------|
|
|
411
|
-
| 1 | {方法名} | Promise<T> | ✅ napi_create_promise / ❌ 未创建 | ✅ resolve+reject / ⚠️ 不完整 / ❌ 缺失 | {文件:行号} | ✅正确 / ❌不正确 | {扣分} |
|
|
412
|
-
```
|
|
413
|
-
|
|
414
|
-
##### 检查项 4:C++ getConstants()
|
|
415
|
-
|
|
416
|
-
- **检查项**:C++ TurboModule getConstants() vs JS Spec 常量定义
|
|
417
|
-
- **特征检索方式**:
|
|
418
|
-
- C++ TurboModule:grep `getConstants` 于 `*TurboModule.h/cpp`,提取常量名和值
|
|
419
|
-
- JS Spec:从 Spec 文件读取常量定义
|
|
420
|
-
- **检视步骤**:
|
|
421
|
-
1. 读取 C++ TurboModule.h/cpp 文件,定位 `getConstants()` 方法,提取所有常量名及其值 → 得到 C++ 常量列表
|
|
422
|
-
2. 读取 JS Spec 文件,提取所有常量定义(通常在 Spec 接口的常量部分) → 得到 JS Spec 常量列表
|
|
423
|
-
3. 以 JS Spec 常量列表为基准,逐一检查 C++ getConstants() 中是否包含对应常量
|
|
424
|
-
4. **判定规则**:JS Spec 定义了常量但 C++ getConstants() 缺失该常量 → C++ 缺失常量
|
|
425
|
-
- **扣分规则**:C++ 缺失常量扣 5 分/个
|
|
426
|
-
- **输出格式**:
|
|
427
|
-
|
|
428
|
-
```markdown
|
|
429
|
-
| # | 常量名 | JS Spec 常量定义 | C++ getConstants() 常量 | C++ 常量值 | C++ 文件:行号 | 状态 | 扣分 |
|
|
430
|
-
|---|--------|-------------|-------------------|---------|-------------|------|------|
|
|
431
|
-
| 1 | {常量名} | ✅ {Spec文件:行号} | ✅ 有 / ❌ 缺失 | {值} | {文件:行号} | ✅一致 / ❌缺失 | {扣分} |
|
|
432
|
-
```
|
|
433
|
-
|
|
434
|
-
#### ②平台实现差异
|
|
435
|
-
|
|
436
|
-
##### 检查项 5:返回值 vs Android
|
|
437
|
-
|
|
438
|
-
- **检查项**:C++ TurboModule 返回值 vs Android @ReactMethod 返回值
|
|
439
|
-
- **特征检索方式**:
|
|
440
|
-
- C++ JSIBinder:grep 返回值构造函数于 `*JSIBinder.h/cpp`
|
|
441
|
-
- Android:grep `@ReactMethod` 注解方法返回类型于 Java/Kotlin 文件
|
|
442
|
-
- **检视步骤**:
|
|
443
|
-
1. 从 C++ JSIBinder 提取方法返回值类型列表
|
|
444
|
-
2. 从 Android Java/Kotlin 文件读取 `@ReactMethod` 方法的返回值类型
|
|
445
|
-
3. 对每个方法,对比 C++ 返回值与 Android 返回值
|
|
446
|
-
4. **判定规则**:C++ 与 Android 返回值差异不独立扣分,与 JS Spec 一致性检查合并计算
|
|
447
|
-
- **扣分规则**:与 JS Spec 一致性检查合并计算,不独立扣分
|
|
448
|
-
- **输出格式**:
|
|
449
|
-
|
|
450
|
-
```markdown
|
|
451
|
-
| # | 方法名 | JS Spec 返回类型 | C++ 返回值类型 | Android 返回值类型 | C++ vs JS Spec 状态 | C++ vs Android 状态 | 备注 |
|
|
452
|
-
|---|--------|-------------|-------------|-----------------|-------------------|-------------------|------|
|
|
453
|
-
| 1 | {方法名} | {类型} | {类型} | {类型} | {一致/不一致} | {一致/不一致} | {合并扣分归属} |
|
|
454
|
-
```
|
|
455
|
-
|
|
456
|
-
##### 检查项 6:返回值 vs iOS
|
|
457
|
-
|
|
458
|
-
- **检查项**:C++ TurboModule 返回值 vs iOS RCT_EXPORT_METHOD 返回值
|
|
459
|
-
- **特征检索方式**:
|
|
460
|
-
- C++ JSIBinder:grep 返回值构造函数于 `*JSIBinder.h/cpp`
|
|
461
|
-
- iOS:grep `RCT_EXPORT_METHOD` 返回类型于 ObjC/Swift 文件
|
|
462
|
-
- **检视步骤**:
|
|
463
|
-
1. 从 C++ JSIBinder 提取方法返回值类型列表
|
|
464
|
-
2. 从 iOS Swift/ObjC 文件读取方法返回值类型
|
|
465
|
-
3. 对每个方法,对比 C++ 返回值与 iOS 返回值
|
|
466
|
-
4. **判定规则**:同检查项 5,差异与 JS Spec 一致性检查合并计算
|
|
467
|
-
- **扣分规则**:与 JS Spec 一致性检查合并计算,不独立扣分
|
|
468
|
-
- **输出格式**:
|
|
469
|
-
|
|
470
|
-
```markdown
|
|
471
|
-
| # | 方法名 | JS Spec 返回类型 | C++ 返回值类型 | iOS 返回值类型 | C++ vs JS Spec 状态 | C++ vs iOS 状态 | 备注 |
|
|
472
|
-
|---|--------|-------------|-------------|-------------|-------------------|---------------|------|
|
|
473
|
-
| 1 | {方法名} | {类型} | {类型} | {类型} | {一致/不一致} | {一致/不一致} | {合并扣分归属} |
|
|
474
|
-
```
|
|
475
|
-
|
|
476
|
-
#### ③架构桥接一致性
|
|
477
|
-
|
|
478
|
-
(返回值的架构桥接在①契约一致性中已覆盖)
|
|
479
|
-
|
|
480
|
-
---
|
|
481
|
-
|
|
482
|
-
### 3.3 检查点:实现逻辑(C++→ArkTS 映射、回调绑定一致性)
|
|
483
|
-
|
|
484
|
-
#### 检查项概要
|
|
485
|
-
|
|
486
|
-
| 维度 | # | 检查项 | 致命度 |
|
|
487
|
-
|------|---|--------|--------|
|
|
488
|
-
| ①契约一致性 | — | N/A(实现逻辑不属于契约维度) | — |
|
|
489
|
-
| ②平台实现差异 | 1 | C++→ArkTS 映射 | 严重 |
|
|
490
|
-
| ②平台实现差异 | 2 | C++ 回调绑定 | 严重 |
|
|
491
|
-
| ②平台实现差异 | 3 | C++ 回调参数类型 | 致命 |
|
|
492
|
-
| ③架构桥接一致性 | — | 已在②中覆盖 | — |
|
|
493
|
-
|
|
494
|
-
> 📖 **ArkTS TurboModule 方法实现完整性检视**(方法存在性、签名一致性、Stub 检测等)详见 [ARKTS_TURBOMODULE_CHECK_GUIDE.md](ARKTS_TURBOMODULE_CHECK_GUIDE.md) 第 3.2-3.3 节。
|
|
495
|
-
|
|
496
|
-
#### ①契约一致性
|
|
497
|
-
|
|
498
|
-
(实现逻辑不属于契约维度)
|
|
499
|
-
|
|
500
|
-
#### ②平台实现差异
|
|
501
|
-
|
|
502
|
-
##### 检查项 1:C++→ArkTS 映射
|
|
503
|
-
|
|
504
|
-
- **检查项**:C++ FactoryDelegate `std::make_shared<XxxTurboModule>` 类名 vs ArkTS 实际 TurboModule 类名
|
|
505
|
-
- **特征检索方式**:
|
|
506
|
-
- C++ FactoryDelegate:grep `std::make_shared<` 于 `*Package.h`、`*TurboModuleFactoryDelegate.h/cpp`
|
|
507
|
-
- ArkTS TurboModule:读取 `*TurboModule.ets` 文件中的类声明
|
|
508
|
-
- **检视步骤**:
|
|
509
|
-
1. 读取 C++ FactoryDelegate.h/cpp,从 `createTurboModule()` 方法中提取所有 `std::make_shared<XxxTurboModule>(ctx, name)` 构造调用 → 得到 C++ 构造类名列表
|
|
510
|
-
2. 读取 ArkTS TurboModule.ets 文件,提取 TurboModule 实现类名(如 `class RNCWebViewModule extends TurboModule`)→ 得到 ArkTS TurboModule 类名列表
|
|
511
|
-
3. 逐一对比每个 TurboModule 的 C++ 构造类名与 ArkTS 实际类名
|
|
512
|
-
4. **判定规则**:C++ `std::make_shared<XxxTurboModule>` 中的类名必须与 ArkTS TurboModule.ets 中的类名一致;不匹配 → 类名映射错误
|
|
513
|
-
- **扣分规则**:不匹配扣 8 分/个
|
|
514
|
-
- **输出格式**:
|
|
515
|
-
|
|
516
|
-
```markdown
|
|
517
|
-
| # | TurboModule 名 | C++ 构造类名 | C++ 文件:行号 | ArkTS TurboModule 类名 | ArkTS 文件:行号 | 状态 | 扣分 |
|
|
518
|
-
|---|--------------|------------|-------------|---------------------|-------------|------|------|
|
|
519
|
-
| 1 | {TM名} | {std::make_shared<类名>} | {文件:行号} | {ArkTS class名} | {文件:行号} | ✅一致 / ❌不匹配 | {扣分} |
|
|
520
|
-
```
|
|
521
|
-
|
|
522
|
-
##### 检查项 2:C++ 回调绑定
|
|
523
|
-
|
|
524
|
-
- **检查项**:JS Spec 回调方法是否在 C++ JSIBinder 中有 HostFunction 注册
|
|
525
|
-
- **特征检索方式**:
|
|
526
|
-
- JS Spec:识别接受 Function 类型参数的方法(回调方法)
|
|
527
|
-
- C++ JSIBinder:grep `napi_get_function` 或 Function 参数处理于 `*JSIBinder.h/cpp`
|
|
528
|
-
- **检视步骤**:
|
|
529
|
-
1. 读取 JS Spec,识别所有回调类型方法(方法参数类型包含 `Function` 或 `(callback: (...args) => void)` 的方法) → 得到 JS Spec 回调方法列表
|
|
530
|
-
2. 读取 C++ JSIBinder.h/cpp,检查这些回调方法是否有对应的 HostFunction 注册
|
|
531
|
-
3. 对每个回调方法,检查 C++ JSIBinder 中是否正确处理了 Function 参数(是否有 `napi_get_function` 提取回调函数并绑定)
|
|
532
|
-
4. **判定规则**:JS Spec 定义了回调方法但 C++ JSIBinder 无对应 HostFunction 注册 → 回调绑定缺失
|
|
533
|
-
- **扣分规则**:C++ 缺失回调绑定扣 8 分/个
|
|
534
|
-
- **输出格式**:
|
|
535
|
-
|
|
536
|
-
```markdown
|
|
537
|
-
| # | 回调方法名 | JS Spec 回调参数 | C++ JSIBinder HostFunction | C++ 回调处理 | C++ 文件:行号 | 状态 | 扣分 |
|
|
538
|
-
|---|----------|-------------|--------------------------|-----------|-------------|------|------|
|
|
539
|
-
| 1 | {方法名} | {callback参数签名} | ✅ 有注册 / ❌ 无注册 | ✅ napi_get_function / ❌ 缺失 | {文件:行号} | ✅已绑定 / ❌缺失 | {扣分} |
|
|
540
|
-
```
|
|
541
|
-
|
|
542
|
-
##### 检查项 3:C++ 回调参数类型
|
|
543
|
-
|
|
544
|
-
- **检查项**:C++ JSIBinder 回调参数类型映射
|
|
545
|
-
- **特征检索方式**:
|
|
546
|
-
- C++ JSIBinder:在回调 HostFunction lambda 中提取回调参数的 napi 类型转换模式
|
|
547
|
-
- JS Spec:从回调方法的 Function 参数类型签名提取回调参数类型
|
|
548
|
-
- **检视步骤**:
|
|
549
|
-
1. 读取 JS Spec,对每个回调方法提取 Function 参数的回调参数类型签名(如 `(success: boolean, error: string) => void`)→ 得到 JS Spec 回调参数类型列表
|
|
550
|
-
2. 读取 C++ JSIBinder.h/cpp,对每个回调 HostFunction 提取回调参数的 napi 类型转换模式(回调调用时的参数构造,如 `napi_create_boolean`、`napi_create_string_utf8`)→ 得到 C++ 回调参数类型映射列表
|
|
551
|
-
3. 逐一对比回调参数的类型映射
|
|
552
|
-
4. **判定规则**:C++ 回调参数 napi 类型与 JS Spec 回调参数类型不对应 → 回调参数类型致命错误
|
|
553
|
-
- **扣分规则**:类型错误扣 10 分/个
|
|
554
|
-
- **输出格式**:
|
|
555
|
-
|
|
556
|
-
```markdown
|
|
557
|
-
| # | 回调方法名 | 回调参数名 | JS Spec 回调参数类型 | 预期 napi 构造 | C++ 实际 napi 构造 | C++ 文件:行号 | 状态 | 扣分 |
|
|
558
|
-
|---|----------|---------|-------------|-------------|-----------------|-------------|------|------|
|
|
559
|
-
| 1 | {方法名} | {参数名} | {类型} | {预期构造函数} | {实际构造函数} | {文件:行号} | ✅一致 / ❌类型错误 | {扣分} |
|
|
560
|
-
```
|
|
561
|
-
|
|
562
|
-
#### ③架构桥接一致性
|
|
563
|
-
|
|
564
|
-
(已在②平台实现差异中覆盖)
|
|
565
|
-
|
|
566
|
-
> 📖 **ArkTS TurboModule 常量导出检视**详见 [ARKTS_TURBOMODULE_CHECK_GUIDE.md](ARKTS_TURBOMODULE_CHECK_GUIDE.md) 第 3.4 节。
|
|
567
|
-
> 📖 **ArkTS TurboModule 回调/事件检视**详见 [ARKTS_TURBOMODULE_CHECK_GUIDE.md](ARKTS_TURBOMODULE_CHECK_GUIDE.md) 第 3.5 节。
|
|
568
|
-
|
|
569
|
-
---
|
|
570
|
-
|
|
571
|
-
## 4. 方法级对比格式
|
|
572
|
-
|
|
573
|
-
### 4.1 TurboModule 方法签名对比(C++ 层)
|
|
574
|
-
|
|
575
|
-
> 📖 **ArkTS TurboModule 方法签名对比**详见 [ARKTS_TURBOMODULE_CHECK_GUIDE.md](ARKTS_TURBOMODULE_CHECK_GUIDE.md) 第 2.2 维度 B。
|
|
576
|
-
|
|
577
|
-
```markdown
|
|
578
|
-
| # | 方法名 | JS Spec 签名 | C++ JSIBinder 签名 | C++ 文件:行号 | C++ 绑定状态 | 扣分 |
|
|
579
|
-
|---|--------|-------------|-------------------|-------------|-------------|------|
|
|
580
|
-
| 1 | `isFileUploadSupported` | `(): Promise<boolean>` | `SharedTurboModule → resolve bool` | `RNCWebViewModuleJSIBinder.h:12` | ✅ 一致 | 0 |
|
|
581
|
-
| 2 | `shouldStartLoadWithLockIdentifier` | `(shouldStart: boolean, lockIdentifier: Double): void` | `(bool, double) → void` | `RNCWebViewModuleJSIBinder.h:18` | ✅ 一致 | 0 |
|
|
582
|
-
```
|
|
583
|
-
|
|
584
|
-
### 4.2 TurboModule 跨层一致性对比(C++ 层视角)
|
|
585
|
-
|
|
586
|
-
> 📖 **ArkTS TurboModule Stub 检测**详见 [ARKTS_TURBOMODULE_CHECK_GUIDE.md](ARKTS_TURBOMODULE_CHECK_GUIDE.md) 第 2.2 维度 C。
|
|
587
|
-
|
|
588
|
-
```markdown
|
|
589
|
-
| # | TurboModule 名 | JS Spec 定义 | JS Spec 注册名 | C++ FactoryDelegate | C++ JSIBinder | C++ 文件 | 状态 | 扣分 |
|
|
590
|
-
|---|--------------|------------|--------------|--------------------|-------------|---------|------|------|
|
|
591
|
-
| 1 | `RNCWebViewModule` | `NativeRNCWebViewModule.ts` | `RNCWebViewModule` | ✅ BaseReactNativeWebviewPackageTurboModuleFactoryDelegate | ✅ RNCWebViewModuleJSIBinder | `BaseReactNativeWebviewPackage.h:22` | ✅ C++ 层一致 | 0 |
|
|
592
|
-
```
|
|
593
|
-
|
|
594
|
-
> 📖 **ArkTS TurboModule 层补充列**(ArkTS 实现类、ArkTS NAME 常量、ArkTS 方法签名)详见 [ARKTS_TURBOMODULE_CHECK_GUIDE.md](ARKTS_TURBOMODULE_CHECK_GUIDE.md) 第 5.1 节全链路对比表。
|
|
595
|
-
|
|
596
|
-
---
|
|
597
|
-
|
|
598
|
-
## 5. Stub 检测指引
|
|
599
|
-
|
|
600
|
-
> 📖 **ArkTS TurboModule Stub 检测与合理性判定**已独立为 [ARKTS_TURBOMODULE_CHECK_GUIDE.md](ARKTS_TURBOMODULE_CHECK_GUIDE.md) 第 3.3 节和第 2.2 维度 C。
|
|
601
|
-
|
|
602
|
-
本指南(C++ 层)不直接执行 Stub 检测,因为 Stub 是 ArkTS TurboModule 实现层的概念。但 C++ JSIBinder 层可能存在以下问题:
|
|
603
|
-
|
|
604
|
-
| C++ 层问题 | 识别方式 | 扣分 |
|
|
605
|
-
|----------|----------|------|
|
|
606
|
-
| C++ JSIBinder 方法缺失 | JS Spec 定义了方法但 C++ JSIBinder 无 HostFunction 注册 | -10/方法 |
|
|
607
|
-
| C++ JSIBinder 参数类型错误 | napi 类型转换与 JS Spec 不一致 | -10/方法 |
|
|
608
|
-
| C++ JSIBinder 方法名不匹配 | HostFunction 方法名与 JS Spec 方法名不一致 | -8/方法 |
|
|
609
|
-
|
|
610
|
-
---
|
|
611
|
-
|
|
612
|
-
## 6. 检视操作流程
|
|
613
|
-
|
|
614
|
-
### 6.1 Phase 0 补充步骤(TurboModule C++ 层定位)
|
|
615
|
-
|
|
616
|
-
```
|
|
617
|
-
TM-1: 定位 TurboModuleFactoryDelegate
|
|
618
|
-
→ Codegen: 读取 generated/RNOH/generated/BaseReactNative*Package.h
|
|
619
|
-
→ Legacy: 读取 *Package.h 或 *TurboModuleFactoryDelegate.h
|
|
620
|
-
|
|
621
|
-
TM-2: 提取 TurboModule 名列表
|
|
622
|
-
→ 从 createTurboModule() 方法的 if 条件中提取所有 TurboModule 名
|
|
623
|
-
→ 对比 JS 层 TurboModuleRegistry.getEnforcing<Spec>('XXX') 的模块名
|
|
624
|
-
|
|
625
|
-
TM-3: 定位 TurboModule JSIBinder(若存在)
|
|
626
|
-
→ 搜索 generated/RNOH/generated/turbo_modules/*JSIBinder.h
|
|
627
|
-
→ 搜索 cpp/*TurboModule*JSIBinder.h
|
|
628
|
-
```
|
|
629
|
-
|
|
630
|
-
> 📖 **ArkTS TurboModule 定位步骤**(TM-ARK-1~4)详见 [ARKTS_TURBOMODULE_CHECK_GUIDE.md](ARKTS_TURBOMODULE_CHECK_GUIDE.md) 第 6.1 节。
|
|
631
|
-
|
|
632
|
-
### 6.2 Phase 3 补充步骤(TurboModule C++ 层分析)
|
|
633
|
-
|
|
634
|
-
```
|
|
635
|
-
TM-5: TurboModule 注册完整性对比
|
|
636
|
-
→ C++ FactoryDelegate TurboModule 名 vs JS Spec TurboModule 名
|
|
637
|
-
→ 标注缺失的 TurboModule 注册
|
|
638
|
-
|
|
639
|
-
TM-6: TurboModule JSIBinder 方法级对比(C++ 层)
|
|
640
|
-
→ JS Spec 方法签名 vs C++ JSIBinder 方法签名
|
|
641
|
-
→ 标注 C++ JSIBinder 方法缺失、类型映射错误
|
|
642
|
-
|
|
643
|
-
TM-7: TurboModule C++→ArkTS 映射对比
|
|
644
|
-
→ C++ FactoryDelegate 构造类名 vs ArkTS TurboModule 类名
|
|
645
|
-
→ C++ 注册名 vs ArkTS NAME 常量
|
|
646
|
-
```
|
|
647
|
-
|
|
648
|
-
> 📖 **ArkTS TurboModule 分析步骤**(TM-ARK-5~11)详见 [ARKTS_TURBOMODULE_CHECK_GUIDE.md](ARKTS_TURBOMODULE_CHECK_GUIDE.md) 第 6.2 节。
|
|
649
|
-
|
|
650
|
-
---
|
|
651
|
-
|
|
652
|
-
## 7. 报告输出格式
|
|
653
|
-
|
|
654
|
-
在一致性检视报告的"5.8 RN 架构一致性检视"中增加以下子章节(C++ 层部分):
|
|
655
|
-
|
|
656
|
-
> 📖 **ArkTS TurboModule 层报告输出格式**详见 [ARKTS_TURBOMODULE_CHECK_GUIDE.md](ARKTS_TURBOMODULE_CHECK_GUIDE.md) 第 7 节。
|
|
657
|
-
|
|
658
|
-
```markdown
|
|
659
|
-
#### C++ TurboModule 层一致性(如适用)
|
|
660
|
-
|
|
661
|
-
**C++ TurboModule 模式**:{Codegen / Legacy / ⚠️ 无 C++ TurboModule 层}
|
|
662
|
-
|
|
663
|
-
| # | TurboModule 名 | JS Spec 注册名 | C++ FactoryDelegate | C++ JSIBinder | C++ 文件 | 状态 | 扣分 |
|
|
664
|
-
|---|--------------|--------------|--------------------|-------------|---------|------|------|
|
|
665
|
-
| ... | ... | ... | ... | ... | ... | ... | ... |
|
|
666
|
-
|
|
667
|
-
**TurboModule JSIBinder 方法级对比(C++ 层)**:
|
|
668
|
-
|
|
669
|
-
| # | 方法名 | JS Spec 签名 | C++ JSIBinder 签名 | C++ 文件:行号 | C++ 绑定状态 | 扣分 |
|
|
670
|
-
|---|--------|-------------|-------------------|-------------|-------------|------|
|
|
671
|
-
| ... | ... | ... | ... | ... | ... | ... |
|
|
672
|
-
```
|
|
673
|
-
|
|
674
|
-
---
|
|
675
|
-
|
|
676
|
-
## 8. 与 ARKTS_TURBOMODULE_CHECK_GUIDE 的协同
|
|
677
|
-
|
|
678
|
-
本指南仅覆盖 **C++ TurboModule 层**(FactoryDelegate + JSIBinder),ArkTS TurboModule 层(实现类 + 方法完整性 + Stub + 常量 + 回调)已独立为 [ARKTS_TURBOMODULE_CHECK_GUIDE.md](ARKTS_TURBOMODULE_CHECK_GUIDE.md)。
|
|
679
|
-
|
|
680
|
-
检视执行顺序建议:
|
|
681
|
-
|
|
682
|
-
1. **先执行本指南** → 获得 C++ FactoryDelegate 注册名、JSIBinder 方法列表
|
|
683
|
-
2. **再执行 ARKTS_TURBOMODULE_CHECK_GUIDE** → 获得 ArkTS TurboModule 类声明、方法实现、Stub 检测、常量导出、回调/事件
|
|
1
|
+
# C++ TurboModule 层一致性检视指南
|
|
2
|
+
|
|
3
|
+
本指南定义 RN 鸿蒙化一致性检视中 **C++ TurboModule 层**(TurboModuleFactoryDelegate、TurboModule JSIBinder)的检视规范,确保 AI Agent 能系统性地读取和分析 C++ TurboModule 代码,检测 TurboModule 注册缺失、方法绑定不完整等问题。
|
|
4
|
+
|
|
5
|
+
> 📖 **ArkTS TurboModule 层检视**(方法实现、Stub 检测、常量导出、回调逻辑等)已独立为 [ARKTS_TURBOMODULE_CHECK_GUIDE.md](ARKTS_TURBOMODULE_CHECK_GUIDE.md),本指南仅覆盖 C++ 层。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. 适用条件与前置依赖
|
|
10
|
+
|
|
11
|
+
### 1.1 适用条件
|
|
12
|
+
|
|
13
|
+
当 `harmony/<module>/src/main/cpp/` 目录存在 TurboModule 相关文件时,必须执行本指南的检视流程。判定条件:
|
|
14
|
+
|
|
15
|
+
| 条件 | 判定 |
|
|
16
|
+
|------|------|
|
|
17
|
+
| `generated/RNOH/generated/turbo_modules/` 目录存在 | ✅ Codegen TurboModule(必须检视) |
|
|
18
|
+
| `cpp/` 下存在 `*TurboModule*FactoryDelegate*` 文件 | ✅ Legacy TurboModule(必须检视) |
|
|
19
|
+
| 以上均不存在 | ⚠️ 无 TurboModule C++ 层,跳过本指南 |
|
|
20
|
+
|
|
21
|
+
> 📖 **ArkTS TurboModule 实现检视**:当 `harmony/<module>/src/main/ets/*TurboModule.ets` 存在时,需额外执行 [ARKTS_TURBOMODULE_CHECK_GUIDE.md](ARKTS_TURBOMODULE_CHECK_GUIDE.md)。
|
|
22
|
+
|
|
23
|
+
### 1.2 前置依赖
|
|
24
|
+
|
|
25
|
+
- Phase 0 中已定位的 TurboModule 名(从 Package 或 JS Spec 提取)
|
|
26
|
+
- JS 层 TurboModule Spec 定义(`NativeRNCWebViewModule.ts` 等文件)
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## 2. 文件定位与读取
|
|
31
|
+
|
|
32
|
+
### 2.1 TurboModuleFactoryDelegate 定位
|
|
33
|
+
|
|
34
|
+
| 模式 | 文件位置 | 说明 |
|
|
35
|
+
|------|----------|------|
|
|
36
|
+
| Codegen | `generated/RNOH/generated/BaseReactNative*Package.h` 中的 `TurboModuleFactoryDelegate` 类 | 自动生成,包含所有 TurboModule 名 |
|
|
37
|
+
| Legacy | `cpp/*TurboModuleFactoryDelegate.h` 或 `*Package.h/cpp` 中手写的 TurboModule 工厂 | 手动实现,需逐条件读取 |
|
|
38
|
+
|
|
39
|
+
**必须读取的内容**:
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
1. createTurboModule(ctx, name) 方法
|
|
43
|
+
→ 提取所有 if (name == "TurboModule名") 条件
|
|
44
|
+
→ 每个条件对应一个注册的 TurboModule
|
|
45
|
+
|
|
46
|
+
2. 每个 TurboModule 的构造方式
|
|
47
|
+
→ std::make_shared<XxxTurboModule>(ctx, name)
|
|
48
|
+
→ 对应 ArkTS TurboModule 实现类
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
**TurboModule 注册提取模板**:
|
|
52
|
+
|
|
53
|
+
```markdown
|
|
54
|
+
| # | TurboModule 名 | C++ FactoryDelegate 注册 | C++ 文件:行号 | JS Spec 注册名 | 状态 |
|
|
55
|
+
|---|--------------|------------------------|-------------|--------------|------|
|
|
56
|
+
| 1 | `RNCWebViewModule` | ✅ if (name == "RNCWebViewModule") | `BaseReactNativeWebviewPackage.h:22` | `RNCWebViewModule` ✅ | ✅ 一致 |
|
|
57
|
+
| 2 | `AIRMapManager` | ✅ if (name == "AIRMapManager") | `MapsPackage.h:18` | `AIRMapManager` ✅ | ✅ 一致 |
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
> 📖 **ArkTS TurboModule 类名与 NAME 常量对比**详见 [ARKTS_TURBOMODULE_CHECK_GUIDE.md](ARKTS_TURBOMODULE_CHECK_GUIDE.md) 第 2.2 维度 A。
|
|
61
|
+
|
|
62
|
+
### 2.2 TurboModule JSIBinder 定位与读取
|
|
63
|
+
|
|
64
|
+
| 模式 | 文件位置 |
|
|
65
|
+
|------|----------|
|
|
66
|
+
| Codegen | `generated/RNOH/generated/turbo_modules/TurboModuleNameJSIBinder.h`(若存在) |
|
|
67
|
+
| Legacy | `cpp/TurboModuleNameJSIBinder.h` |
|
|
68
|
+
|
|
69
|
+
**必须读取的内容**:
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
1. createJSIBinder() 方法
|
|
73
|
+
→ 提取所有方法名的 JSI HostFunction 注册
|
|
74
|
+
→ 每个方法对应一个 JS→C++ 的方法桥接
|
|
75
|
+
|
|
76
|
+
2. 方法签名
|
|
77
|
+
→ 提取每个 HostFunction 的参数数量和类型
|
|
78
|
+
→ 与 JS Spec 的方法签名对比
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
> **注意**:部分 Codegen TurboModule 仅在 `turbo_modules/TurboModuleName.h` 中定义类声明,实际方法绑定在 `TurboModuleName.cpp` 中实现。需同时读取 `.h` 和 `.cpp` 文件。
|
|
82
|
+
|
|
83
|
+
### 2.3 ArkTS TurboModule generated 类型与实现
|
|
84
|
+
|
|
85
|
+
> 📖 **ArkTS TurboModule 实现的完整检视流程**(generated Spec 类型读取、ArkTS 实现类读取、方法实现完整性、Stub 检测、常量导出、回调逻辑)已独立为 [ARKTS_TURBOMODULE_CHECK_GUIDE.md](ARKTS_TURBOMODULE_CHECK_GUIDE.md) 第 2 节。
|
|
86
|
+
|
|
87
|
+
本指南仅提取 C++→ArkTS 映射所需的关键信息:
|
|
88
|
+
|
|
89
|
+
**C++ FactoryDelegate → ArkTS TurboModule 类映射**:
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
1. 从 C++ FactoryDelegate 的 createTurboModule() 方法中提取每个 TurboModule 的构造类名
|
|
93
|
+
→ std::make_shared<XxxTurboModule>(ctx, name) 中的 XxxTurboModule 类名
|
|
94
|
+
→ 此类名对应 ArkTS TurboModule 实现类(需在 ArkTS 层确认)
|
|
95
|
+
|
|
96
|
+
2. TurboModule 注册名→ArkTS NAME 常量映射
|
|
97
|
+
→ C++ if (name == "RNCWebViewModule") 对应 ArkTS TM.RNCWebViewModule.NAME
|
|
98
|
+
→ 需在 ArkTS 层确认 NAME 常量值是否与 C++ 注册名一致
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## 3. 检视项与扣分规则
|
|
104
|
+
|
|
105
|
+
> 本指南覆盖 `cppTM` 类型实体,检视项按三个关键检查点组织:**函数签名、返回值、实现逻辑**。每个检查点覆盖三个检视维度:**①契约一致性**、**②平台实现差异**、**③架构桥接一致性**。
|
|
106
|
+
|
|
107
|
+
### 3.1 检查点:函数签名(方法名、参数、注册名一致性)
|
|
108
|
+
|
|
109
|
+
#### 检查项概要
|
|
110
|
+
|
|
111
|
+
| 维度 | # | 检查项 | 致命度 |
|
|
112
|
+
|------|---|--------|--------|
|
|
113
|
+
| ①契约一致性 | 1 | TurboModule 名一致性 | 中等 |
|
|
114
|
+
| ①契约一致性 | 2 | 方法名一致性 | 严重 |
|
|
115
|
+
| ①契约一致性 | 3 | 方法存在性 | 致命 |
|
|
116
|
+
| ①契约一致性 | 4 | 参数数量 | 致命 |
|
|
117
|
+
| ①契约一致性 | 5 | 参数类型 | 致命 |
|
|
118
|
+
| ①契约一致性 | 6 | 参数顺序 | 中等 |
|
|
119
|
+
| ②平台实现差异 | 7 | 方法签名 vs Android | — |
|
|
120
|
+
| ②平台实现差异 | 8 | 方法签名 vs iOS | — |
|
|
121
|
+
| ③架构桥接一致性 | 9 | TurboModule 注册完整性 | 致命 |
|
|
122
|
+
|
|
123
|
+
#### ①契约一致性
|
|
124
|
+
|
|
125
|
+
##### 检查项 1:TurboModule 名一致性
|
|
126
|
+
|
|
127
|
+
- **检查项**:TurboModule 名一致性
|
|
128
|
+
- **特征检索方式**:
|
|
129
|
+
- C++ FactoryDelegate:grep `if (name == "XXX")` 或 `if (name ==` 于 `*Package.h`、`*TurboModuleFactoryDelegate.h/cpp`
|
|
130
|
+
- JS Spec:grep `TurboModuleRegistry.getEnforcing` 于 `*.ts` Spec 文件
|
|
131
|
+
- ArkTS:grep `NAME` 常量于 `*TurboModule.ets`(参考 [ARKTS_TURBOMODULE_CHECK_GUIDE.md](ARKTS_TURBOMODULE_CHECK_GUIDE.md))
|
|
132
|
+
- **检视步骤**:
|
|
133
|
+
1. 读取 C++ FactoryDelegate.h/cpp 文件,定位 `createTurboModule(ctx, name)` 方法,提取所有 `if (name == "TurboModule名")` 条件 → 得到 C++ 注册名列表
|
|
134
|
+
2. 读取 JS Spec 文件,提取所有 `TurboModuleRegistry.getEnforcing<Spec>('模块名')` 调用 → 得到 JS 注册名列表
|
|
135
|
+
3. 读取 ArkTS TurboModule.ets,提取 `NAME` 常量值(如 `static readonly NAME = 'RNCWebViewModule'`) → 得到 ArkTS NAME 列表
|
|
136
|
+
4. 以 JS Spec 注册名为基准,逐一对比 C++ 注册名和 ArkTS NAME 常量
|
|
137
|
+
5. **判定规则**:三层注册名必须完全一致(大小写敏感);C++ 缺失注册名 → 致命问题归入检查项 9;JS Spec 缺失 → 标记为 JS 层遗漏;ArkTS NAME 不一致 → 归入 ArkTS 检视
|
|
138
|
+
- **扣分规则**:不一致扣 5 分/个
|
|
139
|
+
- **输出格式**:
|
|
140
|
+
|
|
141
|
+
```markdown
|
|
142
|
+
| # | TurboModule 名 | C++ FactoryDelegate 注册名 | JS Spec 注册名 | ArkTS NAME 常量 | C++ 文件:行号 | JS Spec 文件:行号 | 状态 | 扣分 |
|
|
143
|
+
|---|--------------|------------------------|--------------|--------------|-------------|-------------|------|------|
|
|
144
|
+
| 1 | {TM名} | {if(name=="XXX")提取值} | {getEnforcing提取值} | {NAME常量值} | {文件:行号} | {文件:行号} | ✅一致 / ❌不一致 | {扣分} |
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
##### 检查项 2:方法名一致性
|
|
148
|
+
|
|
149
|
+
- **检查项**:方法名一致性(C++ JSIBinder HostFunction 方法名 vs JS Spec 方法名)
|
|
150
|
+
- **特征检索方式**:
|
|
151
|
+
- C++ JSIBinder:grep `HostFunction` 或 `obj.setProperty(rt,` 于 `*JSIBinder.h/cpp`
|
|
152
|
+
- JS Spec:读取 Spec 接口定义,提取所有方法名
|
|
153
|
+
- **检视步骤**:
|
|
154
|
+
1. 读取 TurboModule JSIBinder.h/cpp 文件,定位 `createJSIBinder()` 方法,提取所有 `obj.setProperty(rt, "methodName", ...)` 注册 → 得到 C++ 方法名列表
|
|
155
|
+
2. 读取 JS Spec 文件,提取 Spec 接口中所有方法定义 → 得到 JS Spec 方法名列表
|
|
156
|
+
3. 以 JS Spec 方法名列表为基准,逐一检查 C++ JSIBinder 中是否存在同名 HostFunction 注册
|
|
157
|
+
4. **判定规则**:JS Spec 有但 C++ JSIBinder 无 → 方法缺失(归入检查项 3);C++ JSIBinder 有但 JS Spec 无 → C++ 多余绑定(标记为冗余);方法名拼写不一致 → 方法名不匹配
|
|
158
|
+
- **扣分规则**:C++ JSIBinder 方法名不匹配扣 8 分/个
|
|
159
|
+
- **输出格式**:
|
|
160
|
+
|
|
161
|
+
```markdown
|
|
162
|
+
| # | 方法名 | JS Spec 方法名 | C++ JSIBinder 方法名 | C++ 文件:行号 | 状态 | 扣分 |
|
|
163
|
+
|---|--------|-------------|-------------------|-------------|------|------|
|
|
164
|
+
| 1 | {方法名} | {Spec中的方法名} | {JSIBinder中的方法名} | {文件:行号} | ✅一致 / ❌不匹配 | {扣分} |
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
##### 检查项 3:方法存在性(方法 JSI 绑定完整性)
|
|
168
|
+
|
|
169
|
+
- **检查项**:JS Spec 方法是否在 C++ JSIBinder 中有 HostFunction 注册
|
|
170
|
+
- **特征检索方式**:同检查项 2;在文档中搜索不支持标注
|
|
171
|
+
- **检视步骤**:
|
|
172
|
+
1. 读取 JS Spec 文件,提取所有方法名 → 得到 JS Spec 完整方法列表
|
|
173
|
+
2. 读取 C++ JSIBinder.h/cpp,提取所有 `obj.setProperty(rt, "methodName", ...)` → 得到 C++ 已绑定方法列表
|
|
174
|
+
3. 逐一对比:对每个 JS Spec 方法,检查 C++ JSIBinder 中是否存在对应的 HostFunction 注册
|
|
175
|
+
4. **🟢 豁免检查(优先级高于扣分)**:对每个缺失的方法,检查文档是否标注不支持(接口规格说明、OHOS README、源码注释)
|
|
176
|
+
5. **判定规则**:
|
|
177
|
+
- 🟢 **文档已标注不支持** → 豁免,0分,标注"🟢 文档标注不支持(来源:文件:行号)"
|
|
178
|
+
- ❌ **文档未标注不支持** → 方法绑定缺失(致命),扣 10 分/个
|
|
179
|
+
- **扣分规则**:C++ JSIBinder 方法缺失扣 10 分/个;文档标注不支持→豁免0分(不计入致命问题计数)
|
|
180
|
+
- **输出格式**:
|
|
181
|
+
|
|
182
|
+
```markdown
|
|
183
|
+
| # | 方法名 | JS Spec 定义 | C++ JSIBinder 绑定 | 文档标注不支持 | 文档来源 | 绑定状态 | 扣分 |
|
|
184
|
+
|---|--------|-------------|------------------|--------------|---------|---------|------|
|
|
185
|
+
| 1 | {方法名} | ✅ {Spec文件:行号} | ✅ {JSIBinder文件:行号} | — | — | ✅已绑定 | 0 |
|
|
186
|
+
| 2 | `clearFormData` | ✅ | ❌ 无绑定 | ✅ Android only | README.md:380 | 🟢 豁免不扣分 | 0 |
|
|
187
|
+
| 3 | {方法名} | ✅ | ❌ 无绑定 | ❌ 无标注 | — | ❌缺失 | -10 |
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
##### 检查项 4:参数数量
|
|
191
|
+
|
|
192
|
+
- **检查项**:JS Spec 参数数量 vs C++ JSIBinder 参数数量
|
|
193
|
+
- **特征检索方式**:
|
|
194
|
+
- C++ JSIBinder:在 HostFunction lambda 中计数 `args[n]` 或 `argv[n]` 访问
|
|
195
|
+
- JS Spec:从 Spec 接口方法签名中计数参数
|
|
196
|
+
- **检视步骤**:
|
|
197
|
+
1. 读取 JS Spec,对每个方法提取参数列表 → 记录参数数量
|
|
198
|
+
2. 读取 C++ JSIBinder.h/cpp,对每个 HostFunction lambda 提取参数访问模式(如 `args[0]`、`args[1]`、`argv[0]`)→ 记录 C++ 实际使用的参数数量
|
|
199
|
+
3. 逐一对比每个方法的参数数量
|
|
200
|
+
4. **判定规则**:C++ 参数数量与 JS Spec 不匹配 → 致命;C++ 多于 JS Spec → 标记为冗余参数;C++ 少于 JS Spec → 标记为参数缺失
|
|
201
|
+
- **扣分规则**:不匹配扣 8 分/个(致命度)
|
|
202
|
+
- **输出格式**:
|
|
203
|
+
|
|
204
|
+
```markdown
|
|
205
|
+
| # | 方法名 | JS Spec 参数数量 | JS Spec 参数列表 | C++ 参数数量 | C++ 参数访问 | C++ 文件:行号 | 状态 | 扣分 |
|
|
206
|
+
|---|--------|-------------|-------------|-----------|-----------|-------------|------|------|
|
|
207
|
+
| 1 | {方法名} | {数量} | {参数名列表} | {数量} | {args[n]列表} | {文件:行号} | ✅一致 / ❌不匹配 | {扣分} |
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
##### 检查项 5:参数类型
|
|
211
|
+
|
|
212
|
+
- **检查项**:C++ JSIBinder 方法参数 napi 类型转换 vs JS Spec 参数类型
|
|
213
|
+
- **特征检索方式**:
|
|
214
|
+
- C++ JSIBinder:grep `napi_get_string_utf8`、`napi_get_double`、`napi_get_boolean`、`napi_get_value_int32`、`napi_get_object` 等类型转换函数于 `*JSIBinder.h/cpp`
|
|
215
|
+
- JS Spec:从 Spec 接口提取参数类型声明(如 `string`、`boolean`、`number`、`Object`、`Function`)
|
|
216
|
+
- **检视步骤**:
|
|
217
|
+
1. 读取 JS Spec,对每个方法的每个参数提取类型声明 → 得到 JS Spec 参数类型列表
|
|
218
|
+
2. 读取 C++ JSIBinder.h/cpp,对每个 HostFunction lambda 提取参数 napi 类型转换模式 → 建立映射表:
|
|
219
|
+
|
|
220
|
+
```
|
|
221
|
+
JS Spec 类型 → 预期 napi 转换函数:
|
|
222
|
+
string → napi_get_string_utf8 / napi_get_value_string_utf8
|
|
223
|
+
boolean → napi_get_boolean / napi_get_value_bool
|
|
224
|
+
number → napi_get_double / napi_get_value_double / napi_get_value_int32
|
|
225
|
+
Object → napi_get_object / napi_get_value_object
|
|
226
|
+
Function → napi_get_function / napi_get_value_function
|
|
227
|
+
Array → napi_get_array / napi_get_value_array
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
3. 逐一对比每个参数的类型映射是否正确
|
|
231
|
+
4. **判定规则**:napi 类型转换函数与 JS Spec 参数类型不对应 → 类型致命错误
|
|
232
|
+
- **扣分规则**:类型转换致命错误扣 10 分/个
|
|
233
|
+
- **输出格式**:
|
|
234
|
+
|
|
235
|
+
```markdown
|
|
236
|
+
| # | 方法名 | 参数名 | JS Spec 类型 | 预期 napi 转换 | C++ 实际 napi 转换 | C++ 文件:行号 | 状态 | 扣分 |
|
|
237
|
+
|---|--------|------|-------------|-------------|-----------------|-------------|------|------|
|
|
238
|
+
| 1 | {方法名} | {参数名} | {JS Spec类型} | {预期转换函数} | {实际转换函数} | {文件:行号} | ✅一致 / ❌类型错误 | {扣分} |
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
##### 检查项 6:参数顺序
|
|
242
|
+
|
|
243
|
+
- **检查项**:JS Spec 参数位置 vs C++ JSIBinder 参数位置
|
|
244
|
+
- **特征检索方式**:同检查项 4 和 5,关注参数索引顺序
|
|
245
|
+
- **检视步骤**:
|
|
246
|
+
1. 读取 JS Spec,对每个方法按定义顺序提取参数列表 → 得到 JS Spec 参数顺序
|
|
247
|
+
2. 读取 C++ JSIBinder.h/cpp,对每个 HostFunction lambda 按 `args[n]` / `argv[n]` 索引顺序提取参数访问 → 得到 C++ 参数访问顺序
|
|
248
|
+
3. 逐一对比每个方法中参数的位置顺序:JS Spec 第 1 个参数应对应 C++ `args[0]`,第 2 个对应 `args[1]`,以此类推
|
|
249
|
+
4. **判定规则**:C++ 参数访问顺序与 JS Spec 参数定义顺序不一致 → 顺序错误
|
|
250
|
+
- **扣分规则**:顺序错误扣 6 分/个
|
|
251
|
+
- **输出格式**:
|
|
252
|
+
|
|
253
|
+
```markdown
|
|
254
|
+
| # | 方法名 | JS Spec 参数顺序 | C++ args 索引顺序 | 顺序差异 | C++ 文件:行号 | 状态 | 扣分 |
|
|
255
|
+
|---|--------|-------------|---------------|---------|-------------|------|------|
|
|
256
|
+
| 1 | {方法名} | {参数1, 参数2, ...} | {args[0]=参数?, args[1]=参数?, ...} | {无 / 描述差异} | {文件:行号} | ✅一致 / ❌顺序错误 | {扣分} |
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
#### ②平台实现差异
|
|
260
|
+
|
|
261
|
+
##### 检查项 7:方法签名 vs Android
|
|
262
|
+
|
|
263
|
+
- **检查项**:C++ JSIBinder 方法签名 vs Android @ReactMethod 方法签名
|
|
264
|
+
- **特征检索方式**:
|
|
265
|
+
- C++ JSIBinder:grep HostFunction 注册于 `*JSIBinder.h/cpp`
|
|
266
|
+
- Android:grep `@ReactMethod` 于 Java/Kotlin 文件
|
|
267
|
+
- **检视步骤**:
|
|
268
|
+
1. 从 C++ JSIBinder 提取方法签名列表(方法名 + 参数数量/类型 + 返回值类型)
|
|
269
|
+
2. 从 Android Java/Kotlin 文件读取所有 `@ReactMethod` 注解方法及其签名
|
|
270
|
+
3. 对每个方法,对比 C++ 签名与 Android 签名的差异(参数数量、参数类型)
|
|
271
|
+
4. **判定规则**:C++ 与 Android 签名差异不独立扣分,与 JS Spec 一致性检查合并计算——如果 C++ 与 JS Spec 一致但与 Android 不一致,说明 Android 实现存在偏差;如果 C++ 与 JS Spec 也不一致,则以 JS Spec 检查项扣分为主
|
|
272
|
+
- **扣分规则**:签名差异(参数数量/类型)与 JS Spec 一致性检查合并计算,不独立扣分
|
|
273
|
+
- **输出格式**:
|
|
274
|
+
|
|
275
|
+
```markdown
|
|
276
|
+
| # | 方法名 | JS Spec 签名 | C++ JSIBinder 签名 | Android @ReactMethod 签名 | C++ vs JS Spec 状态 | C++ vs Android 状态 | 备注 |
|
|
277
|
+
|---|--------|-------------|-------------------|--------------------------|-------------------|-------------------|------|
|
|
278
|
+
| 1 | {方法名} | {签名} | {签名} | {签名} | {一致/不一致} | {一致/不一致} | {合并扣分归属} |
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
##### 检查项 8:方法签名 vs iOS
|
|
282
|
+
|
|
283
|
+
- **检查项**:C++ JSIBinder 方法签名 vs iOS RCT_EXPORT_METHOD 方法签名
|
|
284
|
+
- **特征检索方式**:
|
|
285
|
+
- C++ JSIBinder:grep HostFunction 注册于 `*JSIBinder.h/cpp`
|
|
286
|
+
- iOS:grep `RCT_EXPORT_METHOD` 于 ObjC 文件或 Swift 方法导出声明
|
|
287
|
+
- **检视步骤**:
|
|
288
|
+
1. 从 C++ JSIBinder 提取方法签名列表
|
|
289
|
+
2. 从 iOS Swift/ObjC 文件读取所有 `RCT_EXPORT_METHOD` 定义及其签名
|
|
290
|
+
3. 对每个方法,对比 C++ 签名与 iOS 签名的差异
|
|
291
|
+
4. **判定规则**:同检查项 7,差异与 JS Spec 一致性检查合并计算
|
|
292
|
+
- **扣分规则**:签名差异与 JS Spec 一致性检查合并计算,不独立扣分
|
|
293
|
+
- **输出格式**:
|
|
294
|
+
|
|
295
|
+
```markdown
|
|
296
|
+
| # | 方法名 | JS Spec 签名 | C++ JSIBinder 签名 | iOS RCT_EXPORT_METHOD 签名 | C++ vs JS Spec 状态 | C++ vs iOS 状态 | 备注 |
|
|
297
|
+
|---|--------|-------------|-------------------|--------------------------|-------------------|---------------|------|
|
|
298
|
+
| 1 | {方法名} | {签名} | {签名} | {签名} | {一致/不一致} | {一致/不一致} | {合并扣分归属} |
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
#### ③架构桥接一致性
|
|
302
|
+
|
|
303
|
+
##### 检查项 9:TurboModule 注册完整性
|
|
304
|
+
|
|
305
|
+
- **检查项**:C++ FactoryDelegate 注册名 vs JS 层所有 TurboModuleRegistry 注册名
|
|
306
|
+
- **特征检索方式**:
|
|
307
|
+
- C++ FactoryDelegate:grep `if (name ==` 于 `*Package.h`、`*TurboModuleFactoryDelegate.h/cpp`
|
|
308
|
+
- JS 层:grep `TurboModuleRegistry.getEnforcing` 或 `TurboModuleRegistry.get` 于所有 `*.ts` 文件
|
|
309
|
+
- **检视步骤**:
|
|
310
|
+
1. 读取 C++ FactoryDelegate.h/cpp,从 `createTurboModule()` 方法中提取所有 `if (name == "TurboModule名")` 条件 → 得到 C++ 已注册 TurboModule 名列表
|
|
311
|
+
2. 在 JS 层所有 `.ts` 文件中搜索 `TurboModuleRegistry.getEnforcing<Spec>('模块名')` 和 `TurboModuleRegistry.get('模块名')` → 得到 JS 层所有 TurboModule 注册名列表
|
|
312
|
+
3. 以 JS 层注册名列表为基准,逐一检查 C++ FactoryDelegate 中是否有对应的注册条件
|
|
313
|
+
4. **判定规则**:JS 层注册了 TurboModule 但 C++ FactoryDelegate 无对应 `if (name == "XXX")` 条件 → C++ 缺失 TurboModule 注册(致命)
|
|
314
|
+
- **扣分规则**:C++ 缺失 TurboModule 注册扣 10 分/个
|
|
315
|
+
- **输出格式**:
|
|
316
|
+
|
|
317
|
+
```markdown
|
|
318
|
+
| # | TurboModule 名 | JS 层 TurboModuleRegistry 注册 | C++ FactoryDelegate 注册 | C++ 文件:行号 | 状态 | 扣分 |
|
|
319
|
+
|---|--------------|--------------------------|------------------------|-------------|------|------|
|
|
320
|
+
| 1 | {TM名} | ✅ {JS文件:行号} | ✅ {C++文件:行号} / ❌ 无注册 | {文件:行号} | ✅已注册 / ❌缺失注册 | {扣分} |
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
---
|
|
324
|
+
|
|
325
|
+
### 3.2 检查点:返回值(返回值类型与语义一致性)
|
|
326
|
+
|
|
327
|
+
#### 检查项概要
|
|
328
|
+
|
|
329
|
+
| 维度 | # | 检查项 | 致命度 |
|
|
330
|
+
|------|---|--------|--------|
|
|
331
|
+
| ①契约一致性 | 1 | 返回值类型 | 致命 |
|
|
332
|
+
| ①契约一致性 | 2 | 返回值语义 | 严重 |
|
|
333
|
+
| ①契约一致性 | 3 | Promise 处理 | 中等 |
|
|
334
|
+
| ①契约一致性 | 4 | C++ getConstants() | 中等 |
|
|
335
|
+
| ②平台实现差异 | 5 | 返回值 vs Android | — |
|
|
336
|
+
| ②平台实现差异 | 6 | 返回值 vs iOS | — |
|
|
337
|
+
| ③架构桥接一致性 | — | 已在①中覆盖 | — |
|
|
338
|
+
|
|
339
|
+
#### ①契约一致性
|
|
340
|
+
|
|
341
|
+
##### 检查项 1:返回值类型
|
|
342
|
+
|
|
343
|
+
- **检查项**:C++ TurboModule 方法返回值 vs JS Spec 期望返回值
|
|
344
|
+
- **特征检索方式**:
|
|
345
|
+
- C++ JSIBinder:grep `napi_create_string_utf8`、`napi_create_double`、`napi_create_boolean`、`napi_create_object`、`napi_create_array`、`napi_create_promise`、`napi_create_null`、`napi_create_int32` 等返回值构造函数于 `*JSIBinder.h/cpp`
|
|
346
|
+
- JS Spec:从 Spec 接口提取方法返回值类型声明
|
|
347
|
+
- **检视步骤**:
|
|
348
|
+
1. 读取 JS Spec,对每个方法提取返回值类型 → 得到 JS Spec 期望返回值类型列表
|
|
349
|
+
2. 读取 C++ JSIBinder.h/cpp,对每个 HostFunction lambda 提取返回值构造模式 → 建立映射表:
|
|
350
|
+
|
|
351
|
+
```
|
|
352
|
+
JS Spec 返回类型 → 预期 napi 构造函数:
|
|
353
|
+
string → napi_create_string_utf8
|
|
354
|
+
boolean → napi_create_boolean
|
|
355
|
+
number → napi_create_double / napi_create_int32
|
|
356
|
+
Object → napi_create_object
|
|
357
|
+
Array → napi_create_array
|
|
358
|
+
Promise<T> → napi_create_promise
|
|
359
|
+
void → napi_create_null / napi_get_null
|
|
360
|
+
null → napi_create_null / napi_get_null
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
3. 逐一对比每个方法的返回值类型映射
|
|
364
|
+
4. **判定规则**:C++ 返回值构造函数与 JS Spec 期望返回值类型不对应 → 返回值类型致命错误
|
|
365
|
+
- **扣分规则**:返回值类型错误扣 10 分/个
|
|
366
|
+
- **输出格式**:
|
|
367
|
+
|
|
368
|
+
```markdown
|
|
369
|
+
| # | 方法名 | JS Spec 返回类型 | 预期 napi 构造 | C++ 实际 napi 构造 | C++ 文件:行号 | 状态 | 扣分 |
|
|
370
|
+
|---|--------|-------------|-------------|-----------------|-------------|------|------|
|
|
371
|
+
| 1 | {方法名} | {JS Spec返回类型} | {预期构造函数} | {实际构造函数} | {文件:行号} | ✅一致 / ❌类型错误 | {扣分} |
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
##### 检查项 2:返回值语义
|
|
375
|
+
|
|
376
|
+
- **检查项**:C++ TurboModule 返回内容是否符合接口语义
|
|
377
|
+
- **特征检索方式**:
|
|
378
|
+
- C++ JSIBinder + TurboModule 实现:读取 HostFunction lambda 返回值构造的具体内容
|
|
379
|
+
- JS Spec:读取方法语义描述和返回值文档
|
|
380
|
+
- **检视步骤**:
|
|
381
|
+
1. 读取 C++ TurboModule 实现代码(JSIBinder 中的 HostFunction lambda 或 TurboModule.cpp 方法实现),验证返回值的具体内容是否正确
|
|
382
|
+
2. 读取 JS Spec,提取每个方法的语义描述(如方法名 `isFileUploadSupported` 应返回布尔值表示是否支持文件上传)
|
|
383
|
+
3. 对比 C++ 返回值内容与 JS Spec 语义描述是否一致
|
|
384
|
+
4. **判定规则**:返回值语义与 JS Spec 描述不一致 → 语义错误;例如方法名暗示返回布尔值但 C++ 固定返回 `napi_create_null`
|
|
385
|
+
- **扣分规则**:语义错误扣 8 分/个
|
|
386
|
+
- **输出格式**:
|
|
387
|
+
|
|
388
|
+
```markdown
|
|
389
|
+
| # | 方法名 | JS Spec 返回语义 | C++ 返回值内容 | C++ 文件:行号 | 语义一致性 | 扣分 |
|
|
390
|
+
|---|--------|-------------|-----------|-------------|---------|------|
|
|
391
|
+
| 1 | {方法名} | {语义描述} | {实际返回内容} | {文件:行号} | ✅一致 / ❌语义错误 | {扣分} |
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
##### 检查项 3:Promise 处理
|
|
395
|
+
|
|
396
|
+
- **检查项**:异步方法是否正确返回 Promise
|
|
397
|
+
- **特征检索方式**:
|
|
398
|
+
- C++ JSIBinder:grep `napi_create_promise`、`napi_resolve_deferred`、`napi_reject_deferred` 于 `*JSIBinder.h/cpp`
|
|
399
|
+
- JS Spec:从 Spec 接口提取返回 `Promise<T>` 的方法
|
|
400
|
+
- **检视步骤**:
|
|
401
|
+
1. 读取 JS Spec,识别所有返回值为 `Promise<T>` 的异步方法
|
|
402
|
+
2. 读取 C++ JSIBinder.h/cpp,对每个异步方法检查是否使用了 `napi_create_promise` 创建 Promise
|
|
403
|
+
3. 检查 Promise 的 resolve/reject 模式:是否有 `napi_resolve_deferred` 和 `napi_reject_deferred` 的正确调用
|
|
404
|
+
4. **判定规则**:JS Spec 标记为异步方法但 C++ 未使用 Promise 模式 → Promise 处理不正确;C++ 使用了 Promise 但未正确 resolve/reject → Promise 不完整
|
|
405
|
+
- **扣分规则**:不正确扣 6 分/个
|
|
406
|
+
- **输出格式**:
|
|
407
|
+
|
|
408
|
+
```markdown
|
|
409
|
+
| # | 方法名 | JS Spec 返回类型 | C++ Promise 创建 | C++ resolve/reject | C++ 文件:行号 | 状态 | 扣分 |
|
|
410
|
+
|---|--------|-------------|---------------|------------------|-------------|------|------|
|
|
411
|
+
| 1 | {方法名} | Promise<T> | ✅ napi_create_promise / ❌ 未创建 | ✅ resolve+reject / ⚠️ 不完整 / ❌ 缺失 | {文件:行号} | ✅正确 / ❌不正确 | {扣分} |
|
|
412
|
+
```
|
|
413
|
+
|
|
414
|
+
##### 检查项 4:C++ getConstants()
|
|
415
|
+
|
|
416
|
+
- **检查项**:C++ TurboModule getConstants() vs JS Spec 常量定义
|
|
417
|
+
- **特征检索方式**:
|
|
418
|
+
- C++ TurboModule:grep `getConstants` 于 `*TurboModule.h/cpp`,提取常量名和值
|
|
419
|
+
- JS Spec:从 Spec 文件读取常量定义
|
|
420
|
+
- **检视步骤**:
|
|
421
|
+
1. 读取 C++ TurboModule.h/cpp 文件,定位 `getConstants()` 方法,提取所有常量名及其值 → 得到 C++ 常量列表
|
|
422
|
+
2. 读取 JS Spec 文件,提取所有常量定义(通常在 Spec 接口的常量部分) → 得到 JS Spec 常量列表
|
|
423
|
+
3. 以 JS Spec 常量列表为基准,逐一检查 C++ getConstants() 中是否包含对应常量
|
|
424
|
+
4. **判定规则**:JS Spec 定义了常量但 C++ getConstants() 缺失该常量 → C++ 缺失常量
|
|
425
|
+
- **扣分规则**:C++ 缺失常量扣 5 分/个
|
|
426
|
+
- **输出格式**:
|
|
427
|
+
|
|
428
|
+
```markdown
|
|
429
|
+
| # | 常量名 | JS Spec 常量定义 | C++ getConstants() 常量 | C++ 常量值 | C++ 文件:行号 | 状态 | 扣分 |
|
|
430
|
+
|---|--------|-------------|-------------------|---------|-------------|------|------|
|
|
431
|
+
| 1 | {常量名} | ✅ {Spec文件:行号} | ✅ 有 / ❌ 缺失 | {值} | {文件:行号} | ✅一致 / ❌缺失 | {扣分} |
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
#### ②平台实现差异
|
|
435
|
+
|
|
436
|
+
##### 检查项 5:返回值 vs Android
|
|
437
|
+
|
|
438
|
+
- **检查项**:C++ TurboModule 返回值 vs Android @ReactMethod 返回值
|
|
439
|
+
- **特征检索方式**:
|
|
440
|
+
- C++ JSIBinder:grep 返回值构造函数于 `*JSIBinder.h/cpp`
|
|
441
|
+
- Android:grep `@ReactMethod` 注解方法返回类型于 Java/Kotlin 文件
|
|
442
|
+
- **检视步骤**:
|
|
443
|
+
1. 从 C++ JSIBinder 提取方法返回值类型列表
|
|
444
|
+
2. 从 Android Java/Kotlin 文件读取 `@ReactMethod` 方法的返回值类型
|
|
445
|
+
3. 对每个方法,对比 C++ 返回值与 Android 返回值
|
|
446
|
+
4. **判定规则**:C++ 与 Android 返回值差异不独立扣分,与 JS Spec 一致性检查合并计算
|
|
447
|
+
- **扣分规则**:与 JS Spec 一致性检查合并计算,不独立扣分
|
|
448
|
+
- **输出格式**:
|
|
449
|
+
|
|
450
|
+
```markdown
|
|
451
|
+
| # | 方法名 | JS Spec 返回类型 | C++ 返回值类型 | Android 返回值类型 | C++ vs JS Spec 状态 | C++ vs Android 状态 | 备注 |
|
|
452
|
+
|---|--------|-------------|-------------|-----------------|-------------------|-------------------|------|
|
|
453
|
+
| 1 | {方法名} | {类型} | {类型} | {类型} | {一致/不一致} | {一致/不一致} | {合并扣分归属} |
|
|
454
|
+
```
|
|
455
|
+
|
|
456
|
+
##### 检查项 6:返回值 vs iOS
|
|
457
|
+
|
|
458
|
+
- **检查项**:C++ TurboModule 返回值 vs iOS RCT_EXPORT_METHOD 返回值
|
|
459
|
+
- **特征检索方式**:
|
|
460
|
+
- C++ JSIBinder:grep 返回值构造函数于 `*JSIBinder.h/cpp`
|
|
461
|
+
- iOS:grep `RCT_EXPORT_METHOD` 返回类型于 ObjC/Swift 文件
|
|
462
|
+
- **检视步骤**:
|
|
463
|
+
1. 从 C++ JSIBinder 提取方法返回值类型列表
|
|
464
|
+
2. 从 iOS Swift/ObjC 文件读取方法返回值类型
|
|
465
|
+
3. 对每个方法,对比 C++ 返回值与 iOS 返回值
|
|
466
|
+
4. **判定规则**:同检查项 5,差异与 JS Spec 一致性检查合并计算
|
|
467
|
+
- **扣分规则**:与 JS Spec 一致性检查合并计算,不独立扣分
|
|
468
|
+
- **输出格式**:
|
|
469
|
+
|
|
470
|
+
```markdown
|
|
471
|
+
| # | 方法名 | JS Spec 返回类型 | C++ 返回值类型 | iOS 返回值类型 | C++ vs JS Spec 状态 | C++ vs iOS 状态 | 备注 |
|
|
472
|
+
|---|--------|-------------|-------------|-------------|-------------------|---------------|------|
|
|
473
|
+
| 1 | {方法名} | {类型} | {类型} | {类型} | {一致/不一致} | {一致/不一致} | {合并扣分归属} |
|
|
474
|
+
```
|
|
475
|
+
|
|
476
|
+
#### ③架构桥接一致性
|
|
477
|
+
|
|
478
|
+
(返回值的架构桥接在①契约一致性中已覆盖)
|
|
479
|
+
|
|
480
|
+
---
|
|
481
|
+
|
|
482
|
+
### 3.3 检查点:实现逻辑(C++→ArkTS 映射、回调绑定一致性)
|
|
483
|
+
|
|
484
|
+
#### 检查项概要
|
|
485
|
+
|
|
486
|
+
| 维度 | # | 检查项 | 致命度 |
|
|
487
|
+
|------|---|--------|--------|
|
|
488
|
+
| ①契约一致性 | — | N/A(实现逻辑不属于契约维度) | — |
|
|
489
|
+
| ②平台实现差异 | 1 | C++→ArkTS 映射 | 严重 |
|
|
490
|
+
| ②平台实现差异 | 2 | C++ 回调绑定 | 严重 |
|
|
491
|
+
| ②平台实现差异 | 3 | C++ 回调参数类型 | 致命 |
|
|
492
|
+
| ③架构桥接一致性 | — | 已在②中覆盖 | — |
|
|
493
|
+
|
|
494
|
+
> 📖 **ArkTS TurboModule 方法实现完整性检视**(方法存在性、签名一致性、Stub 检测等)详见 [ARKTS_TURBOMODULE_CHECK_GUIDE.md](ARKTS_TURBOMODULE_CHECK_GUIDE.md) 第 3.2-3.3 节。
|
|
495
|
+
|
|
496
|
+
#### ①契约一致性
|
|
497
|
+
|
|
498
|
+
(实现逻辑不属于契约维度)
|
|
499
|
+
|
|
500
|
+
#### ②平台实现差异
|
|
501
|
+
|
|
502
|
+
##### 检查项 1:C++→ArkTS 映射
|
|
503
|
+
|
|
504
|
+
- **检查项**:C++ FactoryDelegate `std::make_shared<XxxTurboModule>` 类名 vs ArkTS 实际 TurboModule 类名
|
|
505
|
+
- **特征检索方式**:
|
|
506
|
+
- C++ FactoryDelegate:grep `std::make_shared<` 于 `*Package.h`、`*TurboModuleFactoryDelegate.h/cpp`
|
|
507
|
+
- ArkTS TurboModule:读取 `*TurboModule.ets` 文件中的类声明
|
|
508
|
+
- **检视步骤**:
|
|
509
|
+
1. 读取 C++ FactoryDelegate.h/cpp,从 `createTurboModule()` 方法中提取所有 `std::make_shared<XxxTurboModule>(ctx, name)` 构造调用 → 得到 C++ 构造类名列表
|
|
510
|
+
2. 读取 ArkTS TurboModule.ets 文件,提取 TurboModule 实现类名(如 `class RNCWebViewModule extends TurboModule`)→ 得到 ArkTS TurboModule 类名列表
|
|
511
|
+
3. 逐一对比每个 TurboModule 的 C++ 构造类名与 ArkTS 实际类名
|
|
512
|
+
4. **判定规则**:C++ `std::make_shared<XxxTurboModule>` 中的类名必须与 ArkTS TurboModule.ets 中的类名一致;不匹配 → 类名映射错误
|
|
513
|
+
- **扣分规则**:不匹配扣 8 分/个
|
|
514
|
+
- **输出格式**:
|
|
515
|
+
|
|
516
|
+
```markdown
|
|
517
|
+
| # | TurboModule 名 | C++ 构造类名 | C++ 文件:行号 | ArkTS TurboModule 类名 | ArkTS 文件:行号 | 状态 | 扣分 |
|
|
518
|
+
|---|--------------|------------|-------------|---------------------|-------------|------|------|
|
|
519
|
+
| 1 | {TM名} | {std::make_shared<类名>} | {文件:行号} | {ArkTS class名} | {文件:行号} | ✅一致 / ❌不匹配 | {扣分} |
|
|
520
|
+
```
|
|
521
|
+
|
|
522
|
+
##### 检查项 2:C++ 回调绑定
|
|
523
|
+
|
|
524
|
+
- **检查项**:JS Spec 回调方法是否在 C++ JSIBinder 中有 HostFunction 注册
|
|
525
|
+
- **特征检索方式**:
|
|
526
|
+
- JS Spec:识别接受 Function 类型参数的方法(回调方法)
|
|
527
|
+
- C++ JSIBinder:grep `napi_get_function` 或 Function 参数处理于 `*JSIBinder.h/cpp`
|
|
528
|
+
- **检视步骤**:
|
|
529
|
+
1. 读取 JS Spec,识别所有回调类型方法(方法参数类型包含 `Function` 或 `(callback: (...args) => void)` 的方法) → 得到 JS Spec 回调方法列表
|
|
530
|
+
2. 读取 C++ JSIBinder.h/cpp,检查这些回调方法是否有对应的 HostFunction 注册
|
|
531
|
+
3. 对每个回调方法,检查 C++ JSIBinder 中是否正确处理了 Function 参数(是否有 `napi_get_function` 提取回调函数并绑定)
|
|
532
|
+
4. **判定规则**:JS Spec 定义了回调方法但 C++ JSIBinder 无对应 HostFunction 注册 → 回调绑定缺失
|
|
533
|
+
- **扣分规则**:C++ 缺失回调绑定扣 8 分/个
|
|
534
|
+
- **输出格式**:
|
|
535
|
+
|
|
536
|
+
```markdown
|
|
537
|
+
| # | 回调方法名 | JS Spec 回调参数 | C++ JSIBinder HostFunction | C++ 回调处理 | C++ 文件:行号 | 状态 | 扣分 |
|
|
538
|
+
|---|----------|-------------|--------------------------|-----------|-------------|------|------|
|
|
539
|
+
| 1 | {方法名} | {callback参数签名} | ✅ 有注册 / ❌ 无注册 | ✅ napi_get_function / ❌ 缺失 | {文件:行号} | ✅已绑定 / ❌缺失 | {扣分} |
|
|
540
|
+
```
|
|
541
|
+
|
|
542
|
+
##### 检查项 3:C++ 回调参数类型
|
|
543
|
+
|
|
544
|
+
- **检查项**:C++ JSIBinder 回调参数类型映射
|
|
545
|
+
- **特征检索方式**:
|
|
546
|
+
- C++ JSIBinder:在回调 HostFunction lambda 中提取回调参数的 napi 类型转换模式
|
|
547
|
+
- JS Spec:从回调方法的 Function 参数类型签名提取回调参数类型
|
|
548
|
+
- **检视步骤**:
|
|
549
|
+
1. 读取 JS Spec,对每个回调方法提取 Function 参数的回调参数类型签名(如 `(success: boolean, error: string) => void`)→ 得到 JS Spec 回调参数类型列表
|
|
550
|
+
2. 读取 C++ JSIBinder.h/cpp,对每个回调 HostFunction 提取回调参数的 napi 类型转换模式(回调调用时的参数构造,如 `napi_create_boolean`、`napi_create_string_utf8`)→ 得到 C++ 回调参数类型映射列表
|
|
551
|
+
3. 逐一对比回调参数的类型映射
|
|
552
|
+
4. **判定规则**:C++ 回调参数 napi 类型与 JS Spec 回调参数类型不对应 → 回调参数类型致命错误
|
|
553
|
+
- **扣分规则**:类型错误扣 10 分/个
|
|
554
|
+
- **输出格式**:
|
|
555
|
+
|
|
556
|
+
```markdown
|
|
557
|
+
| # | 回调方法名 | 回调参数名 | JS Spec 回调参数类型 | 预期 napi 构造 | C++ 实际 napi 构造 | C++ 文件:行号 | 状态 | 扣分 |
|
|
558
|
+
|---|----------|---------|-------------|-------------|-----------------|-------------|------|------|
|
|
559
|
+
| 1 | {方法名} | {参数名} | {类型} | {预期构造函数} | {实际构造函数} | {文件:行号} | ✅一致 / ❌类型错误 | {扣分} |
|
|
560
|
+
```
|
|
561
|
+
|
|
562
|
+
#### ③架构桥接一致性
|
|
563
|
+
|
|
564
|
+
(已在②平台实现差异中覆盖)
|
|
565
|
+
|
|
566
|
+
> 📖 **ArkTS TurboModule 常量导出检视**详见 [ARKTS_TURBOMODULE_CHECK_GUIDE.md](ARKTS_TURBOMODULE_CHECK_GUIDE.md) 第 3.4 节。
|
|
567
|
+
> 📖 **ArkTS TurboModule 回调/事件检视**详见 [ARKTS_TURBOMODULE_CHECK_GUIDE.md](ARKTS_TURBOMODULE_CHECK_GUIDE.md) 第 3.5 节。
|
|
568
|
+
|
|
569
|
+
---
|
|
570
|
+
|
|
571
|
+
## 4. 方法级对比格式
|
|
572
|
+
|
|
573
|
+
### 4.1 TurboModule 方法签名对比(C++ 层)
|
|
574
|
+
|
|
575
|
+
> 📖 **ArkTS TurboModule 方法签名对比**详见 [ARKTS_TURBOMODULE_CHECK_GUIDE.md](ARKTS_TURBOMODULE_CHECK_GUIDE.md) 第 2.2 维度 B。
|
|
576
|
+
|
|
577
|
+
```markdown
|
|
578
|
+
| # | 方法名 | JS Spec 签名 | C++ JSIBinder 签名 | C++ 文件:行号 | C++ 绑定状态 | 扣分 |
|
|
579
|
+
|---|--------|-------------|-------------------|-------------|-------------|------|
|
|
580
|
+
| 1 | `isFileUploadSupported` | `(): Promise<boolean>` | `SharedTurboModule → resolve bool` | `RNCWebViewModuleJSIBinder.h:12` | ✅ 一致 | 0 |
|
|
581
|
+
| 2 | `shouldStartLoadWithLockIdentifier` | `(shouldStart: boolean, lockIdentifier: Double): void` | `(bool, double) → void` | `RNCWebViewModuleJSIBinder.h:18` | ✅ 一致 | 0 |
|
|
582
|
+
```
|
|
583
|
+
|
|
584
|
+
### 4.2 TurboModule 跨层一致性对比(C++ 层视角)
|
|
585
|
+
|
|
586
|
+
> 📖 **ArkTS TurboModule Stub 检测**详见 [ARKTS_TURBOMODULE_CHECK_GUIDE.md](ARKTS_TURBOMODULE_CHECK_GUIDE.md) 第 2.2 维度 C。
|
|
587
|
+
|
|
588
|
+
```markdown
|
|
589
|
+
| # | TurboModule 名 | JS Spec 定义 | JS Spec 注册名 | C++ FactoryDelegate | C++ JSIBinder | C++ 文件 | 状态 | 扣分 |
|
|
590
|
+
|---|--------------|------------|--------------|--------------------|-------------|---------|------|------|
|
|
591
|
+
| 1 | `RNCWebViewModule` | `NativeRNCWebViewModule.ts` | `RNCWebViewModule` | ✅ BaseReactNativeWebviewPackageTurboModuleFactoryDelegate | ✅ RNCWebViewModuleJSIBinder | `BaseReactNativeWebviewPackage.h:22` | ✅ C++ 层一致 | 0 |
|
|
592
|
+
```
|
|
593
|
+
|
|
594
|
+
> 📖 **ArkTS TurboModule 层补充列**(ArkTS 实现类、ArkTS NAME 常量、ArkTS 方法签名)详见 [ARKTS_TURBOMODULE_CHECK_GUIDE.md](ARKTS_TURBOMODULE_CHECK_GUIDE.md) 第 5.1 节全链路对比表。
|
|
595
|
+
|
|
596
|
+
---
|
|
597
|
+
|
|
598
|
+
## 5. Stub 检测指引
|
|
599
|
+
|
|
600
|
+
> 📖 **ArkTS TurboModule Stub 检测与合理性判定**已独立为 [ARKTS_TURBOMODULE_CHECK_GUIDE.md](ARKTS_TURBOMODULE_CHECK_GUIDE.md) 第 3.3 节和第 2.2 维度 C。
|
|
601
|
+
|
|
602
|
+
本指南(C++ 层)不直接执行 Stub 检测,因为 Stub 是 ArkTS TurboModule 实现层的概念。但 C++ JSIBinder 层可能存在以下问题:
|
|
603
|
+
|
|
604
|
+
| C++ 层问题 | 识别方式 | 扣分 |
|
|
605
|
+
|----------|----------|------|
|
|
606
|
+
| C++ JSIBinder 方法缺失 | JS Spec 定义了方法但 C++ JSIBinder 无 HostFunction 注册 | -10/方法 |
|
|
607
|
+
| C++ JSIBinder 参数类型错误 | napi 类型转换与 JS Spec 不一致 | -10/方法 |
|
|
608
|
+
| C++ JSIBinder 方法名不匹配 | HostFunction 方法名与 JS Spec 方法名不一致 | -8/方法 |
|
|
609
|
+
|
|
610
|
+
---
|
|
611
|
+
|
|
612
|
+
## 6. 检视操作流程
|
|
613
|
+
|
|
614
|
+
### 6.1 Phase 0 补充步骤(TurboModule C++ 层定位)
|
|
615
|
+
|
|
616
|
+
```
|
|
617
|
+
TM-1: 定位 TurboModuleFactoryDelegate
|
|
618
|
+
→ Codegen: 读取 generated/RNOH/generated/BaseReactNative*Package.h
|
|
619
|
+
→ Legacy: 读取 *Package.h 或 *TurboModuleFactoryDelegate.h
|
|
620
|
+
|
|
621
|
+
TM-2: 提取 TurboModule 名列表
|
|
622
|
+
→ 从 createTurboModule() 方法的 if 条件中提取所有 TurboModule 名
|
|
623
|
+
→ 对比 JS 层 TurboModuleRegistry.getEnforcing<Spec>('XXX') 的模块名
|
|
624
|
+
|
|
625
|
+
TM-3: 定位 TurboModule JSIBinder(若存在)
|
|
626
|
+
→ 搜索 generated/RNOH/generated/turbo_modules/*JSIBinder.h
|
|
627
|
+
→ 搜索 cpp/*TurboModule*JSIBinder.h
|
|
628
|
+
```
|
|
629
|
+
|
|
630
|
+
> 📖 **ArkTS TurboModule 定位步骤**(TM-ARK-1~4)详见 [ARKTS_TURBOMODULE_CHECK_GUIDE.md](ARKTS_TURBOMODULE_CHECK_GUIDE.md) 第 6.1 节。
|
|
631
|
+
|
|
632
|
+
### 6.2 Phase 3 补充步骤(TurboModule C++ 层分析)
|
|
633
|
+
|
|
634
|
+
```
|
|
635
|
+
TM-5: TurboModule 注册完整性对比
|
|
636
|
+
→ C++ FactoryDelegate TurboModule 名 vs JS Spec TurboModule 名
|
|
637
|
+
→ 标注缺失的 TurboModule 注册
|
|
638
|
+
|
|
639
|
+
TM-6: TurboModule JSIBinder 方法级对比(C++ 层)
|
|
640
|
+
→ JS Spec 方法签名 vs C++ JSIBinder 方法签名
|
|
641
|
+
→ 标注 C++ JSIBinder 方法缺失、类型映射错误
|
|
642
|
+
|
|
643
|
+
TM-7: TurboModule C++→ArkTS 映射对比
|
|
644
|
+
→ C++ FactoryDelegate 构造类名 vs ArkTS TurboModule 类名
|
|
645
|
+
→ C++ 注册名 vs ArkTS NAME 常量
|
|
646
|
+
```
|
|
647
|
+
|
|
648
|
+
> 📖 **ArkTS TurboModule 分析步骤**(TM-ARK-5~11)详见 [ARKTS_TURBOMODULE_CHECK_GUIDE.md](ARKTS_TURBOMODULE_CHECK_GUIDE.md) 第 6.2 节。
|
|
649
|
+
|
|
650
|
+
---
|
|
651
|
+
|
|
652
|
+
## 7. 报告输出格式
|
|
653
|
+
|
|
654
|
+
在一致性检视报告的"5.8 RN 架构一致性检视"中增加以下子章节(C++ 层部分):
|
|
655
|
+
|
|
656
|
+
> 📖 **ArkTS TurboModule 层报告输出格式**详见 [ARKTS_TURBOMODULE_CHECK_GUIDE.md](ARKTS_TURBOMODULE_CHECK_GUIDE.md) 第 7 节。
|
|
657
|
+
|
|
658
|
+
```markdown
|
|
659
|
+
#### C++ TurboModule 层一致性(如适用)
|
|
660
|
+
|
|
661
|
+
**C++ TurboModule 模式**:{Codegen / Legacy / ⚠️ 无 C++ TurboModule 层}
|
|
662
|
+
|
|
663
|
+
| # | TurboModule 名 | JS Spec 注册名 | C++ FactoryDelegate | C++ JSIBinder | C++ 文件 | 状态 | 扣分 |
|
|
664
|
+
|---|--------------|--------------|--------------------|-------------|---------|------|------|
|
|
665
|
+
| ... | ... | ... | ... | ... | ... | ... | ... |
|
|
666
|
+
|
|
667
|
+
**TurboModule JSIBinder 方法级对比(C++ 层)**:
|
|
668
|
+
|
|
669
|
+
| # | 方法名 | JS Spec 签名 | C++ JSIBinder 签名 | C++ 文件:行号 | C++ 绑定状态 | 扣分 |
|
|
670
|
+
|---|--------|-------------|-------------------|-------------|-------------|------|
|
|
671
|
+
| ... | ... | ... | ... | ... | ... | ... |
|
|
672
|
+
```
|
|
673
|
+
|
|
674
|
+
---
|
|
675
|
+
|
|
676
|
+
## 8. 与 ARKTS_TURBOMODULE_CHECK_GUIDE 的协同
|
|
677
|
+
|
|
678
|
+
本指南仅覆盖 **C++ TurboModule 层**(FactoryDelegate + JSIBinder),ArkTS TurboModule 层(实现类 + 方法完整性 + Stub + 常量 + 回调)已独立为 [ARKTS_TURBOMODULE_CHECK_GUIDE.md](ARKTS_TURBOMODULE_CHECK_GUIDE.md)。
|
|
679
|
+
|
|
680
|
+
检视执行顺序建议:
|
|
681
|
+
|
|
682
|
+
1. **先执行本指南** → 获得 C++ FactoryDelegate 注册名、JSIBinder 方法列表
|
|
683
|
+
2. **再执行 ARKTS_TURBOMODULE_CHECK_GUIDE** → 获得 ArkTS TurboModule 类声明、方法实现、Stub 检测、常量导出、回调/事件
|
|
684
684
|
3. **合并两张表** → 以 TurboModule 名为主键,拼接 C++ 层列和 ArkTS 层列,生成完整全链路一致性分析
|