just_audio应用发布版播放列表加载失败求助(附代码)
排查方案
针对调试正常、发布构建报错的情况,按以下步骤排查:
1. 修复混淆规则
发布构建默认开启R8混淆,会破坏just_audio依赖的ExoPlayer及自身类结构,需在android/app/proguard-rules.pro中添加:
-keep class com.ryanheise.** { *; } -keep class com.google.android.exoplayer2.** { *; }
添加后重新打包测试。
2. 确认权限配置完整性
检查AndroidManifest.xml中是否包含所有必要权限:
<!-- 网络权限 --> <uses-permission android:name="android.permission.INTERNET"/> <!-- 后台播放唤醒权限 --> <uses-permission android:name="android.permission.WAKE_LOCK"/> <!-- 前台服务权限(just_audio_background需要) --> <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
同时确保没有遗漏just_audio_background要求的服务声明等其他配置。
3. 调整静态变量初始化逻辑
代码中_nextMediaId是静态变量,发布模式下编译优化可能导致其初始化异常,进而影响MediaItem的ID生成。建议将playlist的初始化移到_init方法内,避免静态初始化:
Future<void> _init() async { _player.errorStream.listen((e) { print('A stream error occurred: $e'); }); try { // 移到方法内初始化playlist final playlist = [ ClippingAudioSource( start: const Duration(seconds: 60), end: const Duration(seconds: 90), child: AudioSource.uri( Uri.parse("https://s3.amazonaws.com/scifri-episodes/scifri20181123-episode.mp3"), ), tag: MediaItem( id: '${_nextMediaId++}', album: "Science Friday", title: "A Salute To Head-Scratching Science (30 seconds)", artUri: Uri.parse("https://media.wnyc.org/i/1400/1400/l/80/1/ScienceFriday_WNYCStudios_1400.jpg"), ), ), ]; await _player.setAudioSources(playlist); setState(() { isLoading = false; }); } on PlayerException catch (e) { print("Error loading playlist: $e"); } }
同时可将_nextMediaId改为非静态变量,避免跨实例的异常。
4. 验证依赖版本兼容性
当前使用的just_audio 0.10.2和just_audio_background 0.0.1-beta.16版本可能存在兼容性问题,建议升级到更稳定的匹配版本:
- just_audio可升级至0.10.18
- just_audio_background可升级至0.0.1-beta.20
升级后重新测试发布构建。
5. 临时关闭编译优化排查
如果以上步骤无效,可临时关闭R8混淆和资源压缩,确认是否是编译优化导致:
修改android/app/build.gradle的release构建配置:
buildTypes { release { // 临时使用debug签名,方便测试 signingConfig signingConfigs.debug minifyEnabled false shrinkResources false } }
重新打包后如果正常,说明问题出在混淆或资源压缩规则上,再针对性调整。
内容的提问来源于stack exchange,提问作者sigjak
相关产品推荐
相关产品推荐

