From 4960d068eaf4984cb86448689a8c2fcad689fdaa Mon Sep 17 00:00:00 2001 From: huang-jianfei200 Date: Sat, 23 Aug 2025 14:16:43 +0000 Subject: [PATCH] Save bundle name Signed-off-by: huang-jianfei200 Change-Id: I7649c405a3276c2d905fac1799041aa49631e66b --- .../include/audio_interrupt_info.h | 3 + .../include/audio_interrupt_service.h | 1 + .../interrupt/src/audio_interrupt_service.cpp | 22 ++++-- .../src/audio_interrupt_unit_test.cpp | 70 +++++++++++++++++++ 4 files changed, 92 insertions(+), 4 deletions(-) diff --git a/interfaces/inner_api/native/audiocommon/include/audio_interrupt_info.h b/interfaces/inner_api/native/audiocommon/include/audio_interrupt_info.h index 62a75dc9e7..7cb2e8ab26 100644 --- a/interfaces/inner_api/native/audiocommon/include/audio_interrupt_info.h +++ b/interfaces/inner_api/native/audiocommon/include/audio_interrupt_info.h @@ -298,6 +298,7 @@ public: int32_t pid { -1 }; int32_t uid { -1 }; std::string deviceTag; + mutable std::string bundleName; InterruptMode mode { SHARE_MODE }; bool isAudioSessionInterrupt {false}; AudioFocusConcurrency currencySources; @@ -344,6 +345,7 @@ public: res = res && parcel.WriteInt32(interrupt.pid); res = res && parcel.WriteInt32(interrupt.uid); res = res && parcel.WriteString(interrupt.deviceTag); + res = res && parcel.WriteString(interrupt.bundleName); res = res && parcel.WriteInt32(static_cast(interrupt.mode)); res = res && parcel.WriteBool(interrupt.isAudioSessionInterrupt); size_t vct = interrupt.currencySources.sourcesTypes.size(); @@ -370,6 +372,7 @@ public: interrupt.pid = parcel.ReadInt32(); interrupt.uid = parcel.ReadInt32(); interrupt.deviceTag = parcel.ReadString(); + interrupt.bundleName = parcel.ReadString(); interrupt.mode = static_cast(parcel.ReadInt32()); interrupt.isAudioSessionInterrupt = parcel.ReadBool(); int32_t vct = parcel.ReadInt32(); diff --git a/services/audio_policy/server/domain/interrupt/include/audio_interrupt_service.h b/services/audio_policy/server/domain/interrupt/include/audio_interrupt_service.h index 66bab7e59a..2caeef5554 100644 --- a/services/audio_policy/server/domain/interrupt/include/audio_interrupt_service.h +++ b/services/audio_policy/server/domain/interrupt/include/audio_interrupt_service.h @@ -189,6 +189,7 @@ private: int32_t NotifyFocusAbandoned(const int32_t clientId, const AudioInterrupt &audioInterrupt); int32_t AbandonAudioFocusInternal(const int32_t clientId, const AudioInterrupt &audioInterrupt); + void HandleBundleName(const AudioInterrupt &audioInterrupt); // modern interrupt interfaces int32_t ActivateAudioInterruptInternal(const int32_t zoneId, const AudioInterrupt &audioInterrupt, const bool isUpdatedAudioStrategy, bool &updateScene); diff --git a/services/audio_policy/server/domain/interrupt/src/audio_interrupt_service.cpp b/services/audio_policy/server/domain/interrupt/src/audio_interrupt_service.cpp index 5b8696e2c3..5285e41040 100644 --- a/services/audio_policy/server/domain/interrupt/src/audio_interrupt_service.cpp +++ b/services/audio_policy/server/domain/interrupt/src/audio_interrupt_service.cpp @@ -39,6 +39,7 @@ namespace OHOS { namespace AudioStandard { constexpr uint32_t MEDIA_SA_UID = 1013; +constexpr int32_t BOOTUP_MUSIC_UID = 1003; constexpr uint32_t THP_EXTRA_SA_UID = 5000; static const int32_t INTERRUPT_SERVICE_TIMEOUT = 10; // 10s static sptr g_adProxy = nullptr; @@ -875,6 +876,19 @@ void AudioInterruptService::HandleAppStreamType(const int32_t zoneId, AudioInter } } +void AudioInterruptService::HandleBundleName(const AudioInterrupt &audioInterrupt) +{ + uint32_t uid = static_cast(audioInterrupt.uid); + if (uid == BOOTUP_MUSIC_UID) { + // boot animation must be system app, no need query from BMS, to redeuce boot latency. + AUDIO_INFO_LOG("boot animation must be system app, no need query from BMS."); + return; + } + if (audioInterrupt.bundleName.empty()) { + audioInterrupt.bundleName = GetRealBundleName(uid); + } +} + int32_t AudioInterruptService::ActivateAudioInterrupt( const int32_t zoneId, const AudioInterrupt &audioInterrupt, const bool isUpdatedAudioStrategy) { @@ -883,6 +897,7 @@ int32_t AudioInterruptService::ActivateAudioInterrupt( AUDIO_ERR_LOG("ActivateAudioInterrupt timeout"); }, nullptr, AUDIO_XCOLLIE_FLAG_LOG | AUDIO_XCOLLIE_FLAG_RECOVERY); std::unique_lock lock(mutex_); + HandleBundleName(audioInterrupt); bool updateScene = false; int32_t ret = ActivateAudioInterruptCoreProcedure(zoneId, audioInterrupt, isUpdatedAudioStrategy, updateScene); if (ret != SUCCESS || !updateScene) { @@ -957,7 +972,7 @@ int32_t AudioInterruptService::ActivateAudioInterruptInternal(const int32_t zone void AudioInterruptService::PrintLogsOfFocusStrategyBaseMusic(const AudioInterrupt &audioInterrupt) { // The log printed by this function is critical, so please do not modify it. - std::string bundleName = (AudioBundleManager::GetBundleInfoFromUid(audioInterrupt.uid)).name; + std::string bundleName = audioInterrupt.bundleName; AudioFocusType audioFocusType; audioFocusType.streamType = AudioStreamType::STREAM_MUSIC; @@ -1651,8 +1666,7 @@ void AudioInterruptService::ProcessActiveInterrupt(const int32_t zoneId, const A ++iterActive; } uint8_t appstate = GetAppState(currentInterrupt.pid); - auto info = AudioBundleManager::GetBundleInfoFromUid(currentInterrupt.uid); - dfxBuilder.WriteEffectMsg(appstate, info.name, currentInterrupt, interruptEvent.hintType); + dfxBuilder.WriteEffectMsg(appstate, currentInterrupt.bundleName, currentInterrupt, interruptEvent.hintType); SendActiveInterruptEvent(activeStreamId, interruptEvent, incomingInterrupt, currentInterrupt); } @@ -1845,7 +1859,7 @@ void AudioInterruptService::UpdateAudioFocusStrategy(const AudioInterrupt &curre int32_t incomingPid = incomingInterrupt.pid; AudioFocusType incomingAudioFocusType = incomingInterrupt.audioFocusType; AudioFocusType existAudioFocusType = currentInterrupt.audioFocusType; - std::string bundleName = GetRealBundleName(static_cast(uid)); + std::string bundleName = incomingInterrupt.bundleName; CHECK_AND_RETURN_LOG(!bundleName.empty(), "bundleName is empty"); AudioStreamType existStreamType = existAudioFocusType.streamType; AudioStreamType incomingStreamType = incomingAudioFocusType.streamType; diff --git a/services/audio_policy/test/unittest/audio_interrupt_service_test/src/audio_interrupt_unit_test.cpp b/services/audio_policy/test/unittest/audio_interrupt_service_test/src/audio_interrupt_unit_test.cpp index 59182ce32c..9602042d8c 100644 --- a/services/audio_policy/test/unittest/audio_interrupt_service_test/src/audio_interrupt_unit_test.cpp +++ b/services/audio_policy/test/unittest/audio_interrupt_service_test/src/audio_interrupt_unit_test.cpp @@ -3644,6 +3644,76 @@ HWTEST(AudioInterruptUnitTest, AudioInterruptService_119, TestSize.Level1) EXPECT_EQ(ret1, SUCCESS); } +/** + * @tc.name : Test AudioInterruptService + * @tc.number: AudioInterruptService_120 + * @tc.desc : Test HandleBundleName_01 + */ +HWTEST(AudioInterruptUnitTest, AudioInterruptService_120, TestSize.Level1) +{ + auto audioInterruptService = std::make_shared(); + ASSERT_NE(audioInterruptService, nullptr); + + AudioInterrupt audioInterrupt = {}; + audioInterrupt.uid = 111; + audioInterrupt.bundleName.clear(); + audioInterruptService->HandleBundleName(audioInterrupt); + EXPECT_TRUE(audioInterrupt.bundleName.empty()); +} + +/** + * @tc.name : Test AudioInterruptService + * @tc.number: AudioInterruptService_121 + * @tc.desc : Test HandleBundleName_02 + */ +HWTEST(AudioInterruptUnitTest, AudioInterruptService_121, TestSize.Level1) +{ + auto audioInterruptService = std::make_shared(); + ASSERT_NE(audioInterruptService, nullptr); + + AudioInterrupt audioInterrupt = {}; + audioInterrupt.uid = 111; + std::string str = "xyz"; + audioInterrupt.bundleName = str; + audioInterruptService->HandleBundleName(audioInterrupt); + EXPECT_TRUE(audioInterrupt.bundleName.compare(str) == 0); +} + +/** + * @tc.name : Test AudioInterruptService + * @tc.number: AudioInterruptService_122 + * @tc.desc : Test HandleBundleName_03 + */ +HWTEST(AudioInterruptUnitTest, AudioInterruptService_122, TestSize.Level1) +{ + auto audioInterruptService = std::make_shared(); + ASSERT_NE(audioInterruptService, nullptr); + + AudioInterrupt audioInterrupt = {}; + audioInterrupt.uid = 1003; + audioInterrupt.bundleName.clear(); + audioInterruptService->HandleBundleName(audioInterrupt); + EXPECT_TRUE(audioInterrupt.bundleName.empty()); +} + +/** + * @tc.name : Test AudioInterruptService + * @tc.number: AudioInterruptService_123 + * @tc.desc : Test HandleBundleName_04 + */ +HWTEST(AudioInterruptUnitTest, AudioInterruptService_123, TestSize.Level1) +{ + auto audioInterruptService = std::make_shared(); + ASSERT_NE(audioInterruptService, nullptr); + + AudioInterrupt audioInterrupt = {}; + audioInterrupt.uid = 1003; + std::string str = "xyz"; + audioInterrupt.bundleName = str; + audioInterruptService->HandleBundleName(audioInterrupt); + EXPECT_TRUE(audioInterrupt.bundleName.compare(str) == 0); +} + /** * @tc.name : Test RegisterDefaultVolumeTypeListener * @tc.number: RegisterDefaultVolumeTypeListenerTest -- Gitee