升级Gradle 8.4与AGP 8.3.0后Media3应用崩溃问题求助
Media3 1.2.1 升级AGP 8.3.0/Gradle 8.4后发布版出现IllegalAccessError崩溃问题
问题概述
使用Media3 1.2.1开发Android应用近一年,将Gradle升级至8.4、Android Gradle Plugin(AGP)升级至8.3.0后,本地完成混淆QA构建等多轮测试均正常,但发布后应用连接服务时出现大规模崩溃(仅5%用户无崩溃),本地无法复现该问题。回退构建工具版本后应用恢复正常,推测为R8/ProGuard优化导致。
崩溃日志如下:
Fatal Exception: java.lang.IllegalAccessError: Illegal class access: 'G2.c2' attempting to access 'com.google.common.util.concurrent.ImmediateFuture' (declaration of 'G2.c2' appears in base.apk) at androidx.media3.session.MediaSessionStub.lambda$queueSessionTaskWithPlayerCommandForControllerInfo$13(MediaSessionStub.java:338) at androidx.media3.session.ConnectedControllersManager.lambda$flushCommandQueue$2(ConnectedControllersManager.java:277) at androidx.media3.session.MediaSessionImpl.lambda$callWithControllerForCurrentRequestSet$3(MediaSessionImpl.java:318) at androidx.media3.common.util.Util.postOrRun(Util.java:761) at androidx.media3.session.ConnectedControllersManager.flushCommandQueue(ConnectedControllersManager.java:271) at androidx.media3.session.ConnectedControllersManager.flushCommandQueue(ConnectedControllersManager.java:252) at androidx.media3.session.MediaSessionStub.lambda$flushCommandQueue$64(MediaSessionStub.java:1653) at androidx.media3.common.util.Util.postOrRun(Util.java:761) at androidx.media3.session.MediaSessionStub.flushCommandQueue(MediaSessionStub.java:1651) at androidx.media3.session.MediaControllerImplBase$FlushCommandQueueHandler.flushCommandQueue(MediaControllerImplBase.java:3290) at androidx.media3.session.MediaControllerImplBase$FlushCommandQueueHandler.handleMessage(MediaControllerImplBase.java:3283) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loopOnce(Looper.java:211) at android.os.Looper.loop(Looper.java:300) at android.app.ActivityThread.main(ActivityThread.java:8294) at java.lang.reflect.Method.invoke(Method.java) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:559) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:954)
崩溃原因
- AGP 8.3.0配套R8版本的优化变化:AGP 8.3.x搭配的R8 8.3.x版本引入了更激进的代码优化规则,Media3 1.2.1未适配这些新规则,导致其内部类(混淆后为
G2.c2)尝试访问的Guava类com.google.common.util.concurrent.ImmediateFuture被错误地限制了访问权限,触发IllegalAccessError。 - 本地与发布构建的差异:本地构建可能未启用与发布完全一致的R8优化参数(如release模式下的全量优化、
shrinkResources等),导致无法复现发布时的问题。
解决办法
临时修复(无需回退构建工具)
在项目的proguard-rules.pro文件中添加以下R8规则,确保相关类的访问权限不受限制:
# 保留Guava的ImmediateFuture类不被优化混淆 -keep class com.google.common.util.concurrent.ImmediateFuture { *; } # 保留Media3会话相关类,避免内部结构被破坏 -keep class androidx.media3.session.** { *; } # 允许修改类访问权限,解决内部类访问限制问题 -allowaccessmodification
长期解决方案
- 升级Media3至适配版本:将Media3升级到1.4.0及以上的稳定版本,后续版本已修复与AGP 8.x系列的R8兼容性问题,从根源避免此类崩溃。
- 统一构建配置:确保本地release构建的配置(
minifyEnabled、shrinkResources、R8参数等)与发布构建完全一致,便于在本地复现问题并调试。 - 调试R8优化过程:在
gradle.properties中添加以下参数,开启R8详细日志,定位具体的优化冲突点:
构建后查看R8日志,针对性调整混淆规则。android.enableR8.fullMode=true android.r8.logLevel=info
应对Android Studio升级提示的建议
- 升级AGP/Gradle前,先确认第三方依赖(如Media3)是否已适配目标版本,优先升级依赖库到兼容版本。
- 升级前在测试环境模拟发布构建流程,验证核心功能的兼容性,避免直接发布引发大规模崩溃。
- 若必须升级构建工具,先小范围灰度发布验证,确认无问题后再全量推送。
内容的提问来源于stack exchange,提问作者johngray1965
相关产品推荐
相关产品推荐

