@ohos-cpf/3rdloop 0.0.8 → 0.0.9
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 +25 -0
- package/lib/cli.js +22 -5
- package/lib/doctor.js +111 -10
- package/lib/mcp.js +498 -0
- package/package.json +6 -2
- package/vendor/Archive/data/.index/meta.json +7 -0
- package/vendor/Archive/data/.index/search.db +0 -0
- package/vendor/Archive/data/docs/experiences/arkts-check-tool-pitfalls-baseline-comparison.md +13 -0
- package/vendor/Archive/data/docs/experiences/arkts-deep-path-import-recognition.md +31 -0
- package/vendor/Archive/data/docs/experiences/arkts-demo-coverage-entry-file-case-mismatch.md +25 -0
- package/vendor/Archive/data/docs/experiences/arkts-demo-coverage-import-trailing-slash.md +20 -0
- package/vendor/Archive/data/docs/experiences/arkts-library-source-files-may-be-ts.md +18 -0
- package/vendor/Archive/data/docs/experiences/arkts-typedarray-buffer-interface-cast-compile-fixes.md +36 -0
- package/vendor/Archive/data/docs/experiences/arkts-xts-compile-error-clustering-fix.md +24 -0
- package/vendor/Archive/data/docs/experiences/arkts-xts-doc-expected-value-runtime-probe.md +35 -0
- package/vendor/Archive/data/docs/experiences/arkts-xts-fixture-rawfile-testability-injection.md +33 -0
- package/vendor/Archive/data/docs/experiences/code-linter-chinese-comment-false-positive.md +16 -0
- package/vendor/Archive/data/docs/experiences/esobject-new-expression-variable-tracking.md +33 -0
- package/vendor/Archive/data/docs/experiences/filesystem-case-sensitivity-module-resolution.md +31 -0
- package/vendor/Archive/data/docs/experiences/gitcode-clone-redirect-warning-normal.md +13 -0
- package/vendor/Archive/data/docs/experiences/kn_msgvq1w585ec8319.md +77 -0
- package/vendor/Archive/data/docs/experiences/kn_msovnm6rd46de72c.md +98 -0
- package/vendor/Archive/data/docs/experiences/kn_mspt8vntfe708576.md +87 -0
- package/vendor/Archive/data/docs/experiences/kn_mspu1ei77adbbb48.md +133 -0
- package/vendor/Archive/data/docs/experiences/kn_mspubgak8d30bfce.md +128 -0
- package/vendor/Archive/data/docs/experiences/kn_mspug2de3cb1f7c3.md +115 -0
- package/vendor/Archive/data/docs/experiences/kn_skill_opt_001.md +38 -0
- package/vendor/Archive/data/docs/experiences/loop-artifacts-verification-evidence-triangle.md +19 -0
- package/vendor/Archive/data/docs/experiences/macos-bash-replace-build-ps1.md +19 -0
- package/vendor/Archive/data/docs/experiences/macos-bsd-diff-q-illegal-option.md +15 -0
- package/vendor/Archive/data/docs/experiences/migrate-cjs-compatible-api-version-map-limit.md +17 -0
- package/vendor/Archive/data/docs/experiences/mp3agic-arkts-library-behavior-quirks.md +21 -0
- package/vendor/Archive/data/docs/experiences/ohos-face-detection-scan-api-mapping.md +15 -0
- package/vendor/Archive/data/docs/experiences/pr-metadata-and-diff-integrity-verification.md +12 -0
- package/vendor/Archive/data/docs/experiences/rn-coverage-index-signature-pseudo-member-false-negative.md +32 -0
- package/vendor/Archive/data/docs/experiences/rn-memory-check-severity-calibration.md +21 -0
- package/vendor/Archive/data/docs/experiences/rn-platform-specific-api-exclusion-evidence.md +24 -0
- package/vendor/Archive/data/docs/experiences/rn-upstream-version-diff-pitfalls.md +17 -0
- package/vendor/Archive/data/docs/experiences/rn-version-gap-risk-rating-rules.md +13 -0
- package/vendor/Archive/data/docs/experiences/rn-view-lib-native-contract-diff-fabric-spec.md +16 -0
- package/vendor/Archive/data/docs/experiences/rnoh-adapter-package-version-field-semantics.md +18 -0
- package/vendor/Archive/data/docs/experiences/rnoh-arkts-sqlite-rows-array-format.md +18 -0
- package/vendor/Archive/data/docs/experiences/rnoh-dependency-residue-scan-strategy.md +18 -0
- package/vendor/Archive/data/docs/experiences/rnoh-example-local-lib-dep-use-tgz.md +53 -0
- package/vendor/Archive/data/docs/experiences/rnoh-example-prereserve-rntesterlist.md +17 -0
- package/vendor/Archive/data/docs/experiences/rnoh-example-template-compatiblesdkversion-upgrade.md +29 -0
- package/vendor/Archive/data/docs/experiences/rnoh-example-turbomodule-shell-adaptation-checklist.md +41 -0
- package/vendor/Archive/data/docs/experiences/rnoh-mcp-build-project-tool-risk.md +18 -0
- package/vendor/Archive/data/docs/experiences/rnoh-npm-devdependencies-version-precheck.md +29 -0
- package/vendor/Archive/data/docs/experiences/rnoh-repo-baseline-version-verification.md +13 -0
- package/vendor/Archive/data/docs/experiences/rnoh-repo-upstream-directory-mapping.md +18 -0
- package/vendor/Archive/data/docs/experiences/rnoh-stateless-library-zero-leak-verification.md +31 -0
- package/vendor/Archive/data/docs/experiences/rnoh-template-npmrc-credential-removal.md +15 -0
- package/vendor/Archive/data/docs/experiences/rnoh-turbomodule-codegen-wiring-verification.md +19 -0
- package/vendor/Archive/data/docs/experiences/rnoh-turbomodule-cpp-methodmap-compatibility-check.md +20 -0
- package/vendor/Archive/data/docs/experiences/scenario-doc-vs-source-signature-diff-four-patterns.md +24 -0
- package/vendor/Archive/data/docs/experiences/static-analysis-grep-cross-validation.md +29 -0
- package/vendor/Archive/demo.js +489 -0
- package/vendor/Archive/index.js +43 -0
- package/vendor/Archive/package.json +16 -0
- package/vendor/Archive/src/constants.js +83 -0
- package/vendor/Archive/src/data/stopwords.txt +110 -0
- package/vendor/Archive/src/data/synonyms.json +25 -0
- package/vendor/Archive/src/data/terms.txt +59 -0
- package/vendor/Archive/src/db/sqlite-backend.js +312 -0
- package/vendor/Archive/src/db/sqlite-schema.js +64 -0
- package/vendor/Archive/src/engine.js +501 -0
- package/vendor/Archive/src/index/index-manager.js +203 -0
- package/vendor/Archive/src/index/index-state.js +94 -0
- package/vendor/Archive/src/index/search-text-builder.js +106 -0
- package/vendor/Archive/src/index.js +22 -0
- package/vendor/Archive/src/parser/api-identifiers.js +121 -0
- package/vendor/Archive/src/parser/api-suffixes.js +48 -0
- package/vendor/Archive/src/parser/heading-normalize.js +40 -0
- package/vendor/Archive/src/parser/markdown-splitter.js +215 -0
- package/vendor/Archive/src/search/catalog-routing.js +87 -0
- package/vendor/Archive/src/search/fts-search.js +289 -0
- package/vendor/Archive/src/search/query-normalizer.js +159 -0
- package/vendor/Archive/src/search/query-rewriter.js +72 -0
- package/vendor/Archive/src/search/search-engine.js +72 -0
- package/vendor/Archive/src/search/snippet.js +64 -0
- package/vendor/Archive/src/store/dir-store.js +103 -0
- package/vendor/Archive/src/store/doc-store.js +36 -0
- package/vendor/Archive/src/tokenizer/lexicon.js +151 -0
- package/vendor/Archive/src/tokenizer/tokenizer.js +167 -0
- package/vendor/Archive/src/types.js +86 -0
- package/vendor/Archive/src/utils/hash.js +16 -0
- package/vendor/Archive/src/utils/lock.js +73 -0
- package/vendor/Archive/src/utils/path-safety.js +96 -0
- package/vendor/Archive/src/utils/paths.js +39 -0
- package/vendor/BadCase/rn/INDEX.md +127 -0
- package/vendor/BadCase/rn/cases/KI-001-webview/350/247/206/351/242/221/346/227/240/346/263/225/346/250/252/345/261/217.md +52 -0
- package/vendor/BadCase/rn/cases/KI-002-fastImage/347/203/255/346/233/264/346/226/260/345/233/276/347/211/207/345/244/261/350/264/245.md +37 -0
- package/vendor/BadCase/rn/cases/KI-003-wechat/347/274/251/347/225/245/345/233/276/346/234/254/345/234/260/345/233/276/347/211/207.md +62 -0
- package/vendor/BadCase/rn/cases/KI-004-wechat/345/233/236/350/260/203/346/227/266/345/272/217.md +47 -0
- package/vendor/BadCase/rn/cases/KI-005-geolocation/345/257/274/345/205/245/350/267/257/345/276/204/345/220/216/347/274/200.md +31 -0
- package/vendor/BadCase/rn/cases/KI-006-SmartRefreshLayout/346/231/272/350/203/275/346/214/207/351/222/210/345/264/251/346/272/203.md +55 -0
- package/vendor/BadCase/rn/cases/KI-007-orientation-locker/344/274/240/346/204/237/345/231/250/345/210/235/345/247/213/345/214/226.md +58 -0
- package/vendor/BadCase/rn/cases/KI-008-orientation-locker/344/274/240/346/204/237/345/231/250/345/274/225/347/224/250/350/256/241/346/225/260.md +47 -0
- package/vendor/BadCase/rn/cases/KI-009-pager-view/345/265/214/345/245/227/346/273/221/345/212/250.md +38 -0
- package/vendor/BadCase/rn/cases/KI-010-screens/346/211/213/345/212/277/345/206/262/347/252/201.md +48 -0
- package/vendor/BadCase/rn/cases/KI-011-spring-scrollview/346/211/213/345/212/277/351/207/215/345/244/215/347/273/221/345/256/232.md +49 -0
- package/vendor/BadCase/rn/cases/KI-012-qr-camera/346/250/252/345/261/217/351/200/202/351/205/215.md +59 -0
- package/vendor/BadCase/rn/cases/KI-013-webview/346/267/261/350/211/262/346/250/241/345/274/217/350/203/214/346/231/257/350/211/262.md +37 -0
- package/vendor/BadCase/rn/cases/KI-014-amap-geolocation/345/233/236/350/260/203/347/274/272/345/244/261.md +42 -0
- package/vendor/BadCase/rn/cases/KI-015-reanimated/350/277/220/350/241/214/346/227/266/346/236/220/346/236/204/345/264/251/346/272/203.md +54 -0
- package/vendor/BadCase/rn/cases/KI-016-fs/346/226/207/344/273/266/350/257/273/345/217/226/347/274/226/347/240/201.md +58 -0
- package/vendor/BadCase/rn/cases/KI-017-blob-util/345/217/202/346/225/260/347/274/226/347/240/201/351/224/231/350/257/257.md +39 -0
- package/vendor/BadCase/rn/cases/KI-018-modal/345/274/271/347/252/227/351/227/252/347/203/201.md +53 -0
- package/vendor/BadCase/rn/cases/KI-019-code-push/351/207/215/345/220/257/351/200/273/350/276/221/345/244/261/346/225/210.md +79 -0
- package/vendor/BadCase/rn/cases/KI-020-netinfo/346/225/217/346/204/237/344/277/241/346/201/257/346/263/204/351/234/262.md +60 -0
- package/vendor/BadCase/rn/cases/KI-021-video/346/234/254/345/234/260/350/247/206/351/242/221/346/222/255/346/224/276/345/274/202/345/270/270.md +79 -0
- package/vendor/BadCase/rn/cases/KI-022-audio-recorder-player/346/236/232/344/270/276/347/274/272/345/244/261.md +38 -0
- package/vendor/BadCase/rn/cases/KI-023-svg/346/270/220/345/217/230/347/273/247/346/211/277/345/244/261/346/225/210.md +62 -0
- package/vendor/BadCase/rn/generalization-log.md +55 -0
- package/vendor/BadCase/rn/pr-info/rntpc_react-native-SmartRefreshLayout-32.json +328 -0
- package/vendor/BadCase/rn/pr-info/rntpc_react-native-SmartRefreshLayout-32.md +382 -0
- package/vendor/BadCase/rn/pr-info/rntpc_react-native-amap-geolocation-27.json +1351 -0
- package/vendor/BadCase/rn/pr-info/rntpc_react-native-amap-geolocation-27.md +1176 -0
- package/vendor/BadCase/rn/pr-info/rntpc_react-native-audio-recorder-player-22.json +538 -0
- package/vendor/BadCase/rn/pr-info/rntpc_react-native-audio-recorder-player-22.md +1488 -0
- package/vendor/BadCase/rn/pr-info/rntpc_react-native-blob-util-23.json +211 -0
- package/vendor/BadCase/rn/pr-info/rntpc_react-native-blob-util-23.md +35 -0
- package/vendor/BadCase/rn/pr-info/rntpc_react-native-code-push-17.json +2048 -0
- package/vendor/BadCase/rn/pr-info/rntpc_react-native-code-push-17.md +3866 -0
- package/vendor/BadCase/rn/pr-info/rntpc_react-native-fast-image-102.json +198 -0
- package/vendor/BadCase/rn/pr-info/rntpc_react-native-fast-image-102.md +40 -0
- package/vendor/BadCase/rn/pr-info/rntpc_react-native-fs-38.json +751 -0
- package/vendor/BadCase/rn/pr-info/rntpc_react-native-fs-38.md +883 -0
- package/vendor/BadCase/rn/pr-info/rntpc_react-native-geolocation-24.json +1544 -0
- package/vendor/BadCase/rn/pr-info/rntpc_react-native-geolocation-24.md +2598 -0
- package/vendor/BadCase/rn/pr-info/rntpc_react-native-modal-20.json +246 -0
- package/vendor/BadCase/rn/pr-info/rntpc_react-native-modal-20.md +554 -0
- package/vendor/BadCase/rn/pr-info/rntpc_react-native-netinfo-31.json +211 -0
- package/vendor/BadCase/rn/pr-info/rntpc_react-native-netinfo-31.md +54 -0
- package/vendor/BadCase/rn/pr-info/rntpc_react-native-orientation-locker-45.json +1626 -0
- package/vendor/BadCase/rn/pr-info/rntpc_react-native-orientation-locker-45.md +2213 -0
- package/vendor/BadCase/rn/pr-info/rntpc_react-native-orientation-locker-51.json +208 -0
- package/vendor/BadCase/rn/pr-info/rntpc_react-native-orientation-locker-51.md +77 -0
- package/vendor/BadCase/rn/pr-info/rntpc_react-native-pager-view-32.json +377 -0
- package/vendor/BadCase/rn/pr-info/rntpc_react-native-pager-view-32.md +174 -0
- package/vendor/BadCase/rn/pr-info/rntpc_react-native-qr-decode-image-camera-37.json +232 -0
- package/vendor/BadCase/rn/pr-info/rntpc_react-native-qr-decode-image-camera-37.md +194 -0
- package/vendor/BadCase/rn/pr-info/rntpc_react-native-reanimated-82.json +198 -0
- package/vendor/BadCase/rn/pr-info/rntpc_react-native-reanimated-82.md +67 -0
- package/vendor/BadCase/rn/pr-info/rntpc_react-native-screens-87.json +198 -0
- package/vendor/BadCase/rn/pr-info/rntpc_react-native-screens-87.md +38 -0
- package/vendor/BadCase/rn/pr-info/rntpc_react-native-screens-93.json +208 -0
- package/vendor/BadCase/rn/pr-info/rntpc_react-native-screens-93.md +34 -0
- package/vendor/BadCase/rn/pr-info/rntpc_react-native-spring-scrollview-38.json +222 -0
- package/vendor/BadCase/rn/pr-info/rntpc_react-native-spring-scrollview-38.md +56 -0
- package/vendor/BadCase/rn/pr-info/rntpc_react-native-svg-117.json +463 -0
- package/vendor/BadCase/rn/pr-info/rntpc_react-native-svg-117.md +383 -0
- package/vendor/BadCase/rn/pr-info/rntpc_react-native-video-66.json +464 -0
- package/vendor/BadCase/rn/pr-info/rntpc_react-native-video-66.md +565 -0
- package/vendor/BadCase/rn/pr-info/rntpc_react-native-webview-112.json +198 -0
- package/vendor/BadCase/rn/pr-info/rntpc_react-native-webview-112.md +47 -0
- package/vendor/BadCase/rn/pr-info/rntpc_react-native-webview-121.json +232 -0
- package/vendor/BadCase/rn/pr-info/rntpc_react-native-webview-121.md +422 -0
- package/vendor/BadCase/rn/pr-info/rntpc_react-native-wechat-lib-15.json +295 -0
- package/vendor/BadCase/rn/pr-info/rntpc_react-native-wechat-lib-15.md +1038 -0
- package/vendor/BadCase/rn/rules/R-01-/345/205/250/345/261/217/347/252/227/345/217/243/347/212/266/346/200/201/347/256/241/347/220/206/345/256/214/346/225/264/346/200/247.md +20 -0
- package/vendor/BadCase/rn/rules/R-02-/350/265/204/346/272/220URI/345/275/242/346/200/201/345/210/206/346/224/257/350/246/206/347/233/226.md +21 -0
- package/vendor/BadCase/rn/rules/R-03-/351/231/204/345/261/236/346/223/215/344/275/234/345/244/261/350/264/245/351/230/273/346/226/255/344/270/273/346/265/201/347/250/213.md +20 -0
- package/vendor/BadCase/rn/rules/R-04-/345/274/202/346/255/245/345/233/236/350/260/203/346/263/250/345/206/214/346/227/266/345/272/217.md +20 -0
- package/vendor/BadCase/rn/rules/R-05-/346/250/241/345/235/227/345/257/274/345/205/245/350/267/257/345/276/204/350/247/204/350/214/203.md +19 -0
- package/vendor/BadCase/rn/rules/R-06-/344/274/240/346/204/237/345/231/250/347/241/254/344/273/266/346/235/203/351/231/220/346/214/211/351/234/200/350/216/267/345/217/226.md +21 -0
- package/vendor/BadCase/rn/rules/R-07-/346/231/272/350/203/275/346/214/207/351/222/210/347/224/237/345/221/275/345/221/250/346/234/237/347/256/241/347/220/206.md +20 -0
- package/vendor/BadCase/rn/rules/R-08-/346/211/213/345/212/277/344/272/213/344/273/266/346/263/250/345/206/214/344/270/216/345/206/262/347/252/201/345/244/204/347/220/206.md +22 -0
- package/vendor/BadCase/rn/rules/R-09-/346/250/252/347/253/226/345/261/217/345/244/232/345/275/242/346/200/201/345/270/203/345/261/200/351/200/202/351/205/215.md +20 -0
- package/vendor/BadCase/rn/rules/R-10-/346/267/261/350/211/262/346/250/241/345/274/217/344/270/273/351/242/230/351/242/234/350/211/262/351/200/202/351/205/215.md +19 -0
- package/vendor/BadCase/rn/rules/R-11-/346/216/245/345/217/243/345/233/236/350/260/203/345/256/236/347/216/260/345/256/214/346/225/264/346/200/247.md +20 -0
- package/vendor/BadCase/rn/rules/R-12-/345/216/237/347/224/237/350/277/220/350/241/214/346/227/266/350/265/204/346/272/220/346/236/220/346/236/204/346/227/266/345/272/217.md +20 -0
- package/vendor/BadCase/rn/rules/R-13-/346/226/207/344/273/266/346/225/260/346/215/256/347/274/226/347/240/201/344/270/216/346/240/274/345/274/217/345/205/274/345/256/271.md +21 -0
- package/vendor/BadCase/rn/rules/R-14-/345/212/250/347/224/273/345/210/235/345/247/213/345/214/226/346/227/266/345/272/217/344/270/216/347/212/266/346/200/201/345/220/214/346/255/245.md +20 -0
- package/vendor/BadCase/rn/rules/R-15-/347/212/266/346/200/201/346/214/201/344/271/205/345/214/226/344/270/216/351/207/215/345/220/257/351/200/273/350/276/221/344/270/200/350/207/264/346/200/247.md +20 -0
- package/vendor/BadCase/rn/rules/R-16-/346/225/217/346/204/237/344/277/241/346/201/257/346/227/245/345/277/227/346/263/204/351/234/262.md +19 -0
- package/vendor/BadCase/rn/rules/R-17-/345/252/222/344/275/223/350/265/204/346/272/220/347/224/237/345/221/275/345/221/250/346/234/237/344/270/216/351/224/231/350/257/257/345/244/204/347/220/206.md +21 -0
- package/vendor/BadCase/rn/rules/R-18-/350/203/275/345/212/233/346/236/232/344/270/276/351/205/215/347/275/256/345/256/214/346/225/264/346/200/247.md +19 -0
- package/vendor/BadCase/rn/rules/R-19-/345/233/276/345/275/242/346/270/262/346/237/223/345/261/236/346/200/247/347/273/247/346/211/277/344/270/216/351/207/215/347/275/256.md +19 -0
- package/vendor/MCP/README.md +490 -0
- package/vendor/MCP/config.json +29 -0
- package/vendor/MCP/package.json +23 -0
- package/vendor/MCP/scripts/analyze-demo-coverage.cjs +1203 -0
- package/vendor/MCP/scripts/analyze-xts-coverage.cjs +1245 -0
- package/vendor/MCP/scripts/deveco_docs.js +247 -0
- package/vendor/MCP/scripts/extract-interfaces.cjs +1487 -0
- package/vendor/MCP/scripts/flutter-analyze-demo-coverage.cjs +666 -0
- package/vendor/MCP/scripts/flutter-analyze-xts-coverage.cjs +684 -0
- package/vendor/MCP/scripts/flutter-extract-interfaces.cjs +1251 -0
- package/vendor/MCP/scripts/flutter-render-spec-doc.cjs +351 -0
- package/vendor/MCP/scripts/render-spec-doc.cjs +347 -0
- package/vendor/MCP/scripts/rn-analyze-demo-coverage.cjs +645 -0
- package/vendor/MCP/scripts/rn-analyze-test-coverage.cjs +614 -0
- package/vendor/MCP/scripts/rn-extract-interfaces.cjs +1462 -0
- package/vendor/MCP/scripts/rn-render-spec-doc.cjs +327 -0
- package/vendor/MCP/scripts/rn-scan-exports.cjs +1336 -0
- package/vendor/MCP/src/client/MCPClientPool.js +220 -0
- package/vendor/MCP/src/config/ConfigLoader.js +189 -0
- package/vendor/MCP/src/executor/ScriptExecutor.js +110 -0
- package/vendor/MCP/src/gateway/Gateway.js +451 -0
- package/vendor/MCP/src/index.js +87 -0
- package/vendor/MCP/src/library/KBToolProvider.js +229 -0
- package/vendor/MCP/src/library/logger.js +60 -0
- package/vendor/MCP/src/registry/ScriptRegistry.js +238 -0
- package/vendor/MCP/src/registry/ToolRegistry.js +111 -0
- package/vendor/MCP/src/types.js +115 -0
- package/vendor/Server/Skills/arkts-library-test-coverage-check/references/MCP_TOOL_USAGE.md +4 -2
- package/vendor/Server/Skills/arkts-library-xts-coverage/SKILL.md +3 -3
- package/vendor/Server/Skills/knowledge-import/SKILL.md +1 -1
- package/vendor/Server/Skills/knowledge-import/references/MCP_TOOL_USAGE.md +12 -4
- package/vendor/Server/Skills/ohos-lib-pr-push/SKILL.md +5 -4
- package/vendor/Server/Skills/rn-library-issue-generalizer/SKILL.md +2 -2
- package/vendor/Server/Skills/rn-library-known-issue-check/SKILL.md +2 -2
- package/vendor/Server/Skills/rnoh-lib-demo-coverage/SKILL.md +1 -2
- package/vendor/Server/Skills/rnoh-lib-test-align/references/port-test-demo-guide.md +1 -1
- package/vendor/Server/Skills/rnoh-lib-xts-coverage/SKILL.md +1 -2
- package/vendor/Server/package.json +5 -1
- package/vendor/VERSION +3 -3
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# R-01 全屏/窗口状态管理完整性类
|
|
2
|
+
|
|
3
|
+
- **状态**: active
|
|
4
|
+
- **严重级别**: high(核心功能不可用:全屏能力整体失效)
|
|
5
|
+
- **适用范围**: 对外声明媒体/窗口/系统能力(全屏、旋转、后台播放、画中画等)的库
|
|
6
|
+
- 预筛特征: JS 层暴露 fullscreen/orientation/allowsFullscreenVideo 等接口;ArkTS 层使用 Web/Video/AVPlayer 等媒体组件;README 含"全屏""横屏"能力声明
|
|
7
|
+
- **问题本质**: 库声明了全屏/旋转类能力,但鸿蒙侧实现只覆盖"happy path"——缺少全屏事件监听、初始状态保存、多步操作失败回滚、组件销毁时窗口状态恢复中的任一环节,导致能力整体失效或状态残留
|
|
8
|
+
- **检查点**:
|
|
9
|
+
1. 列出库对外声明的全屏/旋转/窗口类能力,逐项在鸿蒙侧实现中定位支撑代码(事件监听 + 窗口 API 调用)
|
|
10
|
+
2. 检查进入全屏等多步窗口操作中,单步失败时是否有回滚逻辑(恢复方向/系统栏/布局)
|
|
11
|
+
3. 检查组件销毁(aboutToDisappear)时是否恢复窗口初始状态(方向、沉浸式、系统栏),防止状态残留
|
|
12
|
+
4. 检查异步窗口操作是否有状态标志防重入(如 isFullScreen 守卫)
|
|
13
|
+
- **错误特征**: 声明了全屏 prop 但 ArkTS 层无 onFullScreenEnter/onFullScreenExit 监听;或监听了事件但直接改布局,未调用 setPreferredOrientation/setWindowLayoutFullScreen;或全屏后组件销毁未恢复窗口状态
|
|
14
|
+
- **正确特征**: 完整链路 = 保存初始方向 → 监听全屏事件 → 串行执行方向+沉浸式设置(每步校验结果)→ 失败回滚 → 销毁时无条件恢复窗口状态
|
|
15
|
+
|
|
16
|
+
## 来源案例
|
|
17
|
+
|
|
18
|
+
| 编号 | 库 | 现象 | 案例文件 |
|
|
19
|
+
|------|-----|------|----------|
|
|
20
|
+
| KI-001 | react-native-webview | 视频无法横屏 | [KI-001-webview视频无法横屏.md](../cases/KI-001-webview视频无法横屏.md) |
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# R-02 资源 URI 形态分支覆盖类
|
|
2
|
+
|
|
3
|
+
- **状态**: active
|
|
4
|
+
- **严重级别**: high(特定 URI 形态下核心功能不可用)
|
|
5
|
+
- **适用范围**: 加载图片/音频/字体/bundle 等资源的库(ArkTS 层或 C++ 层)
|
|
6
|
+
- 预筛特征: 代码中存在 URI 前缀判断逻辑(startsWith/rfind "asset://"/"http"/"file://")或资源加载 API 调用(ImageKnife/getRawFile/http 下载)
|
|
7
|
+
- **问题本质**: 资源加载代码按前缀分支处理不同 URI 形态,但分支只覆盖了部分形态——同一前缀下混叠了多种实际来源(如 asset:// 既可能是 rawfile 资源也可能是沙箱文件路径),或遗漏 data:、热更新沙箱路径等鸿蒙运行环境实际会产生的形态
|
|
8
|
+
- **检查点**:
|
|
9
|
+
1. 定位所有资源 URI 解析/加载入口,枚举其处理的前缀分支(http/https、asset://、resource://RAWFILE/、data:、file://、沙箱绝对路径)
|
|
10
|
+
2. 对每个分支检查其加载方式是否与该形态的实际来源匹配(rawfile 资源走 resourceManager、沙箱文件走文件路径、data: 走 base64 解码)
|
|
11
|
+
3. 检查同一前缀下是否存在多种实际来源混叠而未二次区分(重点:asset:// 前缀的 rawfile 与沙箱路径混叠)
|
|
12
|
+
4. 比对上游原库 JS 层文档/类型定义中声明的 source 类型,确认鸿蒙侧分支覆盖了所有声明的形态
|
|
13
|
+
- **错误特征**: 前缀判断后单一加载方式(如 asset:// 一律 SetResource);或只处理 http 下载,本地 URI 直接走下载逻辑必然失败
|
|
14
|
+
- **正确特征**: 每种 URI 形态有独立分支且加载方式匹配来源;形态判断基于完整前缀链(先判 rawfile 前缀再判 asset 前缀);未识别形态有明确错误提示而非静默失败
|
|
15
|
+
|
|
16
|
+
## 来源案例
|
|
17
|
+
|
|
18
|
+
| 编号 | 库 | 现象 | 案例文件 |
|
|
19
|
+
|------|-----|------|----------|
|
|
20
|
+
| KI-002 | react-native-fast-image | 热更新图片加载失败 | [KI-002-fastImage热更新图片失败.md](../cases/KI-002-fastImage热更新图片失败.md) |
|
|
21
|
+
| KI-003 | react-native-wechat-lib | 缩略图不支持本地图片 | [KI-003-wechat缩略图本地图片.md](../cases/KI-003-wechat缩略图本地图片.md) |
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# R-03 附属操作失败阻断主流程类
|
|
2
|
+
|
|
3
|
+
- **状态**: active
|
|
4
|
+
- **严重级别**: high(附属操作失败导致核心功能不可用)
|
|
5
|
+
- **适用范围**: 主流程中包含附属步骤(缩略图、统计、日志、预加载、鉴权预检)的库
|
|
6
|
+
- 预筛特征: 主调用链中存在非核心的网络请求/文件操作/图片处理;错误回调路径中包含附属操作的错误信息
|
|
7
|
+
- **问题本质**: 主流程(分享/支付/跳转)中的附属操作(缩略图下载等)失败时,错误被直接传播到主流程错误回调,导致核心功能被非关键步骤阻断
|
|
8
|
+
- **检查点**:
|
|
9
|
+
1. 识别库的核心主流程(对外承诺的主功能调用链,如分享、支付、跳转)
|
|
10
|
+
2. 列出主流程中的附属操作(非核心必需的下载/压缩/统计步骤)
|
|
11
|
+
3. 逐项检查附属操作的异常分支:失败时是隔离降级(跳过附属步骤继续主流程)还是直接 reject/callback 错误阻断主流程
|
|
12
|
+
4. 检查附属操作失败是否有用户可感知的降级方案(如无缩略图继续分享)
|
|
13
|
+
- **错误特征**: 附属操作的错误字符串直接出现在主流程的 callback("xxx Failed...") 路径上;附属操作 Promise 无 catch
|
|
14
|
+
- **正确特征**: 附属操作失败时记录日志、置空附属数据、继续执行主流程;或提供开关允许用户关闭附属功能
|
|
15
|
+
|
|
16
|
+
## 来源案例
|
|
17
|
+
|
|
18
|
+
| 编号 | 库 | 现象 | 案例文件 |
|
|
19
|
+
|------|-----|------|----------|
|
|
20
|
+
| KI-003 | react-native-wechat-lib | 缩略图下载失败阻断分享 | [KI-003-wechat缩略图本地图片.md](../cases/KI-003-wechat缩略图本地图片.md) |
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# R-04 异步回调注册时序类
|
|
2
|
+
|
|
3
|
+
- **状态**: active
|
|
4
|
+
- **严重级别**: high(偶发/必现的主流程结果丢失,难排查)
|
|
5
|
+
- **适用范围**: JS 层通过事件回调接收原生结果的库(Promise 封装 native 调用 + 事件监听模式)
|
|
6
|
+
- 预筛特征: JS 层存在 `new Promise` 内先调 native 方法再用 emitter.once/registerCallback 监听响应的代码;或固定字符串 transaction 标识
|
|
7
|
+
- **问题本质**: JS 层调用原生方法与注册结果监听的时序颠倒(先调用后注册),原生响应先于监听注册到达时结果丢失;或使用固定 transaction 字符串标识请求,并发/重入场景下响应混淆
|
|
8
|
+
- **检查点**:
|
|
9
|
+
1. 定位 JS 层所有"Promise 封装 native 调用"的位置,检查是否先注册回调再调用 native
|
|
10
|
+
2. 检查注册前是否清理旧监听(unregisterCallback),防止重复注册导致多次响应
|
|
11
|
+
3. 检查请求标识(transaction)是否唯一(随机 UUID vs 固定字符串),并发调用是否会混淆响应
|
|
12
|
+
4. 检查回调中对无效响应(空结果/错误码字段)是否过滤
|
|
13
|
+
- **错误特征**: `nativeXxx?.(data)` 在 `emitter.once(...)` 之前执行;transaction = 固定字符串(如 "webpage")
|
|
14
|
+
- **正确特征**: 先 unregister 旧回调 → registerCallback 新回调 → 再调 native;transaction 用唯一标识(UUID);回调内过滤无效响应后 resolve/reject
|
|
15
|
+
|
|
16
|
+
## 来源案例
|
|
17
|
+
|
|
18
|
+
| 编号 | 库 | 现象 | 案例文件 |
|
|
19
|
+
|------|-----|------|----------|
|
|
20
|
+
| KI-004 | react-native-wechat-lib | shareWebpage 回调时序问题 | [KI-004-wechat回调时序.md](../cases/KI-004-wechat回调时序.md) |
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# R-05 模块导入路径规范类
|
|
2
|
+
|
|
3
|
+
- **状态**: active
|
|
4
|
+
- **严重级别**: low(不影响运行,但 IDE 爆红严重伤害开发者体验,引发"库有问题"误判)
|
|
5
|
+
- **适用范围**: 所有鸿蒙化库(harmony 目录含 .ets 源码)
|
|
6
|
+
- 预筛特征: harmony 目录下 index.ets/ts.ets 或其他 .ets 文件中 import 路径以 .ets 结尾
|
|
7
|
+
- **问题本质**: ArkTS 模块导入路径携带 .ets 文件后缀,运行时可解析但 IDE(DevEco Studio)标红报错,开发者按官方文档接入时误判为三方库故障
|
|
8
|
+
- **检查点**:
|
|
9
|
+
1. 扫描 harmony 目录所有 .ets 文件的 import/export from 路径
|
|
10
|
+
2. 检查路径是否以 .ets(或 .ts)后缀结尾
|
|
11
|
+
3. 检查入口文件(index.ets)的导出链路是否全部无后缀
|
|
12
|
+
- **错误特征**: `import { X } from './src/main/ets/X.ets'` 或 `export * from './ts.ets'`
|
|
13
|
+
- **正确特征**: `import { X } from './src/main/ets/X'`(无后缀)
|
|
14
|
+
|
|
15
|
+
## 来源案例
|
|
16
|
+
|
|
17
|
+
| 编号 | 库 | 现象 | 案例文件 |
|
|
18
|
+
|------|-----|------|----------|
|
|
19
|
+
| KI-005 | react-native-geolocation | 3.1.1 接入报错(IDE 爆红) | [KI-005-geolocation导入路径后缀.md](../cases/KI-005-geolocation导入路径后缀.md) |
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# R-06 传感器/硬件权限按需获取类
|
|
2
|
+
|
|
3
|
+
- **状态**: active
|
|
4
|
+
- **严重级别**: high(不符合隐私法规,上架审核被拒)
|
|
5
|
+
- **适用范围**: 声明使用传感器(加速度、陀螺仪、GPS 等)或硬件权限的库
|
|
6
|
+
- 预筛特征: 代码中调用 sensor API(sensor.on/sensor.off)或权限 API;README 含"传感器""权限"能力声明
|
|
7
|
+
- **问题本质**: 传感器/硬件在模块初始化时即打开,而非在业务实际调用时按需开启——隐私合规要求"使用时才获取",初始化即获取导致上架审核被拒
|
|
8
|
+
- **检查点**:
|
|
9
|
+
1. 定位传感器/硬件开启的调用位置(openSensor/start/on 等),确认是否在模块初始化(constructor/init)中执行
|
|
10
|
+
2. 检查是否有按需开启机制:首次 addListener 时开启,全部 removeListener 时关闭
|
|
11
|
+
3. 检查是否有引用计数防重复 open/close(同一 listener 重复添加不应重复 openSensor)
|
|
12
|
+
4. 检查 removeAllListeners 时是否复位计数并补一次 closeSensor
|
|
13
|
+
- **错误特征**: openSensor() 在模块顶层或构造函数中直接调用;addListener 每次都 openSensor;removeListener 每次都 closeSensor(无计数)
|
|
14
|
+
- **正确特征**: 引用计数管理:count===0 时 openSensor(一次),addListener 时 count++(去重),removeListener 时 count--,count===0 时 closeSensor
|
|
15
|
+
|
|
16
|
+
## 来源案例
|
|
17
|
+
|
|
18
|
+
| 编号 | 库 | 现象 | 案例文件 |
|
|
19
|
+
|------|-----|------|----------|
|
|
20
|
+
| KI-007 | react-native-orientation-locker | 加速度传感器初始化即打开,上架审核被拒 | [KI-007-orientation-locker传感器初始化.md](../cases/KI-007-orientation-locker传感器初始化.md) |
|
|
21
|
+
| KI-008 | react-native-orientation-locker | 传感器频繁 open/close 导致性能问题 | [KI-008-orientation-locker传感器引用计数.md](../cases/KI-008-orientation-locker传感器引用计数.md) |
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# R-07 C++ 智能指针生命周期管理类
|
|
2
|
+
|
|
3
|
+
- **状态**: active
|
|
4
|
+
- **严重级别**: high(app 崩溃,核心功能不可用)
|
|
5
|
+
- **适用范围**: C++ 层使用 shared_ptr/weak_ptr 管理原生节点的库
|
|
6
|
+
- 预筛特征: harmony 目录下 .cpp/.h 文件含 shared_ptr/weak_ptr;析构函数中 reset 或访问 shared_ptr 成员
|
|
7
|
+
- **问题本质**: 多线程环境下 shared_ptr 并发访问未加锁,析构函数中访问已被其他线程释放的 shared_ptr,导致 bad_weak_ptr 崩溃
|
|
8
|
+
- **检查点**:
|
|
9
|
+
1. 定位所有在析构函数 ~ClassName() 中访问 shared_ptr 成员的位置
|
|
10
|
+
2. 检查 shared_ptr 成员的 getter 方法是否有锁保护(shared_mutex/shared_lock)
|
|
11
|
+
3. 检查 getter 返回前是否进行空指针判断(而非 CHECK 断言导致 abort)
|
|
12
|
+
4. 检查析构函数中 reset shared_ptr 成员前是否先加锁
|
|
13
|
+
- **错误特征**: getter 中 `CHECK(ptr != nullptr) << "is null!"`(断言失败直接 abort);无任何锁保护;析构函数直接 `ptr = nullptr` 无锁
|
|
14
|
+
- **正确特征**: getter 使用 `std::shared_lock<std::shared_mutex>` 保护读取;返回前判空并记录日志而非 abort;析构函数使用 `std::unique_lock` 后 reset
|
|
15
|
+
|
|
16
|
+
## 来源案例
|
|
17
|
+
|
|
18
|
+
| 编号 | 库 | 现象 | 案例文件 |
|
|
19
|
+
|------|-----|------|----------|
|
|
20
|
+
| KI-006 | react-native-SmartRefreshLayout | bad_weak_ptr 崩溃 | [KI-006-SmartRefreshLayout智能指针崩溃.md](../cases/KI-006-SmartRefreshLayout智能指针崩溃.md) |
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# R-08 手势/事件注册与冲突处理类
|
|
2
|
+
|
|
3
|
+
- **状态**: active
|
|
4
|
+
- **严重级别**: high(手势冲突导致核心交互失效或崩溃)
|
|
5
|
+
- **适用范围**: 使用手势(PanGesture/滑动手势)或嵌套滚动组件的库
|
|
6
|
+
- 预筛特征: ArkTS 层含 .gesture() / PanGesture / onGestureRecognizerJudgeBegin;C++ 层含 registerPanGesture / NODE_EVENT
|
|
7
|
+
- **问题本质**: 手势注册缺少防重入保护(同一节点重复绑定手势导致崩溃)、手势冲突未通过 onGestureRecognizerJudgeBegin 仲裁、嵌套滚动组件未配置 NestedScroll 模式导致父子组件无法联动
|
|
8
|
+
- **检查点**:
|
|
9
|
+
1. 检查手势注册位置是否有防重入标志(如 isPanGestureRegistered),防止 init() 被多次调用时重复绑定
|
|
10
|
+
2. 检查嵌套滚动场景是否配置了 NestedScrollMode(SELF_FIRST / PARENT_FIRST / PARALLEL)
|
|
11
|
+
3. 检查手势冲突场景是否通过 onGestureRecognizerJudgeBegin 仲裁(CONTINUE / REJECT)
|
|
12
|
+
4. 检查手势相关属性的默认值是否与功能预期一致(如 gestureEnabled 默认应为 true)
|
|
13
|
+
- **错误特征**: registerPanGesture() 无防重入标志;嵌套滚动无 NestedScroll 配置;手势冲突无仲裁逻辑;gestureEnabled 默认 false 导致手势整体失效
|
|
14
|
+
- **正确特征**: 手势注册前检查 isPanGestureRegistered 标志;嵌套滚动显式配置 NestedScrollMode;手势冲突通过 onGestureRecognizerJudgeBegin 返回 CONTINUE/REJECT;手势开关默认值与功能声明一致
|
|
15
|
+
|
|
16
|
+
## 来源案例
|
|
17
|
+
|
|
18
|
+
| 编号 | 库 | 现象 | 案例文件 |
|
|
19
|
+
|------|-----|------|----------|
|
|
20
|
+
| KI-009 | react-native-pager-view | 嵌套滑动父子组件无法联动 | [KI-009-pager-view嵌套滑动.md](../cases/KI-009-pager-view嵌套滑动.md) |
|
|
21
|
+
| KI-010 | react-native-screens | 手势冲突与默认值错误 | [KI-010-screens手势冲突.md](../cases/KI-010-screens手势冲突.md) |
|
|
22
|
+
| KI-011 | react-native-spring-scrollview | 手势重复绑定崩溃 | [KI-011-spring-scrollview手势重复绑定.md](../cases/KI-011-spring-scrollview手势重复绑定.md) |
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# R-09 横竖屏/多形态布局适配类
|
|
2
|
+
|
|
3
|
+
- **状态**: active
|
|
4
|
+
- **严重级别**: medium(特定设备形态下 UI 展示异常)
|
|
5
|
+
- **适用范围**: 含相机预览/扫码/视频等视觉组件的库
|
|
6
|
+
- 预筛特征: JS 层使用 Dimensions API 或 aspectRatio 样式;组件涉及相机/视频预览
|
|
7
|
+
- **问题本质**: 组件布局使用固定宽高比(aspectRatio: 3/4)或固定定位(bottom/top),未检测横竖屏状态动态调整,导致横屏时视图偏移或裁剪
|
|
8
|
+
- **检查点**:
|
|
9
|
+
1. 检查视觉组件是否使用固定 aspectRatio 或固定尺寸,而非 flex 自适应
|
|
10
|
+
2. 检查是否通过 Dimensions.get('window') 检测横竖屏状态(width > height)
|
|
11
|
+
3. 检查横竖屏切换时提示文字/遮罩等叠加层定位是否动态调整
|
|
12
|
+
4. 检查是否监听 Dimensions change 事件以响应旋转
|
|
13
|
+
- **错误特征**: camera style 固定 `aspectRatio: 3/4`;提示文字固定 `bottom` 定位;无 Dimensions 监听
|
|
14
|
+
- **正确特征**: camera 使用 `flex: 1` 自适应;通过 `width > height` 判断横竖屏;叠加层根据 isLandscape 切换 top/bottom 定位
|
|
15
|
+
|
|
16
|
+
## 来源案例
|
|
17
|
+
|
|
18
|
+
| 编号 | 库 | 现象 | 案例文件 |
|
|
19
|
+
|------|-----|------|----------|
|
|
20
|
+
| KI-012 | react-native-qr-decode-image-camera | Pura X Max 横屏展示不正确 | [KI-012-qr-camera横屏适配.md](../cases/KI-012-qr-camera横屏适配.md) |
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# R-10 深色模式/主题颜色适配类
|
|
2
|
+
|
|
3
|
+
- **状态**: active
|
|
4
|
+
- **严重级别**: medium(深色模式下 UI 异常,用户体验差)
|
|
5
|
+
- **适用范围**: 含 WebView/自定义背景色的库
|
|
6
|
+
- 预筛特征: 代码中设置 backgroundColor / darkMode / forceDark;涉及 Web 组件
|
|
7
|
+
- **问题本质**: 深色模式下背景色取值错误——深色模式应使用暗色背景(Color.Black)但错误使用了亮色(Color.White),导致先闪白再变黑
|
|
8
|
+
- **检查点**:
|
|
9
|
+
1. 检查深色模式分支中 backgroundColor 取值是否与模式匹配(深色→暗色,浅色→亮色/透明)
|
|
10
|
+
2. 检查是否有深色模式切换时的过渡色处理(避免闪烁)
|
|
11
|
+
3. 检查 WebView/容器组件的背景色是否与内容主题一致
|
|
12
|
+
- **错误特征**: `darkMode === On ? Color.White : Color.Transparent`(深色模式用白色背景)
|
|
13
|
+
- **正确特征**: `darkMode === On ? Color.Black : Color.Transparent`(深色模式用黑色背景)
|
|
14
|
+
|
|
15
|
+
## 来源案例
|
|
16
|
+
|
|
17
|
+
| 编号 | 库 | 现象 | 案例文件 |
|
|
18
|
+
|------|-----|------|----------|
|
|
19
|
+
| KI-013 | react-native-webview | 深色模式先闪白再变黑 | [KI-013-webview深色模式背景色.md](../cases/KI-013-webview深色模式背景色.md) |
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# R-11 接口/回调实现完整性类
|
|
2
|
+
|
|
3
|
+
- **状态**: active
|
|
4
|
+
- **严重级别**: high(声明的接口未实现,调用方无法获取错误信息)
|
|
5
|
+
- **适用范围**: 对外声明了回调接口(onError/onXxx)的库
|
|
6
|
+
- 预筛特征: JS 层类型定义中含 onError/onXxx 回调 prop;ArkTS 层 TurboModule 实现
|
|
7
|
+
- **问题本质**: 库对外声明了错误回调接口(如 onLocationError),但鸿蒙侧实现中未触发该回调——错误发生时调用方无法感知,导致静默失败
|
|
8
|
+
- **检查点**:
|
|
9
|
+
1. 列出 JS 层类型定义中所有声明的回调 prop(onXxx)
|
|
10
|
+
2. 逐项在 ArkTS 层实现中搜索对应的回调触发代码
|
|
11
|
+
3. 检查错误分支(catch/reject/error callback)中是否调用了声明的错误回调
|
|
12
|
+
4. 检查是否有"声明但未实现"的回调(类型定义有但实现中无任何触发点)
|
|
13
|
+
- **错误特征**: JS 层声明了 onLocationError prop,但 ArkTS 层 catch 分支中无任何触发 onLocationError 的代码
|
|
14
|
+
- **正确特征**: 每个声明的回调在对应的错误/事件分支中都有触发代码;未实现的回调应在文档中明确标注
|
|
15
|
+
|
|
16
|
+
## 来源案例
|
|
17
|
+
|
|
18
|
+
| 编号 | 库 | 现象 | 案例文件 |
|
|
19
|
+
|------|-----|------|----------|
|
|
20
|
+
| KI-014 | react-native-amap-geolocation | onLocationError 未实现 | [KI-014-amap-geolocation回调缺失.md](../cases/KI-014-amap-geolocation回调缺失.md) |
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# R-12 原生运行时资源析构时序类
|
|
2
|
+
|
|
3
|
+
- **状态**: active
|
|
4
|
+
- **严重级别**: high(偶发崩溃,crash rate 0.01% 级别,难复现)
|
|
5
|
+
- **适用范围**: C++ 层持有 JSI/Hermes 运行时引用(Runtime/WorkletRuntime)的库
|
|
6
|
+
- 预筛特征: C++ 代码中含 jsi::Runtime / WorkletRuntime / Hermes GC 相关调用;析构函数中 reset workletRuntime
|
|
7
|
+
- **问题本质**: 原生运行时(如 Hermes)持有的 JSI 对象引用了已析构的原生对象(ShadowNode),析构顺序不当导致 GC 回收时访问野指针崩溃——uiWorkletRuntime 先于 UIManager 析构,GC 回收 ShadowNodeWrapper 时 ComponentDescriptorRegistry 已失效
|
|
8
|
+
- **检查点**:
|
|
9
|
+
1. 检查析构函数中 uiWorkletRuntime_/workletRuntime_ 的 reset 顺序是否在 UIManager/hooks 之前
|
|
10
|
+
2. 检查是否在 workletRuntime 析构前主动触发 GC(gc())回收 JSI 对象
|
|
11
|
+
3. 检查 GC 调用是否有异常保护(try-catch,失败不阻止析构)
|
|
12
|
+
4. 检查 commitHook_/mountHook_ 的 reset 是否在 GC 之后、UIManager reset 之前
|
|
13
|
+
- **错误特征**: uiWorkletRuntime_.reset() 在 commitHook_.reset() 之前;无主动 GC 调用;析构顺序:先 reset hooks → 再 reset runtime
|
|
14
|
+
- **正确特征**: 先主动 GC → 再 reset hooks → 再 reset UIManager → 最后 reset runtime;GC 调用有 try-catch 保护
|
|
15
|
+
|
|
16
|
+
## 来源案例
|
|
17
|
+
|
|
18
|
+
| 编号 | 库 | 现象 | 案例文件 |
|
|
19
|
+
|------|-----|------|----------|
|
|
20
|
+
| KI-015 | react-native-reanimated | 动画 crash(滴滴线上 0.01%) | [KI-015-reanimated运行时析构崩溃.md](../cases/KI-015-reanimated运行时析构崩溃.md) |
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# R-13 文件/数据编码与格式兼容类
|
|
2
|
+
|
|
3
|
+
- **状态**: active
|
|
4
|
+
- **严重级别**: high(非文本文件读取失败;参数编码错误导致服务端报错)
|
|
5
|
+
- **适用范围**: 涉及文件读写或 HTTP 请求体组装的库
|
|
6
|
+
- 预筛特征: 代码中使用 fs.readText/fs.readSync;HTTP 请求中组装 formData 或 body
|
|
7
|
+
- **问题本质**: 文件读取使用了仅支持文本的 API(readText)而非通用二进制 API(readSync);HTTP 请求参数编码方式与数据类型不匹配(字符串被 base64 编码为二进制流)
|
|
8
|
+
- **检查点**:
|
|
9
|
+
1. 检查文件读取 API 选择:readText 仅支持文本,readSync 支持所有格式
|
|
10
|
+
2. 检查 HTTP 请求体组装时,字符串参数是否被错误编码(base64 vs utf-8)
|
|
11
|
+
3. 检查文件关闭是否在 finally 块中执行(防止异常时 fd 泄漏)
|
|
12
|
+
4. 检查非路径字符串参数是否与文件流参数使用相同的编码路径
|
|
13
|
+
- **错误特征**: `fs.readText(path, ...)` 读取非文本文件;`buffer.alloc(data.length, data, 'base64')` 编码字符串参数
|
|
14
|
+
- **正确特征**: `fs.readSync(fd, buf)` 通用读取;`buffer.from(data, 'utf-8')` 编码字符串;`fs.closeSync` 在 finally 中执行
|
|
15
|
+
|
|
16
|
+
## 来源案例
|
|
17
|
+
|
|
18
|
+
| 编号 | 库 | 现象 | 案例文件 |
|
|
19
|
+
|------|-----|------|----------|
|
|
20
|
+
| KI-016 | react-native-fs | read 接口无法读取非文本文件 | [KI-016-fs文件读取编码.md](../cases/KI-016-fs文件读取编码.md) |
|
|
21
|
+
| KI-017 | react-native-blob-util | 字符串参数被错误转为文件流 | [KI-017-blob-util参数编码错误.md](../cases/KI-017-blob-util参数编码错误.md) |
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# R-14 动画初始化时序与状态同步类
|
|
2
|
+
|
|
3
|
+
- **状态**: active
|
|
4
|
+
- **严重级别**: medium(弹窗/动画出现闪烁,体验问题)
|
|
5
|
+
- **适用范围**: 使用 Animated API 或动画库的 UI 组件库
|
|
6
|
+
- 预筛特征: JS/TS 代码中使用 Animated.Value / Animated.timing / requestAnimationFrame;组件含 visible/showContent 等显示状态
|
|
7
|
+
- **问题本质**: 动画初始化时 animationValue 保留了上一次动画的终值(如 1.0),导致 content 在 setAnimation 创建 animationStyle 时瞬间显示在最终位置(一帧闪烁),然后 startAnimation 重置 animationValue 到 0 才回到初始位置
|
|
8
|
+
- **检查点**:
|
|
9
|
+
1. 检查 visible 状态变化时,是否在 setAnimation 之前先 stopAnimation + setValue(0)
|
|
10
|
+
2. 检查是否使用 animationReady 标志在动画初始化完成前阻止内容渲染
|
|
11
|
+
3. 检查 backdrop 动画是否从 Animated.Value 驱动而非 ref.transitionTo(避免旧框架兼容问题)
|
|
12
|
+
4. 检查组件卸载时是否清理所有 pendingRAF/pendingTimeout/stopAnimation
|
|
13
|
+
- **错误特征**: setAnimation 在 animationValue 未重置为 0 时调用;showContent 初始为 true;backdrop 使用 ref.transitionTo
|
|
14
|
+
- **正确特征**: 先 stopAnimation → setValue(0) → setAnimation → startAnimation;animationReady 控制渲染时机;backdrop 使用 Animated.Value 驱动
|
|
15
|
+
|
|
16
|
+
## 来源案例
|
|
17
|
+
|
|
18
|
+
| 编号 | 库 | 现象 | 案例文件 |
|
|
19
|
+
|------|-----|------|----------|
|
|
20
|
+
| KI-018 | react-native-modal | 弹窗先闪一下 | [KI-018-modal弹窗闪烁.md](../cases/KI-018-modal弹窗闪烁.md) |
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# R-15 状态持久化与重启逻辑一致性类
|
|
2
|
+
|
|
3
|
+
- **状态**: active
|
|
4
|
+
- **严重级别**: high(重启逻辑失效,核心功能不可用)
|
|
5
|
+
- **适用范围**: 含状态机/生命周期管理(installMode、restart、allow/disallow)的库
|
|
6
|
+
- 预筛特征: 代码中含 installMode/restartApp/allow/disallow 等方法;存在状态标志位(如 _allowed、_restartInProgress)
|
|
7
|
+
- **问题本质**: 状态标志位(如 installMode)在 restartApp 调用时未及时复位,导致条件判断失效——restartApp 中途被 allowRestart 覆盖 installMode 值,但后续判断仍依赖过期的 installMode 值
|
|
8
|
+
- **检查点**:
|
|
9
|
+
1. 列出所有持久化状态变量(installMode、_allowed、_restartInProgress),检查其生命周期
|
|
10
|
+
2. 检查 restartApp 流程中 installMode 使用后是否复位(如 ON_NEXT_RESTART 模式完成后 reset 为 -1)
|
|
11
|
+
3. 检查 allow/disallow 状态是否在 allow() 时同步设置 _allowed 标志
|
|
12
|
+
4. 检查 restartApp 是否有防重入保护(_restartInProgress 标志 + 排队机制)
|
|
13
|
+
- **错误特征**: restartApp 条件判断 `installMode === 0 || installMode === -1` 但 ON_NEXT_RESTART(1) 分支未复位 installMode;allow() 未设置 _allowed 标志
|
|
14
|
+
- **正确特征**: 每种 installMode 分支完成后复位 installMode;allow() 设置 _allowed = true 并处理排队请求;restart 有防重入 + 排队机制
|
|
15
|
+
|
|
16
|
+
## 来源案例
|
|
17
|
+
|
|
18
|
+
| 编号 | 库 | 现象 | 案例文件 |
|
|
19
|
+
|------|-----|------|----------|
|
|
20
|
+
| KI-019 | react-native-code-push | restartApp 在 ON_NEXT_RESTART 模式下失效 | [KI-019-code-push重启逻辑失效.md](../cases/KI-019-code-push重启逻辑失效.md) |
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# R-16 敏感信息日志泄露类
|
|
2
|
+
|
|
3
|
+
- **状态**: active
|
|
4
|
+
- **严重级别**: high(安全测试不通过,上架审核被拒)
|
|
5
|
+
- **适用范围**: 所有鸿蒙化库(任何含日志输出的代码)
|
|
6
|
+
- 预筛特征: 代码中使用 Logger.info/debug/error 或 console.log 打印变量内容
|
|
7
|
+
- **问题本质**: 日志中打印了敏感信息(MAC 地址、IP 地址、设备标识等),安全扫描不通过
|
|
8
|
+
- **检查点**:
|
|
9
|
+
1. 扫描所有 Logger.info/debug/error 调用,检查是否打印了网络连接数据(netConnection)、配置信息(config)等内容
|
|
10
|
+
2. 检查 JSON.stringify 的参数是否包含敏感字段
|
|
11
|
+
3. 检查是否有打印"仅用于调试"的日志未在发布前移除
|
|
12
|
+
- **错误特征**: `Logger.info('events,' + JSON.stringify(events))` 打印网络状态含 MAC/IP;`Logger.info('configure,' + JSON.stringify(config))` 打印配置
|
|
13
|
+
- **正确特征**: 日志仅打印非敏感的状态摘要(如 "connected" / "disconnected"),不打印原始数据;或使用条件编译仅在 DEBUG 模式打印
|
|
14
|
+
|
|
15
|
+
## 来源案例
|
|
16
|
+
|
|
17
|
+
| 编号 | 库 | 现象 | 案例文件 |
|
|
18
|
+
|------|-----|------|----------|
|
|
19
|
+
| KI-020 | react-native-netinfo | 打印 MAC 地址和 IP 地址 | [KI-020-netinfo敏感信息泄露.md](../cases/KI-020-netinfo敏感信息泄露.md) |
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# R-17 媒体资源生命周期与错误处理类
|
|
2
|
+
|
|
3
|
+
- **状态**: active
|
|
4
|
+
- **严重级别**: high(本地视频播放失败;文件描述符泄漏)
|
|
5
|
+
- **适用范围**: 涉及媒体播放(AVPlayer/Video)或文件描述符(fd)管理的库
|
|
6
|
+
- 预筛特征: 代码中使用 AVPlayer / media.AVFileDescriptor / fs.openSync / getRawFd;含 play/stop/reset 等生命周期方法
|
|
7
|
+
- **问题本质**: 视频播放器在切换源(switchVideo)时重复注册事件监听器导致状态机异常;本地 rawfile 视频通过 getRawFd 获取的 fd offset 不为 0,AVPlayer 不支持 offset!=0 的 fd;文件资源(rawfile fd/fs.File)未在切换源时及时关闭导致泄漏
|
|
8
|
+
- **检查点**:
|
|
9
|
+
1. 检查 switchVideo/changeSrc 是否重复调用 bindState 注册事件监听器
|
|
10
|
+
2. 检查本地视频源(asset://)是否拷贝到沙箱再用 file:// 播放,而非直接用 getRawFd 的 fd(offset 问题)
|
|
11
|
+
3. 检查文件资源关闭是否有 pendingClose 机制(旧 fd 在新源加载成功后再关闭)
|
|
12
|
+
4. 检查 url 参数有效性校验(空字符串/undefined 不设置源)
|
|
13
|
+
5. 检查 aboutToDisappear 中是否有 try-catch 保护 release/close 操作
|
|
14
|
+
- **错误特征**: switchVideo 中调用 bindState() 重复注册;asset:// 直接 getRawFd 返回 fd 设置 fdSrc;closeRawFd 无 pendingClose 机制
|
|
15
|
+
- **正确特征**: bindState 只在 init 时调用一次;asset:// 拷贝到沙箱临时目录后用 file:// URI;旧 fd 在新源 INITIALIZED 后关闭;url 有效性校验;aboutToDisappear 有 try-catch
|
|
16
|
+
|
|
17
|
+
## 来源案例
|
|
18
|
+
|
|
19
|
+
| 编号 | 库 | 现象 | 案例文件 |
|
|
20
|
+
|------|-----|------|----------|
|
|
21
|
+
| KI-021 | react-native-video | 播放本地视频异常 | [KI-021-video本地视频播放异常.md](../cases/KI-021-video本地视频播放异常.md) |
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# R-18 能力枚举/配置完整性类
|
|
2
|
+
|
|
3
|
+
- **状态**: active
|
|
4
|
+
- **严重级别**: medium(特定格式/能力无法使用)
|
|
5
|
+
- **适用范围**: 对外暴露格式/编码/模式枚举的库
|
|
6
|
+
- 预筛特征: JS/TS 代码中定义 AudioFormatType/VideoFormatType 等枚举;ArkTS 层有对应的格式映射
|
|
7
|
+
- **问题本质**: 鸿蒙侧枚举定义遗漏了上游社区支持的格式(如 AAC 编码),导致用户按上游文档配置时无法使用该格式——枚举与上游不对齐
|
|
8
|
+
- **检查点**:
|
|
9
|
+
1. 对比上游原库(iOS/Android)的类型定义,列出所有支持的格式枚举值
|
|
10
|
+
2. 逐项在鸿蒙侧枚举定义中确认是否存在对应值
|
|
11
|
+
3. 检查枚举值到鸿蒙系统 API 常量的映射是否完整
|
|
12
|
+
- **错误特征**: 上游支持 AAC 格式但鸿蒙侧 AudioFormatHarmonyType 枚举中无 AAC 值
|
|
13
|
+
- **正确特征**: 鸿蒙侧枚举值与上游完全对齐;新增枚举值后有对应的系统 API 映射
|
|
14
|
+
|
|
15
|
+
## 来源案例
|
|
16
|
+
|
|
17
|
+
| 编号 | 库 | 现象 | 案例文件 |
|
|
18
|
+
|------|-----|------|----------|
|
|
19
|
+
| KI-022 | react-native-audio-recorder-player | AAC 格式无法录制 | [KI-022-audio-recorder-player枚举缺失.md](../cases/KI-022-audio-recorder-player枚举缺失.md) |
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# R-19 图形渲染属性继承与重置类
|
|
2
|
+
|
|
3
|
+
- **状态**: active
|
|
4
|
+
- **严重级别**: medium(渐变/填充等渲染效果失效)
|
|
5
|
+
- **适用范围**: 使用图形渲染管线(SVG/Canvas)且支持属性继承的库
|
|
6
|
+
- 预筛特征: C++ 代码中含 Draw/InitStyle/InheritAttr 方法;attributes 结构含 gradient/fill/pattern 字段
|
|
7
|
+
- **问题本质**: 渲染属性重置逻辑在无 href 引用时也执行了 SetGradient(std::nullopt),错误清除了从父节点继承的渐变属性——子节点自身没有 href 引用时,渐变应由父节点继承,不应重置
|
|
8
|
+
- **检查点**:
|
|
9
|
+
1. 定位所有 SetGradient/SetPattern 等属性重置调用位置
|
|
10
|
+
2. 检查重置前是否判断了"当前节点是否有自身引用"(hasHref),而非无条件重置
|
|
11
|
+
3. 检查继承链:子节点无 href 时,属性是否从父节点正确继承
|
|
12
|
+
- **错误特征**: Draw 方法中无条件执行 `SetGradient(std::nullopt, false)` 清除所有渐变;无论 hasHref 真假都重置
|
|
13
|
+
- **正确特征**: 仅当 hasFillHref 为 true 时才重置 fill 渐变;仅当 hasStrokeHref 为 true 时才重置 stroke 渐变;无 href 时保留继承值
|
|
14
|
+
|
|
15
|
+
## 来源案例
|
|
16
|
+
|
|
17
|
+
| 编号 | 库 | 现象 | 案例文件 |
|
|
18
|
+
|------|-----|------|----------|
|
|
19
|
+
| KI-023 | react-native-svg | Text 组件渐变色失效 | [KI-023-svg渐变继承失效.md](../cases/KI-023-svg渐变继承失效.md) |
|