音频后台播放应用突然正常退出问题定位

使用音频播放接口播放音频,在create AVsession 和startBackgroundRunning前提下应用切入后运行,10s左右后,应用被杀死,无crash日志。

HarmonyOS
2024-06-13 23:38:21
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
jshyb

使用工具

hdc shell

定位过程

1、后台播放应用闪退,且无crash 等日志,复现问题添加日志进行分析。render callback 正在回调的时候停止,音频还未播放完,应用就exit code 0,无异常退出。

2、前台播放无问题,后台播放应用闪退,怀疑与后台播放有关。后台播放需要有AVSession 和长时任务,分析长时任务代码,并断点调试,未发现问题。

3、长时任务存在限制条件,如果创建了长时任务,但是5s 内未检查到对应的长时任务的发生,系统就会释放长时任务。

场景1:若应用申请了长时任务,但未真正执行申请类型的长时任务或申请类型的任务已结束,系统会对应用进行管控。例如系统检测到应用申请了AUDIO_PLAYBACK(音频播放),但实际未播放音乐,系统则会终止对应的进程

4、Demo 实例代码如下。音频录制后完成后,立即创建了avsession 和 startBackgroundRunning,后面播放是用户行为,可能会发生在音频录制完成后5s,这样系统就释放了长时任务。

5、修改代码,去掉长时任务,播放音频后切后台,12s后,应用会被kill 掉。实际验证与约束结果一致。

6、修改代码,在播放前 create AVsession 和startBackgroundRunning,后台任务播放正常。

7、修改后,依然存在切后台10s内应用被kill 的现象。问题场景是在JS 主线程 创建的长时任务,在子线程调用的render 相关接口。长时任务是应用级别,与多进程无关。

8、使用研发排查手段:使用cmd 进入hdc shell,执行命令ℎ��������������−��1910−��"−−������������������"hidumper−s1910−a"−−detection" 和ℎ��������������−��1903−��"−��−−������"hidumper−s1903−a"−C−−all",59版本不支持该命令。

# hidumper -s 1910 -a "--detection" 
 
-------------------------------[ability]------------------------------- 
 
 
  ----------------------------------SuspendManager--------------------------------- 
  { 
    "audioPlayer": { 
      "AVSessionInfos": [ 
        { 
          "pid": 15236, 
          "sessionId": "E91B9F43129D80910BA4C6861AA4196855DB97191EB295F5D1894EA0B068B6AB", 
          "uid": 20020134         // av的uid与render 的uid一致, 
        } 
      ], 
      "audioRenderInfos": [ 
        { 
          "sessionId": 100291, 
          "streamType": 1, 
          "uid": 20020134 
        } 
      ] 
    }, 
    "audioRecorder": [], 
    "bluetooth": { 
      "ble switch": false, 
      "bredr switch": false, 
      "devicePairRecords": [], 
      "gattAppRegisterInfos": [], 
      "gattConnectRecords": [], 
      "sppConnectRecords": [] 
    }, 
    "commonTask": { 
      "audioPlay": [], 
      "audioRecord": [], 
      "bluetooth": [], 
      "location": [], 
      "multiDevice": [] 
    }, 
    "disSchedule": { 
      "calleeRecords": [], 
      "callerRecords": [] 
    }, 
    "location": { 
      "location switch": true, 
      "locationRecords": [] 
    } 
  } 
# 
# hidumper -s 1903  -a "-C --all" 
 
-------------------------------[ability]------------------------------- 
 
 
  ----------------------------------BackgroundTaskManager--------------------------------- 
  No.1    continuousTaskKey: 20020134_EntryAbility 
continuousTaskValue: 
  bundleName: com.samples.audio 
abilityName: EntryAbility 
isFromWebview: false 
isFromNewApi: true 
backgroundMode: audioPlayback 
uid: 20020134   // 长时任务的UID 
userId: 100 
pid: 15236 
notificationLabel: 
  wantAgentBundleName: com.samples.audio 
wantAgentAbilityName: com.samples.audio.EntryAbility 
 
#

9、升级版本到66后,后台播放正常,hdc 命令显示长时任务运行正常。

根因总结

1、长时任务限制:长时任务启动后会在5s内持续检查是否有音频播放,如果未检测到音频播放,系统会在切后台后10s左右对应用进行管控,将APP kill掉,日志会显示APP exit 02、59版本长时任务可能存在bug,66版本正常且可以用命令查看后台长时任务。

解决方案

在开启长时任务时需要保证音频播放在开始长时任务前或者是音频播放5s内。

分享
微博
QQ
微信
回复
2024-06-14 22:49:13
相关问题
FormExtensionAbility进程自动退出问题
1001浏览 • 0回复 待解决
OH _Audio播放音频问题
485浏览 • 1回复 待解决
SoundPool实现音频播放功能
544浏览 • 1回复 待解决
AudioCapturer录音+AudioRenderer播放音频
593浏览 • 1回复 待解决
应用性能问题定位和优化指导
1055浏览 • 1回复 待解决
AVplayer开发音频播放功能
441浏览 • 1回复 待解决
鸿蒙 如何使用 player 播放网络音频
5869浏览 • 1回复 已解决
使用AudioRenderer开发音频播放功能
424浏览 • 1回复 待解决
音频播放长时任务不生效
441浏览 • 1回复 待解决
AVPlayer实现音频播放(c++侧)
339浏览 • 1回复 待解决
怎么使用player播放网络音频呢?
2126浏览 • 1回复 待解决
使用AudioRenderer播放pcm音频流失败
495浏览 • 1回复 待解决
xampp的mysql出问题怎么处理?
1325浏览 • 1回复 待解决
鸿蒙-如何实现播放一段音频
9617浏览 • 2回复 待解决
SoundPool播放音频是否支持WMV格式
663浏览 • 1回复 待解决
后台播放声音会直接无声
455浏览 • 1回复 待解决
求大佬告知如何后台播放音乐
773浏览 • 1回复 待解决
ets开发应用怎么退出当前应用
2240浏览 • 1回复 待解决
鸿蒙Dev远程真机能否播放音频
3931浏览 • 1回复 待解决