harmonyos-best-practices-mcp 0.1.0
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 +121 -0
- package/data/docs/bpta-2in1-window-shape.md +296 -0
- package/data/docs/bpta-abckitts-implements-instrumentation.md +1279 -0
- package/data/docs/bpta-add-watermark.md +379 -0
- package/data/docs/bpta-ads-jump.md +67 -0
- package/data/docs/bpta-agent.md +472 -0
- package/data/docs/bpta-always-on-market-watch.md +703 -0
- package/data/docs/bpta-analysis-of-image-blurring.md +231 -0
- package/data/docs/bpta-analyze-memory-problem.md +17 -0
- package/data/docs/bpta-animation-frame.md +28 -0
- package/data/docs/bpta-antipeep-protection.md +291 -0
- package/data/docs/bpta-app-architecture-overview.md +25 -0
- package/data/docs/bpta-app-asset-protection-design.md +277 -0
- package/data/docs/bpta-app-code-ob.md +180 -0
- package/data/docs/bpta-app-concurrency-design.md +1189 -0
- package/data/docs/bpta-app-data-security.md +397 -0
- package/data/docs/bpta-app-icon-configuration.md +226 -0
- package/data/docs/bpta-app-privacy-protection.md +295 -0
- package/data/docs/bpta-application-aspect-programming-design.md +675 -0
- package/data/docs/bpta-application-cold-start-optimization.md +1397 -0
- package/data/docs/bpta-application-continue-progess.md +285 -0
- package/data/docs/bpta-application-gesture-share.md +468 -0
- package/data/docs/bpta-application-knock-file-share.md +263 -0
- package/data/docs/bpta-application-knock-video-share.md +552 -0
- package/data/docs/bpta-application-latency-optimization-cases.md +615 -0
- package/data/docs/bpta-application-power-analysis.md +15 -0
- package/data/docs/bpta-application-power-optimization.md +12 -0
- package/data/docs/bpta-application-power-test.md +52 -0
- package/data/docs/bpta-application-track-practice.md +595 -0
- package/data/docs/bpta-arkts-high-performance.md +464 -0
- package/data/docs/bpta-arkts-js-memory-analysis.md +111 -0
- package/data/docs/bpta-arkts-language.md +18 -0
- package/data/docs/bpta-arkweb-component-security.md +1134 -0
- package/data/docs/bpta-arkweb_rendering_framework.md +412 -0
- package/data/docs/bpta-aspect-implements-aop.md +505 -0
- package/data/docs/bpta-audio-and-video.md +30 -0
- package/data/docs/bpta-audio-cast.md +460 -0
- package/data/docs/bpta-audio-focus-management.md +862 -0
- package/data/docs/bpta-audio-in-ear-monitor.md +803 -0
- package/data/docs/bpta-audio-playback-series.md +16 -0
- package/data/docs/bpta-audio-record-base-on-audiocapturer.md +188 -0
- package/data/docs/bpta-audio-record-base-on-avrecorder-arkts.md +179 -0
- package/data/docs/bpta-audio-record-base-on-avrecorder.md +207 -0
- package/data/docs/bpta-audio-record-base-on-avscreencapture.md +165 -0
- package/data/docs/bpta-audio-record-base-on-ohaudio.md +162 -0
- package/data/docs/bpta-audio-record-overview.md +34 -0
- package/data/docs/bpta-audio-record.md +16 -0
- package/data/docs/bpta-audio-ripple-animation.md +198 -0
- package/data/docs/bpta-audio-video-synchronization.md +508 -0
- package/data/docs/bpta-audio-video.md +15 -0
- package/data/docs/bpta-automated-testing-frameworks.md +481 -0
- package/data/docs/bpta-avplayer-basic-control.md +533 -0
- package/data/docs/bpta-avplayer-embeded-network-video.md +486 -0
- package/data/docs/bpta-avplayer-embeded-short-video.md +512 -0
- package/data/docs/bpta-avplayer-long-video.md +907 -0
- package/data/docs/bpta-avplayer-short-video.md +158 -0
- package/data/docs/bpta-avplayer-video-practices.md +15 -0
- package/data/docs/bpta-avscreencapture-for-screen-recording.md +1121 -0
- package/data/docs/bpta-back-task-implement.md +317 -0
- package/data/docs/bpta-background-blur.md +316 -0
- package/data/docs/bpta-background-sensors-baned-analysis.md +93 -0
- package/data/docs/bpta-best-practices-long-list.md +891 -0
- package/data/docs/bpta-best-practices-overview.md +48 -0
- package/data/docs/bpta-bluetooth-low-energy.md +905 -0
- package/data/docs/bpta-buffer-mode-transcoding.md +728 -0
- package/data/docs/bpta-buffer-power-optimization.md +224 -0
- package/data/docs/bpta-camera-shot2see.md +368 -0
- package/data/docs/bpta-card-update-and-data-interaction.md +670 -0
- package/data/docs/bpta-carousel-graphic-works.md +379 -0
- package/data/docs/bpta-cell-phone.md +13 -0
- package/data/docs/bpta-click-to-click-response-optimization.md +264 -0
- package/data/docs/bpta-click-to-complete-delay-analysis.md +637 -0
- package/data/docs/bpta-collaboration-office.md +1178 -0
- package/data/docs/bpta-comment-reply-pop-up-window.md +523 -0
- package/data/docs/bpta-common-list-flows.md +688 -0
- package/data/docs/bpta-common-list-operations.md +828 -0
- package/data/docs/bpta-common-network-query.md +784 -0
- package/data/docs/bpta-comparative_practice_of_taskpool_and_worker.md +381 -0
- package/data/docs/bpta-compatible-scheme.md +11 -0
- package/data/docs/bpta-complex-type-pass.md +868 -0
- package/data/docs/bpta-component-nesting-optimization.md +421 -0
- package/data/docs/bpta-component-reuse-issue-diagnosis-and-analysis.md +637 -0
- package/data/docs/bpta-component-reuse.md +1258 -0
- package/data/docs/bpta-concurrency-capability.md +23 -0
- package/data/docs/bpta-concurrent-optimization.md +369 -0
- package/data/docs/bpta-content-creation.md +646 -0
- package/data/docs/bpta-continue-cast.md +702 -0
- package/data/docs/bpta-continue-data.md +335 -0
- package/data/docs/bpta-continue.md +1323 -0
- package/data/docs/bpta-control-rendering-range.md +29 -0
- package/data/docs/bpta-controlling-background-process-cpu.md +31 -0
- package/data/docs/bpta-crash-monitor-practice.md +116 -0
- package/data/docs/bpta-cross-domain-solutions-for-web-pages.md +308 -0
- package/data/docs/bpta-cross-end-migration.md +13 -0
- package/data/docs/bpta-cross-module-reference.md +406 -0
- package/data/docs/bpta-cross-platform-compatibility.md +321 -0
- package/data/docs/bpta-custom-camera-photo.md +454 -0
- package/data/docs/bpta-custom-camera-preview.md +1170 -0
- package/data/docs/bpta-custom-camera-video.md +322 -0
- package/data/docs/bpta-custom-font-settings.md +354 -0
- package/data/docs/bpta-custom-hvigor-plugin.md +159 -0
- package/data/docs/bpta-custom-keyboard.md +519 -0
- package/data/docs/bpta-customdialog-selection-and-development.md +406 -0
- package/data/docs/bpta-dark-mode-adaptation.md +321 -0
- package/data/docs/bpta-deal-stride-solution.md +261 -0
- package/data/docs/bpta-decrease_pakage_size.md +126 -0
- package/data/docs/bpta-delayed-trigger-operation.md +215 -0
- package/data/docs/bpta-desktop-shortcuts.md +180 -0
- package/data/docs/bpta-detection.md +12 -0
- package/data/docs/bpta-developing-high-performance-ui.md +19 -0
- package/data/docs/bpta-development-scenarios-for-tabs.md +934 -0
- package/data/docs/bpta-dialog-encapsulation.md +201 -0
- package/data/docs/bpta-dispose-highly-loaded-component-render.md +352 -0
- package/data/docs/bpta-distribute-drag-cast.md +60 -0
- package/data/docs/bpta-distributed-pasteboard-cast.md +88 -0
- package/data/docs/bpta-distributed-pasteboard.md +314 -0
- package/data/docs/bpta-drawing-capability-improve-performance.md +436 -0
- package/data/docs/bpta-dynamic-link-library.md +272 -0
- package/data/docs/bpta-easygo-parallel.md +402 -0
- package/data/docs/bpta-fair-use-animation.md +1693 -0
- package/data/docs/bpta-file-transmission-based-on-sfft.md +265 -0
- package/data/docs/bpta-file-upload-and-download-performance.md +484 -0
- package/data/docs/bpta-foldable-guide.md +205 -0
- package/data/docs/bpta-folded-hover.md +202 -0
- package/data/docs/bpta-form-kit.md +12 -0
- package/data/docs/bpta-frontend-invisible-animation-analysis.md +187 -0
- package/data/docs/bpta-full-scenario-collaborative-development.md +13 -0
- package/data/docs/bpta-fuzzy-scene-performance-optimization.md +256 -0
- package/data/docs/bpta-game-prelaunch-practice.md +175 -0
- package/data/docs/bpta-general-comments.md +17 -0
- package/data/docs/bpta-gestures-practice.md +619 -0
- package/data/docs/bpta-global-state-management-state-store.md +472 -0
- package/data/docs/bpta-gpu-acceleration-practices.md +11 -0
- package/data/docs/bpta-graphic-drawing-practices.md +13 -0
- package/data/docs/bpta-grid-based-on-scrollcomponents.md +1112 -0
- package/data/docs/bpta-grid-drag-swap.md +725 -0
- package/data/docs/bpta-hadss_dialoghub.md +786 -0
- package/data/docs/bpta-harmony-application-security.md +1253 -0
- package/data/docs/bpta-hdrtosdr.md +439 -0
- package/data/docs/bpta-hdrvivid.md +700 -0
- package/data/docs/bpta-high-cpu-load-analysis.md +113 -0
- package/data/docs/bpta-high-performance-json-parsing.md +263 -0
- package/data/docs/bpta-high-performance-protobuf-parsing.md +259 -0
- package/data/docs/bpta-hmos-live-stream-audio-call.md +140 -0
- package/data/docs/bpta-hmos-live-stream-solution.md +495 -0
- package/data/docs/bpta-hmrouter.md +659 -0
- package/data/docs/bpta-hopping.md +60 -0
- package/data/docs/bpta-hwc-self-rendering-layer-analysis.md +77 -0
- package/data/docs/bpta-image-processing-practices.md +13 -0
- package/data/docs/bpta-image-to-video-synthesis.md +459 -0
- package/data/docs/bpta-image-white-lump-solution.md +282 -0
- package/data/docs/bpta-image_get_and_save.md +120 -0
- package/data/docs/bpta-implement-timeline-based-on-canvas.md +493 -0
- package/data/docs/bpta-implementing-image-filters.md +406 -0
- package/data/docs/bpta-implementing-image-resizable.md +270 -0
- package/data/docs/bpta-improve-layout-performance.md +547 -0
- package/data/docs/bpta-improve-running-efficiency.md +187 -0
- package/data/docs/bpta-improve_grid_performance.md +268 -0
- package/data/docs/bpta-input-method-framework.md +12 -0
- package/data/docs/bpta-intent-recommend-practice.md +313 -0
- package/data/docs/bpta-js-leak-watcher.md +153 -0
- package/data/docs/bpta-kernel-memory-analysis.md +38 -0
- package/data/docs/bpta-keyboard-layout-adapt.md +725 -0
- package/data/docs/bpta-landscape-and-portrait-development.md +947 -0
- package/data/docs/bpta-layered-architecture-design.md +82 -0
- package/data/docs/bpta-lazyforeach-optimization.md +217 -0
- package/data/docs/bpta-link-between-apps-overview.md +99 -0
- package/data/docs/bpta-list-based-on-scrollcomponents.md +1643 -0
- package/data/docs/bpta-lite-wearable-guide.md +1899 -0
- package/data/docs/bpta-live-form-development-practice.md +544 -0
- package/data/docs/bpta-live-streaming-optimization.md +397 -0
- package/data/docs/bpta-local-file-and-data-multithreaded-io.md +367 -0
- package/data/docs/bpta-local-file.md +11 -0
- package/data/docs/bpta-lock-screen-immersive-live-window.md +473 -0
- package/data/docs/bpta-long-snapshot-practice.md +1046 -0
- package/data/docs/bpta-low-power-consumption-of-background-tasks.md +14 -0
- package/data/docs/bpta-low-power-consumption-of-foreground-tasks.md +14 -0
- package/data/docs/bpta-low-power-design-in-dark-mode.md +418 -0
- package/data/docs/bpta-ltpo-description.md +323 -0
- package/data/docs/bpta-maleoon-gpu-best-practices.md +1297 -0
- package/data/docs/bpta-malloc-dispatch-table.md +144 -0
- package/data/docs/bpta-managing-audio-input-devices.md +350 -0
- package/data/docs/bpta-managing-audio-output-devices.md +399 -0
- package/data/docs/bpta-mate-book-fold.md +229 -0
- package/data/docs/bpta-matetv-guide.md +223 -0
- package/data/docs/bpta-matext-guide.md +269 -0
- package/data/docs/bpta-memory-basic-knowledge.md +71 -0
- package/data/docs/bpta-memory-optimization.md +545 -0
- package/data/docs/bpta-modular-design.md +282 -0
- package/data/docs/bpta-multi-device-adaptive-layout.md +775 -0
- package/data/docs/bpta-multi-device-adaptive.md +11 -0
- package/data/docs/bpta-multi-device-camera.md +584 -0
- package/data/docs/bpta-multi-device-collaboration.md +19 -0
- package/data/docs/bpta-multi-device-component-layout.md +190 -0
- package/data/docs/bpta-multi-device-design-principles.md +26 -0
- package/data/docs/bpta-multi-device-function.md +99 -0
- package/data/docs/bpta-multi-device-hardware.md +12 -0
- package/data/docs/bpta-multi-device-ide.md +124 -0
- package/data/docs/bpta-multi-device-interaction.md +11 -0
- package/data/docs/bpta-multi-device-layout-overview.md +47 -0
- package/data/docs/bpta-multi-device-overview.md +340 -0
- package/data/docs/bpta-multi-device-page-layout.md +699 -0
- package/data/docs/bpta-multi-device-page.md +19 -0
- package/data/docs/bpta-multi-device-resource.md +122 -0
- package/data/docs/bpta-multi-device-responsive-layout.md +1274 -0
- package/data/docs/bpta-multi-device-responsive.md +14 -0
- package/data/docs/bpta-multi-device-screen-diff.md +197 -0
- package/data/docs/bpta-multi-device-screen-layout.md +834 -0
- package/data/docs/bpta-multi-device-start.md +376 -0
- package/data/docs/bpta-multi-device-ui-development.md +27 -0
- package/data/docs/bpta-multi-device-window-direction.md +1322 -0
- package/data/docs/bpta-multi-device-window-immersive.md +364 -0
- package/data/docs/bpta-multi-device-window-mode.md +1293 -0
- package/data/docs/bpta-multi-device-window.md +13 -0
- package/data/docs/bpta-multi-device.md +13 -0
- package/data/docs/bpta-multi-interaction.md +368 -0
- package/data/docs/bpta-multi-mobile-payment.md +282 -0
- package/data/docs/bpta-multi-music-app-overview.md +365 -0
- package/data/docs/bpta-multi-settings-application-page.md +163 -0
- package/data/docs/bpta-multi-tab-practice.md +750 -0
- package/data/docs/bpta-multi-target.md +490 -0
- package/data/docs/bpta-multi-window-practice.md +795 -0
- package/data/docs/bpta-multi_game.md +472 -0
- package/data/docs/bpta-music-card.md +1916 -0
- package/data/docs/bpta-music-playback-scenarios.md +120 -0
- package/data/docs/bpta-native-memory-analysis.md +101 -0
- package/data/docs/bpta-native-sub-main-comm.md +323 -0
- package/data/docs/bpta-navigation-scenarios.md +69 -0
- package/data/docs/bpta-network-ca-security.md +241 -0
- package/data/docs/bpta-network-reconnection.md +327 -0
- package/data/docs/bpta-network-resources.md +24 -0
- package/data/docs/bpta-news-reading.md +12 -0
- package/data/docs/bpta-news_homepage.md +449 -0
- package/data/docs/bpta-object-serialization-performance.md +12 -0
- package/data/docs/bpta-one-shot-to-the-end.md +932 -0
- package/data/docs/bpta-online-video-playback-lags-practice.md +298 -0
- package/data/docs/bpta-optimization-overview.md +227 -0
- package/data/docs/bpta-optimization-tool-practice.md +20 -0
- package/data/docs/bpta-package-structure.md +13 -0
- package/data/docs/bpta-pad-guide.md +268 -0
- package/data/docs/bpta-page-brightness-settings.md +256 -0
- package/data/docs/bpta-page-transition.md +583 -0
- package/data/docs/bpta-pc-guide.md +438 -0
- package/data/docs/bpta-pc.md +12 -0
- package/data/docs/bpta-perceived-smoothness.md +49 -0
- package/data/docs/bpta-performance-detection.md +160 -0
- package/data/docs/bpta-performance-guide-reading.md +50 -0
- package/data/docs/bpta-performance-mainthread-consumption-detection.md +11 -0
- package/data/docs/bpta-performance-optimization.md +23 -0
- package/data/docs/bpta-performance-runtime-detection.md +13 -0
- package/data/docs/bpta-performance-sliding-frame-drop-detection.md +19 -0
- package/data/docs/bpta-performance-startup-time-detection.md +13 -0
- package/data/docs/bpta-permission-application.md +318 -0
- package/data/docs/bpta-permission-timeout-analysis.md +51 -0
- package/data/docs/bpta-photo.md +15 -0
- package/data/docs/bpta-picture-preview.md +464 -0
- package/data/docs/bpta-picture.md +12 -0
- package/data/docs/bpta-playing-formatted-audio-based-avplayer-arkts.md +481 -0
- package/data/docs/bpta-playing-formatted-audio-based-avplayer-cpp.md +593 -0
- package/data/docs/bpta-playing-pcm-audio-based-audiorenderer.md +959 -0
- package/data/docs/bpta-playing-pcm-audio-based-ohaudio.md +599 -0
- package/data/docs/bpta-playing-short-audio-based-soundpool.md +182 -0
- package/data/docs/bpta-positioning.md +364 -0
- package/data/docs/bpta-power-basic-quality-test.md +35 -0
- package/data/docs/bpta-power-consumption-analysis.md +12 -0
- package/data/docs/bpta-power-consumption-develop-analysis.md +12 -0
- package/data/docs/bpta-power-consumption-experience.md +119 -0
- package/data/docs/bpta-power-consumption-runtime-analysis.md +15 -0
- package/data/docs/bpta-power_overview.md +26 -0
- package/data/docs/bpta-pptimized-component-drawing.md +27 -0
- package/data/docs/bpta-pre-connect.md +133 -0
- package/data/docs/bpta-preloading-resources.md +21 -0
- package/data/docs/bpta-program-framework.md +15 -0
- package/data/docs/bpta-properly-use-foreground-resources.md +22 -0
- package/data/docs/bpta-purax-guide.md +215 -0
- package/data/docs/bpta-quality-overview.md +79 -0
- package/data/docs/bpta-reader-page-flip.md +890 -0
- package/data/docs/bpta-reasonable-audio-playback-use.md +42 -0
- package/data/docs/bpta-reasonable-audio-use.md +163 -0
- package/data/docs/bpta-reasonable-bluetooth-use.md +52 -0
- package/data/docs/bpta-reasonable-gps-use.md +59 -0
- package/data/docs/bpta-reasonable-network-use.md +105 -0
- package/data/docs/bpta-reasonable-position-navigation-use.md +47 -0
- package/data/docs/bpta-reasonable-request-use.md +77 -0
- package/data/docs/bpta-reasonable-sensor-use.md +53 -0
- package/data/docs/bpta-reasonable-system-use.md +67 -0
- package/data/docs/bpta-recommended-use-of-device-id.md +79 -0
- package/data/docs/bpta-reduce-layout-nodes.md +30 -0
- package/data/docs/bpta-reduce-time-consuming.md +36 -0
- package/data/docs/bpta-redundancy-refresh-guide.md +409 -0
- package/data/docs/bpta-render-web-using-same-layer-render.md +601 -0
- package/data/docs/bpta-resource-and-storage-optimization.md +14 -0
- package/data/docs/bpta-retrieve-process-memory-info.md +49 -0
- package/data/docs/bpta-rich-text-display.md +475 -0
- package/data/docs/bpta-rich-text-editor.md +426 -0
- package/data/docs/bpta-risk-control-engine.md +146 -0
- package/data/docs/bpta-scenario-performance-optimization.md +17 -0
- package/data/docs/bpta-scenario-power-optimization.md +12 -0
- package/data/docs/bpta-scenario-stability-address-sanitizer.md +210 -0
- package/data/docs/bpta-scenario-stability-app-freeze.md +615 -0
- package/data/docs/bpta-scenario-stability-cppcrash.md +516 -0
- package/data/docs/bpta-scenario-stability-exception-exit.md +12 -0
- package/data/docs/bpta-scenario-stability-jscrash.md +922 -0
- package/data/docs/bpta-scenario-stability-leak.md +276 -0
- package/data/docs/bpta-scenario-stability.md +14 -0
- package/data/docs/bpta-screen-flicker-solution.md +480 -0
- package/data/docs/bpta-shared-bicycle.md +509 -0
- package/data/docs/bpta-short-video-base-adaptivevideo.md +403 -0
- package/data/docs/bpta-smart-reach.md +306 -0
- package/data/docs/bpta-smartwatch.md +755 -0
- package/data/docs/bpta-smartwatchnavigation.md +384 -0
- package/data/docs/bpta-smooth-application-design.md +225 -0
- package/data/docs/bpta-smooth-switching.md +294 -0
- package/data/docs/bpta-social-communications.md +11 -0
- package/data/docs/bpta-social-share.md +637 -0
- package/data/docs/bpta-solutions-to-special-issues.md +12 -0
- package/data/docs/bpta-sound-quality-switching.md +422 -0
- package/data/docs/bpta-spatiality-immersive.md +531 -0
- package/data/docs/bpta-special-text-recognition.md +137 -0
- package/data/docs/bpta-stability-address-illegal-way.md +190 -0
- package/data/docs/bpta-stability-address-sanitizer-catagory.md +212 -0
- package/data/docs/bpta-stability-address-sanitizer-faq.md +32 -0
- package/data/docs/bpta-stability-address-sanitizer-opt.md +170 -0
- package/data/docs/bpta-stability-address-sanitizer-overview.md +23 -0
- package/data/docs/bpta-stability-address-sanitizer-principle.md +179 -0
- package/data/docs/bpta-stability-analysis.md +17 -0
- package/data/docs/bpta-stability-app-analyzer.md +11 -0
- package/data/docs/bpta-stability-app-crash-cpp-way.md +200 -0
- package/data/docs/bpta-stability-app-crash-js-way.md +148 -0
- package/data/docs/bpta-stability-app-crash.md +13 -0
- package/data/docs/bpta-stability-app-freeze-ark-runtime.md +339 -0
- package/data/docs/bpta-stability-app-freeze-opt.md +80 -0
- package/data/docs/bpta-stability-app-freeze-way.md +410 -0
- package/data/docs/bpta-stability-app-freeze.md +12 -0
- package/data/docs/bpta-stability-app-killed-way.md +49 -0
- package/data/docs/bpta-stability-ark-detection.md +12 -0
- package/data/docs/bpta-stability-ark-exception-detection.md +38 -0
- package/data/docs/bpta-stability-ark-runtime-detection.md +134 -0
- package/data/docs/bpta-stability-asan-detection.md +450 -0
- package/data/docs/bpta-stability-coding-standard-api.md +2054 -0
- package/data/docs/bpta-stability-coding-standard-cpp.md +91 -0
- package/data/docs/bpta-stability-coding-standard-libuv.md +772 -0
- package/data/docs/bpta-stability-coding-standard-ndk-arkts.md +189 -0
- package/data/docs/bpta-stability-coding-standard-node.md +478 -0
- package/data/docs/bpta-stability-coding-standard.md +16 -0
- package/data/docs/bpta-stability-cpp-crash-opt.md +346 -0
- package/data/docs/bpta-stability-detection.md +14 -0
- package/data/docs/bpta-stability-deveco-testing.md +73 -0
- package/data/docs/bpta-stability-develop-detection.md +17 -0
- package/data/docs/bpta-stability-exception-exit-opt.md +12 -0
- package/data/docs/bpta-stability-fault-log.md +14 -0
- package/data/docs/bpta-stability-fault-type.md +31 -0
- package/data/docs/bpta-stability-file-handle-detection.md +96 -0
- package/data/docs/bpta-stability-gwpasan-detection.md +588 -0
- package/data/docs/bpta-stability-hwasan-detection.md +360 -0
- package/data/docs/bpta-stability-ide-static-detection.md +343 -0
- package/data/docs/bpta-stability-js-crash-opt.md +21 -0
- package/data/docs/bpta-stability-js-memleak-detection.md +214 -0
- package/data/docs/bpta-stability-leak-detection.md +15 -0
- package/data/docs/bpta-stability-leak-opt.md +251 -0
- package/data/docs/bpta-stability-leak-way.md +459 -0
- package/data/docs/bpta-stability-log-specs.md +31 -0
- package/data/docs/bpta-stability-log-standard-hilog.md +191 -0
- package/data/docs/bpta-stability-log-standard.md +11 -0
- package/data/docs/bpta-stability-memleak-detection-overview.md +109 -0
- package/data/docs/bpta-stability-native-memleak-detection.md +204 -0
- package/data/docs/bpta-stability-operate-apm.md +113 -0
- package/data/docs/bpta-stability-operate-app-event.md +320 -0
- package/data/docs/bpta-stability-operate-event.md +11 -0
- package/data/docs/bpta-stability-operate.md +15 -0
- package/data/docs/bpta-stability-opt.md +18 -0
- package/data/docs/bpta-stability-overview.md +17 -0
- package/data/docs/bpta-stability-ram-detection.md +17 -0
- package/data/docs/bpta-stability-runtime-address-sanitizer-detection.md +21 -0
- package/data/docs/bpta-stability-runtime-appkilled-detection.md +44 -0
- package/data/docs/bpta-stability-runtime-crash-detection.md +14 -0
- package/data/docs/bpta-stability-runtime-detection.md +14 -0
- package/data/docs/bpta-stability-runtime-exception-exit-detection.md +12 -0
- package/data/docs/bpta-stability-runtime-freeze-detection.md +21 -0
- package/data/docs/bpta-stability-runtime-leak-detection.md +31 -0
- package/data/docs/bpta-stability-testing.md +11 -0
- package/data/docs/bpta-stability-thread-detection.md +11 -0
- package/data/docs/bpta-stability-thread-leak-detection.md +35 -0
- package/data/docs/bpta-stability-tsan-detection.md +477 -0
- package/data/docs/bpta-stability-ubsan-detection.md +350 -0
- package/data/docs/bpta-startup-response-optimization.md +12 -0
- package/data/docs/bpta-state-refresh.md +48 -0
- package/data/docs/bpta-static-scenarios.md +63 -0
- package/data/docs/bpta-status-management.md +872 -0
- package/data/docs/bpta-surface-encoder.md +427 -0
- package/data/docs/bpta-swiper_high_performance_development_guide.md +357 -0
- package/data/docs/bpta-tablet-pc.md +11 -0
- package/data/docs/bpta-taskpool_usage_specifications_and_faqs.md +625 -0
- package/data/docs/bpta-text-expand-collapse.md +274 -0
- package/data/docs/bpta-texture-compression-improve-performance.md +336 -0
- package/data/docs/bpta-thread-priority-setting.md +233 -0
- package/data/docs/bpta-threads-serialization-timeout-analysis.md +169 -0
- package/data/docs/bpta-time-optimization-of-the-main-thread.md +1239 -0
- package/data/docs/bpta-travel-navigation.md +11 -0
- package/data/docs/bpta-tv.md +11 -0
- package/data/docs/bpta-ui-component-encapsulation.md +585 -0
- package/data/docs/bpta-ui-component-performance-optimization.md +597 -0
- package/data/docs/bpta-ui-dynamic-operations.md +618 -0
- package/data/docs/bpta-ui-skip-analysis.md +191 -0
- package/data/docs/bpta-unified-drag-and-drop.md +1189 -0
- package/data/docs/bpta-use-of-background-hardware-resources.md +16 -0
- package/data/docs/bpta-use-of-background-software-resources.md +14 -0
- package/data/docs/bpta-use-of-background-tasks.md +23 -0
- package/data/docs/bpta-utilize-hwc-efficiently.md +461 -0
- package/data/docs/bpta-vdeocast.md +558 -0
- package/data/docs/bpta-video-adaptation-based-web.md +462 -0
- package/data/docs/bpta-video-barrage.md +68 -0
- package/data/docs/bpta-video-codec.md +42 -0
- package/data/docs/bpta-video-component-long-video.md +659 -0
- package/data/docs/bpta-video-component-short-video.md +337 -0
- package/data/docs/bpta-video-layer.md +32 -0
- package/data/docs/bpta-video-practices.md +12 -0
- package/data/docs/bpta-video-render.md +1225 -0
- package/data/docs/bpta-video-rom.md +37 -0
- package/data/docs/bpta-video-thumbnail.md +179 -0
- package/data/docs/bpta-video-wifi.md +40 -0
- package/data/docs/bpta-vsync-power-optimization.md +116 -0
- package/data/docs/bpta-waterflow-based-on-scrollcomponents.md +989 -0
- package/data/docs/bpta-waterflow-operations.md +991 -0
- package/data/docs/bpta-waterflow-performance-optimization.md +191 -0
- package/data/docs/bpta-wavewheel-for-image-editor.md +421 -0
- package/data/docs/bpta-wear.md +12 -0
- package/data/docs/bpta-web-adaptation.md +451 -0
- package/data/docs/bpta-web-app-jump-and-pull-up.md +310 -0
- package/data/docs/bpta-web-click-response-delay-analysis.md +164 -0
- package/data/docs/bpta-web-completion-delay-analysis.md +209 -0
- package/data/docs/bpta-web-develop-optimization.md +2596 -0
- package/data/docs/bpta-web-development.md +15 -0
- package/data/docs/bpta-web-frame-rate-performance-analysis.md +252 -0
- package/data/docs/bpta-web-interceptor.md +724 -0
- package/data/docs/bpta-web-performance-optimization.md +11 -0
- package/data/docs/bpta-window-and-screen-management.md +12 -0
- package/data/docs/bpta-zhenlv.md +559 -0
- package/data/docs/changelog.md +1410 -0
- package/data/docs/low-power-consumption-suggestions.md +246 -0
- package/data/docs/multi-business-office.md +275 -0
- package/data/docs/multi-communication-app.md +240 -0
- package/data/docs/multi-community-app.md +257 -0
- package/data/docs/multi-convenient-life.md +501 -0
- package/data/docs/multi-financial-app.md +288 -0
- package/data/docs/multi-news-read.md +286 -0
- package/data/docs/multi-picture-app.md +219 -0
- package/data/docs/multi-shopping-price-comparison.md +254 -0
- package/data/docs/multi-short-video-app.md +315 -0
- package/data/docs/multi-ticket-class.md +458 -0
- package/data/docs/multi-travel-accommodation.md +361 -0
- package/data/docs/multi-travel-navigation.md +449 -0
- package/data/docs/multi-video-app.md +492 -0
- package/data/index.md +2886 -0
- package/dist/data.js +180 -0
- package/dist/index.js +203 -0
- package/dist/search.js +102 -0
- package/package.json +57 -0
- package/scripts/trim-code-extra.mjs +78 -0
- package/scripts/trim-code.mjs +106 -0
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
# 内存泄漏定制能力开放使用指导
|
|
2
|
+
|
|
3
|
+
> 来源: https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-malloc-dispatch-table
|
|
4
|
+
> 文档标识(fileName): bpta-malloc-dispatch-table
|
|
5
|
+
> 目录(catalogName): best-practices
|
|
6
|
+
> 语言: cn
|
|
7
|
+
> 更新时间: 2026-06-23 03:40:27
|
|
8
|
+
> 导航地址: /hmos/hmos-dp1
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
#### 概述
|
|
12
|
+
|
|
13
|
+
三方应用的内存泄漏问题往往难以定位,传统分析方式效率低下。为提升排查效率,HarmonyOS提供了MallocDispatchTable机制,支持开发者定制内存分配函数的Hook行为,灵活插入自定义监控逻辑,从而实现对内存分配行为的精准追踪与泄漏场景的主动捕获。通过这一能力,开发者可按需定制Hook策略,如记录调用栈、统计分配频次、设置阈值告警等,显著增强内存泄漏问题的定制化分析能力。
|
|
14
|
+
|
|
15
|
+
注:Hook是计算机编程中的一种钩子技术,它允许开发者拦截、修改或扩展函数的行为。通过使用钩子,开发者可以注入自定义代码,在特定事件发生时修改程序的行为。
|
|
16
|
+
|
|
17
|
+
本文将介绍以下内容:
|
|
18
|
+
|
|
19
|
+
- [MallocDispatchTable简介](#section192072233251)
|
|
20
|
+
- [MallocDispatchTable的Hook流程](#section18679163332511)
|
|
21
|
+
- [场景案例](#section1893852252419)
|
|
22
|
+
|
|
23
|
+
#### 实现原理
|
|
24
|
+
|
|
25
|
+
## MallocDispatchTable简介
|
|
26
|
+
|
|
27
|
+
MallocDispatchTable简称内存分配表,提供对HarmonyOS [libc标准库](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/musl)中的malloc、calloc、realloc、free等内存操作系列函数的Hook能力。此能力可用于跟踪应用的内存分配/释放信息,辅助内存泄漏问题快速定界定位。
|
|
28
|
+
|
|
29
|
+
注:内存基础知识参考文档:[内存基础知识](https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-memory-basic-knowledge#section085818715389)。
|
|
30
|
+
|
|
31
|
+
## MallocDispatchTable的Hook流程
|
|
32
|
+
|
|
33
|
+
如下图示例,开发者可使用自定义函数替换标准库函数,应用程序调用标准库函数时实际上执行的是自定义的函数。通过MallocDispatchTable里的函数指针,调用标准库函数时可以重定向到自定义的函数。MallocDispatchTable的主要功能在于将标准库函数的实现和自定义函数进行解耦。
|
|
34
|
+
|
|
35
|
+

|
|
36
|
+
|
|
37
|
+
开发人员可使用提供的[OH_HiDebug_SetMallocDispatchTable()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/capi-hidebug-h#oh_hidebug_setmallocdispatchtable)接口设置libc标准库中使用的MallocDispatchTable;使用[OH_HiDebug_GetDefaultMallocDispatchTable()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/capi-hidebug-h#oh_hidebug_getdefaultmallocdispatchtable)接口获取libc中默认的MallocDispatchTable。
|
|
38
|
+
|
|
39
|
+
#### 场景案例
|
|
40
|
+
|
|
41
|
+
## 场景描述
|
|
42
|
+
|
|
43
|
+
开发者观察到程序的匿名内存大小持续上涨,需要记录程序调用标准库的mmap和munmap函数的信息(包括分配内存大小、地址),从而统计使用mmap分配但未被释放(未记录到使用munmap释放对应内存地址)的内存大小。
|
|
44
|
+
|
|
45
|
+
## 开发步骤
|
|
46
|
+
|
|
47
|
+
1. **添加头文件依赖。**
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
#include "hidebug/hidebug.h"
|
|
51
|
+
#include "hidebug/hidebug_type.h"
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
开发首先需要引用MallocDispatchTable相关的头文件。
|
|
55
|
+
2. **创建自定义mmap和munmap方法。**
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
static void* MyMmap(void* addr, size_t len, int prot, int flags, int fd, off_t offset)
|
|
59
|
+
{
|
|
60
|
+
HiDebug_MallocDispatch* original = (HiDebug_MallocDispatch*)OH_HiDebug_GetDefaultMallocDispatchTable();
|
|
61
|
+
void* returnAddr = original->mmap(addr, len, prot, flags, fd, offset);
|
|
62
|
+
OH_LOG_INFO(LOG_APP, "test MyMmap with len:%{public}d and addr:%{public}p", len, returnAddr);
|
|
63
|
+
return returnAddr;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
static int MyMunmap(void* addr, size_t len)
|
|
67
|
+
{
|
|
68
|
+
HiDebug_MallocDispatch* original = (HiDebug_MallocDispatch*)OH_HiDebug_GetDefaultMallocDispatchTable();
|
|
69
|
+
OH_LOG_INFO(LOG_APP, "test MyMunmap with len:%{public}d and addr:%{public}p", len, addr);
|
|
70
|
+
return original->munmap(addr, len);
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
自定义的函数中将内存地址(函数参数addr)以及内存区间大小(函数参数len)通过日志打印。
|
|
75
|
+
3. **创建一个[HiDebug_MallocDispatch](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/capi-hidebug-hidebug-mallocdispatch)类型的分配表。**
|
|
76
|
+
|
|
77
|
+
```
|
|
78
|
+
//Obtain default MallocDispatchTable that can allocate memory directly.
|
|
79
|
+
HiDebug_MallocDispatch* original = (HiDebug_MallocDispatch*)OH_HiDebug_GetDefaultMallocDispatchTable();
|
|
80
|
+
//Create a MallocDispatchTable struct called current.
|
|
81
|
+
HiDebug_MallocDispatch* current = (HiDebug_MallocDispatch*)original->malloc(sizeof(HiDebug_MallocDispatch));
|
|
82
|
+
memset(current, 0, sizeof(HiDebug_MallocDispatch));
|
|
83
|
+
//replace function pointers of current, from which self-defined functions can be redirected.
|
|
84
|
+
current->mmap = MyMmap;
|
|
85
|
+
current->munmap = MyMunmap;
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
创建一个HiDebug_MallocDispatch结构体current,通过[OH_HiDebug_GetDefaultMallocDispatchTable()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/capi-hidebug-h#oh_hidebug_getdefaultmallocdispatchtable)分配其占用的堆内存。修改结构体中的函数指针,让其指向之前定义的MyMmap和MyMunmap函数。
|
|
89
|
+
4. **启用自定义 MallocDispatchTable。**
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
OH_HiDebug_SetMallocDispatchTable(current);
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
将[libc标准库](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/musl)中使用的MallocDispatchTable替换成自定义的分配表。
|
|
96
|
+
5. **调用libc标准库中的mmap函数。**
|
|
97
|
+
|
|
98
|
+
```
|
|
99
|
+
char* mapPtr = nullptr;
|
|
100
|
+
const size_t bufferSize = 100; // 100 : the size of memory
|
|
101
|
+
mapPtr = (char*)mmap(nullptr, bufferSize, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
|
|
102
|
+
if (mapPtr == MAP_FAILED) {
|
|
103
|
+
printf("mmap failed\n");
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
munmap(mapPtr, bufferSize);
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
在执行上述基础库mmap函数时,会自动重定向到先前定义的MyMmap函数,完成业务自定义功能。
|
|
110
|
+
6. **停用自定义 MallocDispatchTable。**
|
|
111
|
+
|
|
112
|
+
```
|
|
113
|
+
//release memory of self-defined MallocDispatchTable struct.
|
|
114
|
+
HiDebug_MallocDispatch* original = (HiDebug_MallocDispatch*)OH_HiDebug_GetDefaultMallocDispatchTable();
|
|
115
|
+
original->free(current);
|
|
116
|
+
//reset MallocDispatchTable strut that libc uses.
|
|
117
|
+
OH_HiDebug_RestoreMallocDispatchTable();
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
调用[OH_HiDebug_RestoreMallocDispatchTable()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/capi-hidebug-h#oh_hidebug_restoremallocdispatchtable)接口可以恢复标准库默认的MallocDispatchTable。
|
|
121
|
+
7. **CMakeLists.txt文件中添加如下依赖项。**
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
add_library(entry SHARED napi_init.cpp test_backtrace.cpp test_malloc_dispatch.cpp)
|
|
125
|
+
target_link_libraries(entry PUBLIC libace_napi.z.so libhilog_ndk.z.so libohhidebug.so)
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+

|
|
129
|
+
|
|
130
|
+
若应用程序设置了自定义的MallocDispatchTable,则与HarmonyOS提供的部分机制存在互斥,请在上述步骤4启用自定义MallocDispatchTable后注意。
|
|
131
|
+
|
|
132
|
+
具体限制如下:
|
|
133
|
+
|
|
134
|
+
1. 无法通过GWP-ASan功能进行内存越界检测。GWP-ASan 的工作原理详见文档:[GWP-ASan检测原理](https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-stability-address-sanitizer-principle#section555616291854)。
|
|
135
|
+
2. 无法通过使用[native hook插件](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/hiprofiler#native-hook插件)对该应用程序进行函数调用栈捕获。
|
|
136
|
+
|
|
137
|
+

|
|
138
|
+
|
|
139
|
+
1. 禁止在自定义方法中调用[libc标准库](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/musl)内存操作函数(malloc/free/mmap/munmap),否则会导致死循环。
|
|
140
|
+
2. 禁止在自定义malloc方法中使用[hilog](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/hilog)进行日志打印,否则会导致死锁问题。
|
|
141
|
+
|
|
142
|
+
#### 示例代码
|
|
143
|
+
|
|
144
|
+
- [性能分析工具](https://gitcode.com/HarmonyOS_Samples/guide-snippets/blob/master/PerformanceAnalysisKit/HiDebugTool/README_zh.md)
|
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
# 管理音频输入设备开发实践
|
|
2
|
+
|
|
3
|
+
> 来源: https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-managing-audio-input-devices
|
|
4
|
+
> 文档标识(fileName): bpta-managing-audio-input-devices
|
|
5
|
+
> 目录(catalogName): best-practices
|
|
6
|
+
> 语言: cn
|
|
7
|
+
> 更新时间: 2026-06-23 03:35:39
|
|
8
|
+
> 导航地址: /hmos/hmos-dp1
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
#### 概述
|
|
12
|
+
|
|
13
|
+
在录音、语音通话、录制语音消息等场景下,经常需要切换输入设备,例如从手机麦克风切换到蓝牙耳机。因此,开发者需要对系统的音频输入设备进行管理。开发者可使用以下模块实现音频输入设备的管理功能。
|
|
14
|
+
|
|
15
|
+
| **模块** | **应用场景** |
|
|
16
|
+
| --- | --- |
|
|
17
|
+
| [AudioRoutingManager](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-audio-audioroutingmanager) | 管理全局音频输入设备,提供系统输入设备查询及状态变化的监听接口 |
|
|
18
|
+
| [AudioSessionManager](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-audio-audiosessionmanager) | 管理应用音频输入设备,提供切换输入设备的API接口 |
|
|
19
|
+
| [AudioCapturer](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-audio-audiocapturer) | 管理音频流输入设备,提供音频流输入设备变化的监听接口 |
|
|
20
|
+
| [AVInputCastPicker](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ohos-multimedia-avinputcastpicker#avinputcastpicker) | 切换音频输入设备的系统组件,目前仅支持PC/2in1设备 |
|
|
21
|
+
|
|
22
|
+
本文基于上述模块提供的能力,指导开发者实现获取输入设备信息、切换输入设备、响应设备变更等场景,并提供开发过程中常见问题的解决方案。
|
|
23
|
+
|
|
24
|
+
#### 获取输入设备信息
|
|
25
|
+
|
|
26
|
+
## 场景描述
|
|
27
|
+
|
|
28
|
+
在开始录制音频之前,获取系统的输入设备信息并展示;当设备发生变化时,同步更新设备列表。例如,当蓝牙耳机上线时,将蓝牙耳机添加到设备列表中;当蓝牙耳机下线时,将蓝牙耳机从设备列表中移除。如下图所示:
|
|
29
|
+
|
|
30
|
+

|
|
31
|
+
|
|
32
|
+
## 实现原理
|
|
33
|
+
|
|
34
|
+
[AudioRoutingManager](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-audio-audioroutingmanager)提供管理全局音频输入设备的能力,包括查询设备信息、监听设备连接状态变化等。
|
|
35
|
+
|
|
36
|
+
## 开发步骤
|
|
37
|
+
|
|
38
|
+
1. 创建AudioRoutingManager实例。
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
private audioManager = audio.getAudioManager();
|
|
42
|
+
// ...
|
|
43
|
+
private audioRoutingManager: audio.AudioRoutingManager = this.audioManager.getRoutingManager();
|
|
44
|
+
```
|
|
45
|
+
2. 使用[AudioRoutingManager.getDevices(deviceFlag: DeviceFlag)](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-audio-audioroutingmanager#getdevices9-1)获取所有已连接的输入设备。设置deviceFlag参数为[INPUT_DEVICES_FLAG](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-audio-e#deviceflag)表示获取输入设备。
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
// Get all input devices and display them.
|
|
49
|
+
async getDevices(inputDeviceType: string) {
|
|
50
|
+
this.deviceType = inputDeviceType;
|
|
51
|
+
this.audioRoutingManager.getDevices(audio.DeviceFlag.INPUT_DEVICES_FLAG)
|
|
52
|
+
.then((audioDeviceDescriptors: audio.AudioDeviceDescriptors) => {
|
|
53
|
+
hilog.info(DOMAIN, 'testTag', '%{public}s',
|
|
54
|
+
`Succeeded in getting devices, AudioDeviceDescriptors: ${JSON.stringify(audioDeviceDescriptors)}.`);
|
|
55
|
+
this.getAvailableDevices();
|
|
56
|
+
this.watchDeviceChange(); // Get changes in the status of audio devices.
|
|
57
|
+
this.watchCurrentInputDeviceChanged(); // Monitor current input device change events.
|
|
58
|
+
let deviceUsage = this.deviceType === CommonConstants.MEDIA_EQUIPMENT ? audio.DeviceUsage.MEDIA_INPUT_DEVICES :
|
|
59
|
+
audio.DeviceUsage.CALL_INPUT_DEVICES;
|
|
60
|
+
this.watchSessionAvailableDeviceChange(deviceUsage); // Available device connection status change events.
|
|
61
|
+
this.watchRoutingAvailableDeviceChange(deviceUsage); // Available device connection status change events.
|
|
62
|
+
})
|
|
63
|
+
.catch((err: BusinessError) => {
|
|
64
|
+
hilog.error(DOMAIN, 'testTag', '%{public}s', `Failed to get devices. error: ${err.code}, ${err.message}`);
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
3. 使用[AudioRoutingManager.on('deviceChange')](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-audio-audioroutingmanager#ondevicechange9)监听输入设备连接状态的变化。
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
// Get changes in the status of audio devices.
|
|
72
|
+
watchDeviceChange() {
|
|
73
|
+
try {
|
|
74
|
+
this.audioRoutingManager.on('deviceChange', audio.DeviceFlag.INPUT_DEVICES_FLAG,
|
|
75
|
+
(deviceChanged: audio.DeviceChangeAction) => {
|
|
76
|
+
// The device connection status changes, with 0 indicating connection and 1 indicating disconnection.
|
|
77
|
+
if (deviceChanged.type === audio.DeviceChangeType.CONNECT) {
|
|
78
|
+
hilog.info(DOMAIN, 'testTag', '%{public}s',
|
|
79
|
+
'device connected : ' + deviceChanged.deviceDescriptors[0].displayName);
|
|
80
|
+
} else if (deviceChanged.type === audio.DeviceChangeType.DISCONNECT) {
|
|
81
|
+
hilog.info(DOMAIN, 'testTag', '%{public}s',
|
|
82
|
+
'device disconnected : ' + deviceChanged.deviceDescriptors[0].displayName);
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
} catch (err) {
|
|
86
|
+
let error = err as BusinessError;
|
|
87
|
+
hilog.error(DOMAIN, 'testTag', '%{public}s', `Failed to deviceChange. error: ${error.code}, ${error.message}`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
4. 使用[AudioRoutingManager.getAvailableDevices(deviceUsage: DeviceUsage)](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-audio-audioroutingmanager#getavailabledevices12)获取可用输入设备。通过[DeviceUsage](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-audio-e#deviceusage12)参数区分不同的使用场景,[MEDIA_INPUT_DEVICES](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-audio-e#deviceusage12)表示媒体输入设备,[CALL_INPUT_DEVICES](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-audio-e#deviceusage12)表示通话输入设备。
|
|
92
|
+
|
|
93
|
+
```
|
|
94
|
+
// Get the current list of available audio input devices.
|
|
95
|
+
getAvailableDevices() {
|
|
96
|
+
let data: audio.AudioDeviceDescriptors = [];
|
|
97
|
+
// Distinguish between media and calling devices.
|
|
98
|
+
let deviceUsage = this.deviceType === CommonConstants.MEDIA_EQUIPMENT ? audio.DeviceUsage.MEDIA_INPUT_DEVICES :
|
|
99
|
+
audio.DeviceUsage.CALL_INPUT_DEVICES;
|
|
100
|
+
try {
|
|
101
|
+
data = this.audioRoutingManager.getAvailableDevices(deviceUsage);
|
|
102
|
+
hilog.info(DOMAIN, 'testTag', '%{public}s',
|
|
103
|
+
`Succeeded in getting availableDevices: ${JSON.stringify(data)}.`);
|
|
104
|
+
AppStorage.setOrCreate(CommonConstants.AVAILABLE_DEVICES, data);
|
|
105
|
+
} catch (err) {
|
|
106
|
+
let error = err as BusinessError;
|
|
107
|
+
hilog.error(DOMAIN, 'testTag', '%{public}s',
|
|
108
|
+
`Failed to getAvailableDevices. error: ${error.code}, ${error.message}`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
5. 使用[AudioRoutingManager.on('availableDeviceChange')](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-audio-audioroutingmanager#onavailabledevicechange12)监听可用输入设备的变化,并在设备变化时更新设备列表。
|
|
113
|
+
|
|
114
|
+
```
|
|
115
|
+
// Available device connection status change events.
|
|
116
|
+
watchRoutingAvailableDeviceChange(deviceUsage: audio.DeviceUsage) {
|
|
117
|
+
let availableDeviceChangeCallback = (deviceChanged: audio.DeviceChangeAction) => {
|
|
118
|
+
let data: audio.AudioDeviceDescriptors = deviceChanged.deviceDescriptors;
|
|
119
|
+
hilog.info(DOMAIN, 'testTag', '%{public}s',
|
|
120
|
+
`Get available device audioRoutingManager ChangeCallback, AudioDeviceDescriptors: ${data}.` +
|
|
121
|
+
JSON.stringify(data));
|
|
122
|
+
this.getAvailableDevices(); // Update available devices.
|
|
123
|
+
};
|
|
124
|
+
try {
|
|
125
|
+
this.audioRoutingManager.on('availableDeviceChange', deviceUsage, availableDeviceChangeCallback);
|
|
126
|
+
} catch (err) {
|
|
127
|
+
let error = err as BusinessError;
|
|
128
|
+
hilog.error(DOMAIN, 'testTag', '%{public}s',
|
|
129
|
+
`Failed to availableDeviceChange. error: ${error.code}, ${error.message}`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
```
|
|
133
|
+
6. 使用[AudioRoutingManager.getPreferredInputDeviceForCapturerInfo()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-audio-audioroutingmanager#getpreferredinputdeviceforcapturerinfo10-1)获取录制使用的设备。通过[AudioCapturerInfo.source](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-audio-i#audiocapturerinfo8)参数区分不同的使用场景,例如SOURCE_TYPE_MIC表示普通录音,SOURCE_TYPE_VOICE_COMMUNICATION表示语音通话。
|
|
134
|
+
|
|
135
|
+
```
|
|
136
|
+
// Get default or preferred input device.
|
|
137
|
+
getPreferredInputDevice() {
|
|
138
|
+
this.audioRoutingManager.getPreferredInputDeviceForCapturerInfo(this.audioCapturerInfo,
|
|
139
|
+
(err: BusinessError, audioDeviceDescriptors: audio.AudioDeviceDescriptors) => {
|
|
140
|
+
if (err) {
|
|
141
|
+
hilog.error(DOMAIN, 'testTag', '%{public}s',
|
|
142
|
+
`Failed to get preferred input device for capturer info. Code: ${err.code}, message: ${err.message}`);
|
|
143
|
+
} else {
|
|
144
|
+
hilog.info(DOMAIN, 'testTag', '%{public}s',
|
|
145
|
+
`Succeeded in getting preferred input device for capturer info, AudioDeviceDescriptors: ${JSON.stringify(audioDeviceDescriptors)}.`);
|
|
146
|
+
if (audioDeviceDescriptors.length > 0) {
|
|
147
|
+
AppStorage.setOrCreate(CommonConstants.SELECTED_DEVICE_ID, audioDeviceDescriptors[0].id);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
```
|
|
153
|
+
7. 使用[AudioRoutingManager.on('preferredInputDeviceChangeForCapturerInfo')](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-audio-audioroutingmanager#onpreferredinputdevicechangeforcapturerinfo10)监听录制设备的变化,并在变化时弹框提示用户。
|
|
154
|
+
|
|
155
|
+
```
|
|
156
|
+
// Monitor the status changes of preferred input device.
|
|
157
|
+
watchPreferredInputDeviceChange() {
|
|
158
|
+
try {
|
|
159
|
+
this.audioRoutingManager.on('preferredInputDeviceChangeForCapturerInfo', this.audioCapturerInfo,
|
|
160
|
+
(audioDeviceDescriptors: audio.AudioDeviceDescriptors) => {
|
|
161
|
+
hilog.info(DOMAIN, 'testTag', '%{public}s',
|
|
162
|
+
`Succeeded in using on function, AudioDeviceDescriptors: ${JSON.stringify(audioDeviceDescriptors)}.`);
|
|
163
|
+
if (audioDeviceDescriptors.length > 0) {
|
|
164
|
+
AppStorage.setOrCreate(CommonConstants.SELECTED_DEVICE_ID, audioDeviceDescriptors[0].id);
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
} catch (err) {
|
|
168
|
+
let error = err as BusinessError;
|
|
169
|
+
hilog.error(DOMAIN, 'testTag', '%{public}s',
|
|
170
|
+
`Failed to preferredInputDeviceChangeForCapturerInfo. error: ${error.code}, ${error.message}`);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
#### 通过API切换输入设备
|
|
176
|
+
|
|
177
|
+
## 场景描述
|
|
178
|
+
|
|
179
|
+
音频流类型对输入设备的选择具有决定性影响,对于不同类型的音频流,系统会自动选择相应的输入设备。例如音频流类型是SOURCE_TYPE_MIC时,系统使用内置麦克风作为音频输入设备。如果默认的输入设备不符合使用需求,应用可以调用相关接口进行修改。
|
|
180
|
+
|
|
181
|
+

|
|
182
|
+
|
|
183
|
+
## 实现原理
|
|
184
|
+
|
|
185
|
+
使用[AudioSessionManager](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-audio-audiosessionmanager)管理音频输入设备。通过该组件,可默认将蓝牙设备设为音频输入源,同时支持动态切换不同的媒体输入设备。
|
|
186
|
+
|
|
187
|
+
整体流程如图:
|
|
188
|
+
|
|
189
|
+

|
|
190
|
+
|
|
191
|
+

|
|
192
|
+
|
|
193
|
+
在语音通话场景下,由于输入设备跟随当前输出设备,因此使用AudioSessionManager的API无法切换输入设备。
|
|
194
|
+
|
|
195
|
+
## 开发步骤
|
|
196
|
+
|
|
197
|
+
1. 创建AudioSessionManager实例。
|
|
198
|
+
|
|
199
|
+
```
|
|
200
|
+
private audioManager = audio.getAudioManager();
|
|
201
|
+
private audioSessionManager: audio.AudioSessionManager = this.audioManager.getSessionManager();
|
|
202
|
+
```
|
|
203
|
+
2. 使用[AudioSessionManager.setBluetoothAndNearlinkPreferredRecordCategory(category)](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-audio-audiosessionmanager#setbluetoothandnearlinkpreferredrecordcategory21)设置优先选择蓝牙设备作为输入设备,当蓝牙设备上线后,会自动切换到蓝牙设备进行录制。通过[category](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-audio-e#bluetoothandnearlinkpreferredrecordcategory21)参数设置蓝牙设备使用模式,当设置[PREFERRED_NONE](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-audio-e#bluetoothandnearlinkpreferredrecordcategory21)时,取消优先选择蓝牙设备。
|
|
204
|
+
|
|
205
|
+
```
|
|
206
|
+
// Set priority to select Bluetooth devices as input devices.
|
|
207
|
+
async setBluetooth(category: number) {
|
|
208
|
+
await this.audioSessionManager.setBluetoothAndNearlinkPreferredRecordCategory(category)
|
|
209
|
+
.then(() => {
|
|
210
|
+
hilog.info(DOMAIN, 'testTag', '%{public}s',
|
|
211
|
+
'Succeeded in doing setBluetoothAndNearlinkPreferredRecordCategory.' + category);
|
|
212
|
+
AppStorage.setOrCreate(CommonConstants.BLUETOOTH_AND_NEARLINK_PREFERRED, category);
|
|
213
|
+
})
|
|
214
|
+
.catch((err: BusinessError) => {
|
|
215
|
+
hilog.error(DOMAIN, 'testTag', '%{public}s',
|
|
216
|
+
`Failed to setBluetoothAndNearlinkPreferredRecordCategory. error: ${err.code}, ${err.message}`);
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
```
|
|
220
|
+
3. 使用[AudioSessionManager.selectMediaInputDevice()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-audio-audiosessionmanager#selectmediainputdevice21)将用户选择的设备设置为输入设备。
|
|
221
|
+
|
|
222
|
+
```
|
|
223
|
+
// Set input device.
|
|
224
|
+
async setInputDevice(data: audio.AudioDeviceDescriptor) {
|
|
225
|
+
this.audioSessionManager.selectMediaInputDevice(data).then(() => {
|
|
226
|
+
hilog.info(DOMAIN, 'testTag', '%{public}s', 'Succeeded in doing selectMediaInputDevice.');
|
|
227
|
+
this.getSelectedMediaInputDevice();
|
|
228
|
+
}).catch((err: BusinessError) => {
|
|
229
|
+
hilog.error(DOMAIN, 'testTag', '%{public}s',
|
|
230
|
+
`Failed to selectMediaInputDevice. error: ${err.code}, ${err.message}`);
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
```
|
|
234
|
+
4. 使用[AudioSessionManager.on('currentInputDeviceChanged')](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-audio-audiosessionmanager#oncurrentinputdevicechanged21)监听输入设备变化,当输入设备切换成功后会触发该回调。
|
|
235
|
+
|
|
236
|
+
```
|
|
237
|
+
// Monitor current input device change events.
|
|
238
|
+
watchCurrentInputDeviceChanged() {
|
|
239
|
+
hilog.info(DOMAIN, 'testTag', '%{public}s', 'currentInputDeviceChangedCallback');
|
|
240
|
+
let currentInputDeviceChangedCallback = (currentInputDeviceChangedEvent: audio.CurrentInputDeviceChangedEvent) => {
|
|
241
|
+
hilog.info(DOMAIN, 'testTag', '%{public}s',
|
|
242
|
+
`reason of currentInputDeviceChanged: ${currentInputDeviceChangedEvent.changeReason} `);
|
|
243
|
+
};
|
|
244
|
+
try {
|
|
245
|
+
this.audioSessionManager.on('currentInputDeviceChanged', currentInputDeviceChangedCallback);
|
|
246
|
+
hilog.info(DOMAIN, 'testTag', '%{public}s', 'currentInputDeviceChanged');
|
|
247
|
+
} catch (err) {
|
|
248
|
+
let error = err as BusinessError;
|
|
249
|
+
hilog.error(DOMAIN, 'testTag', '%{public}s',
|
|
250
|
+
`Failed to currentInputDeviceChangedCallback. error: ${error.code}, ${error.message}`);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
```
|
|
254
|
+
5. 使用[AudioSessionManager.getSelectedMediaInputDevice()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-audio-audiosessionmanager#getselectedmediainputdevice21)获取当前设置的输入设备。
|
|
255
|
+
|
|
256
|
+
```
|
|
257
|
+
// Get the currently selected input device.
|
|
258
|
+
getSelectedMediaInputDevice() {
|
|
259
|
+
try {
|
|
260
|
+
let device: audio.AudioDeviceDescriptor = this.audioSessionManager.getSelectedMediaInputDevice();
|
|
261
|
+
hilog.info(DOMAIN, 'testTag', '%{public}s',
|
|
262
|
+
'Succeeded in doing getSelectedMediaInputDevice.' + JSON.stringify(device) + ',' + device?.id);
|
|
263
|
+
AppStorage.setOrCreate(CommonConstants.SELECTED_DEVICE_ID, device.id);
|
|
264
|
+
} catch (err) {
|
|
265
|
+
let error = err as BusinessError;
|
|
266
|
+
hilog.error(DOMAIN, 'testTag', '%{public}s',
|
|
267
|
+
`Failed to getSelectedMediaInputDevice. error: ${error.code}, ${error.message}`);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
#### 通过系统组件切换输入设备
|
|
273
|
+
|
|
274
|
+
## 场景描述
|
|
275
|
+
|
|
276
|
+
在PC设备上,通过系统提供的录音设备选择组件[AVInputCastPicker](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ohos-multimedia-avinputcastpicker)切换音频输入设备。
|
|
277
|
+
|
|
278
|
+

|
|
279
|
+
|
|
280
|
+
## 实现原理
|
|
281
|
+
|
|
282
|
+
系统提供录音设备选择组件[AVInputCastPicker](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ohos-multimedia-avinputcastpicker),作为音频输入设备发现与连接的统一入口。点击组件图标将弹出可选设备列表,从列表中选择设备后,即可切换至相应设备。
|
|
283
|
+
|
|
284
|
+
## 开发步骤
|
|
285
|
+
|
|
286
|
+
1. 在需要切换设备的界面创建AVInputCastPicker组件。
|
|
287
|
+
|
|
288
|
+
```
|
|
289
|
+
@Builder
|
|
290
|
+
customPickerBuilder() {
|
|
291
|
+
Image($r('app.media.devices'))
|
|
292
|
+
.width('100%')
|
|
293
|
+
.height('100%')
|
|
294
|
+
}
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
```
|
|
298
|
+
AVInputCastPicker({
|
|
299
|
+
customPicker: () => this.customPickerBuilder(),
|
|
300
|
+
onStateChange: this.onStateChange
|
|
301
|
+
})
|
|
302
|
+
```
|
|
303
|
+
2. 手动点击AVInputCastPicker组件,并在弹框中选择目标设备,即可切换输入设备。
|
|
304
|
+
|
|
305
|
+
#### 响应音频流输入设备变更
|
|
306
|
+
|
|
307
|
+
## 场景描述
|
|
308
|
+
|
|
309
|
+
当系统因音频输入设备上下线、用户主动切换设备、设备抢占或设备选择策略变更等导致音频流输入设备变更时,应用可以根据需要做出对应的处理。
|
|
310
|
+
|
|
311
|
+

|
|
312
|
+
|
|
313
|
+
## 实现原理
|
|
314
|
+
|
|
315
|
+
[AudioCapturer.on('inputDeviceChange')](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-audio-audiocapturer#oninputdevicechange11)可以监听音频流输入设备变化并返回切换后的设备信息。应用可以根据切换后的新设备做对应的处理。
|
|
316
|
+
|
|
317
|
+
## 开发步骤
|
|
318
|
+
|
|
319
|
+
使用[AudioCapturer.on('inputDeviceChange')](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-audio-audiocapturer#oninputdevicechange11)监听到音频流输入设备变化时,显示新设备信息。
|
|
320
|
+
|
|
321
|
+
```
|
|
322
|
+
// Monitor the status changes of input device.
|
|
323
|
+
watchInputDeviceChange() {
|
|
324
|
+
try {
|
|
325
|
+
// Use the inputDeviceChange method of audioCapturer to listen for changes in input devices.
|
|
326
|
+
this.audioCapturer?.on('inputDeviceChange', (deviceChangeInfo: audio.AudioDeviceDescriptors) => {
|
|
327
|
+
hilog.info(DOMAIN, 'testTag', '%{public}s', `inputDevice id: ${deviceChangeInfo[0].id}`);
|
|
328
|
+
if (deviceChangeInfo.length > 0) {
|
|
329
|
+
AppStorage.setOrCreate(CommonConstants.SELECTED_DEVICE_ID, deviceChangeInfo[0].id);
|
|
330
|
+
}
|
|
331
|
+
});
|
|
332
|
+
} catch (err) {
|
|
333
|
+
// ...
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
#### 常见问题
|
|
339
|
+
|
|
340
|
+
## 确定麦克风是否能够进行录制,判断麦克风是否处于被占用的状态
|
|
341
|
+
|
|
342
|
+
**解决方案**
|
|
343
|
+
|
|
344
|
+
API20提供了[AudioStreamManager.isRecordingAvailable(capturerInfo: AudioCapturerInfo)](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-audio-audiostreammanager#isrecordingavailable20)接口,设置AudioCapturerInfo.source为Audio.SourceType.SOURCE_TYPE_MIC,然后根据返回值判断麦克风状态。如果返回true,表明可以使用麦克风进行录制;如果返回false,表明麦克风可能已被占用。
|
|
345
|
+
|
|
346
|
+
API20之前,可以初始化一个AudioCapturer对象并开始录音,如果成功,说明可以使用麦克风进行录制;如果失败,表明麦克风可能已被占用。
|
|
347
|
+
|
|
348
|
+
#### 示例代码
|
|
349
|
+
|
|
350
|
+
- [实现音频输入设备管理功能](https://gitcode.com/HarmonyOS_Samples/managing-audio-input-devices)
|