AGP从4.2.1升级至7.0.x后开启R8混淆WorkManager任务不执行问题
AGP 7.x开启混淆后WorkManager任务排队不执行解决方案
根因说明
AGP 7.0+默认启用R8全量压缩模式,且配套Java 11字节码的压缩规则比AGP 4.x严格很多,官方自带的WorkManager混淆规则仅覆盖库内部逻辑,不会主动保留业务侧自定义的Worker子类、构造方法等反射调用依赖的内容,过度压缩会导致WorkManager无法实例化任务,因此出现任务一直排队无执行的现象。
修复步骤
- 优先添加业务侧Worker专属保留规则到
proguard-rules.pro,不要完全依赖库自带规则:
# 保留所有自定义Worker的构造方法(WorkManager通过反射实例化Worker) -keep class * extends androidx.work.Worker { public <init>(android.content.Context, androidx.work.WorkerParameters); } -keep class * extends androidx.work.CoroutineWorker { public <init>(android.content.Context, androidx.work.WorkerParameters); } -keep class * extends androidx.work.RxWorker { public <init>(android.content.Context, androidx.work.WorkerParameters); } -keepclassmembers class * extends androidx.work.ListenableWorker { public <init>(android.content.Context, androidx.work.WorkerParameters); } # 兼容R8全量压缩模式下的内部元数据保留 -keepnames class androidx.work.impl.model.WorkTypeConverters { *; }
如果上述规则未生效,可临时添加-keep class androidx.work.** { *; }验证是否为库内部类被误删导致的问题
- 验证R8全量压缩模式的影响:在
gradle.properties中添加android.enableR8.fullMode=false后重新构建测试,如果问题解决说明是全量压缩规则导致的误裁剪,可以针对性调整规则,不需要直接关闭全量压缩。 - 检查所有自定义Worker的构造方法访问权限必须为
public,非公开构造方法会被R8标记为无用代码直接删除,即使添加混淆规则也可能不生效。 - 如果你使用了自定义
WorkerFactory,需要额外将工厂类、重写的实例化方法加入混淆保留规则。
内容的提问来源于stack exchange,提问作者Ruslan Hlushan
相关产品推荐
相关产品推荐

