
Android应用以AAB格式发布时,内置AMR音频资源因被自动压缩而无法正常加载,引发Resources$NotFoundException;通过配置aaptOptions.noCompress可强制保留AMR文件原始格式,彻底解决播放失败问题。
android应用以aab格式发布时,内置amr音频资源因被自动压缩而无法正常加载,引发`resources$notfoundexception`;通过配置`aaptoptions.nocompress`可强制保留amr文件原始格式,彻底解决播放失败问题。
在Android构建流程中,AAB(Android App Bundle)与传统APK的关键差异之一在于资源处理策略:AAB使用更激进的默认压缩机制,对res/raw/等目录下的二进制资源(如.amr、.ogg、.webp等)可能进行无损压缩(ZIP compression),而Android系统在通过Resources.openRawResource()或MediaPlayer.create()加载这些资源时,仅支持未压缩或特定压缩方式的原始资源流。一旦AMR文件被压缩,Resources类将无法正确解析其文件头与数据结构,从而抛出类似以下异常:
android.content.res.Resources$NotFoundException: File res/raw/s003001.amr from resource ID #0x7f0a0126
该错误并非路径缺失或命名错误,而是底层AssetManager读取压缩后的raw资源时触发的兼容性失败——这也是为何APK安装包中一切正常(APK通常不压缩raw资源),而从Google Play下载的AAB分发版本却出现“部分音频能播、多数静音”的典型现象。
✅ 正确解决方案:禁用AMR资源压缩
在模块级 build.gradle(通常为 app/build.gradle)的 android { } 块内,添加 aaptOptions 配置,显式声明 .amr 文件不参与压缩:
android {
// ... 其他配置(compileSdk、defaultConfig等)
aaptOptions {
noCompress "amr" // 关键:禁止压缩.amr文件
// 如需同时保护其他格式,可追加:
// noCompress "ogg", "wav", "webp"
}
}
⚠️ 注意事项:
- noCompress 接收的是文件扩展名字符串(不含点),如 "amr" 而非 ".amr";
- 该配置仅影响 res/ 目录下的资源(如 res/raw/s003001.amr),对 assets/ 目录下文件无效(若改用 assets/,需配合 AssetFileDescriptor 手动加载);
- 修改后务必执行 Clean Project → Rebuild Project,并使用 bundleRelease 生成新AAB验证;
- 可通过解压生成的AAB(重命名为.zip后打开),进入 base/res/raw/ 目录检查 .amr 文件是否以存储(Stored)方式存在(而非Deflated),确认配置生效。
? 补充建议
- 若项目中AMR文件数量庞大且体积敏感,建议评估迁移至更现代、平台兼容性更强的音频格式(如.ogg或.mp3),并在noCompress中同步加入对应扩展名;
- 在res/raw/中使用AMR时,请确保所有文件符合Android原生AMR-NB(窄带)规范,避免因编码参数不兼容导致的静音问题;
- 测试阶段应始终使用真实AAB安装包(可通过bundletool build-apks本地生成并安装)进行音频功能验证,不可仅依赖APK或模拟器调试。
通过上述配置,可确保AMR资源在AAB分发链路中保持原始字节完整性,从根本上消除Resources$NotFoundException,保障音频功能在Google Play环境下的稳定运行。










