Gradle Worker API 必须在 @TaskAction 的 execute 阶段显式调用 workerExecutor 创建 WorkQueue 并 submit,不可在配置阶段或 doFirst/doLast 中使用;隔离方式需按依赖情况选 noIsolation(轻量无依赖)或 classLoaderIsolation(含第三方库),且 Worker 类须为 public 顶层类、参数需 Serializable。

Gradle插件里直接用 Worker API 执行任务,不是“加个注解就自动并行”,而是要显式创建 WorkQueue、提交 WorkRequest,并在 execute 阶段调用 submit。否则哪怕写了 @Input 和 @Output,也只会走串行执行路径。
Worker API 必须在 Task 的 execute 阶段调用
Gradle 的 Worker API 不在配置阶段(configuration phase)生效,也不在 @TaskAction 方法外起作用。它只在真正执行任务逻辑时,通过 workerExecutor.noIsolation() 或 workerExecutor.classLoaderIsolation() 获取队列后提交工作单元。
-
workerExecutor是 Gradle 提供的注入式服务,只能在@TaskAction方法内通过project.getObjects().getWorkerExecutor()或构造器注入获取 - 不能在
doFirst/doLast闭包里调用,因为它们仍属配置阶段,此时workerExecutor尚未 ready - 若在自定义 Plugin 中注册 Task,需确保该 Task 类继承
DefaultTask并声明@Inject构造器,才能安全拿到WorkerExecutor
classLoaderIsolation 和 noIsolation 的选择依据
两者隔离级别不同,直接影响类可见性与线程安全:
-
noIsolation():所有 Worker 共享主构建线程的 ClassLoader,适合纯计算、无第三方依赖的轻量逻辑(如字符串处理、JSON 解析),启动快但不安全——若多个 Worker 同时修改静态变量或单例状态,会出竞态 -
classLoaderIsolation():每个 Worker 拥有独立 ClassLoader,加载你指定的 classpath(通常为project.files(configurations.runtimeClasspath)),适合调用外部库(如 Jackson、OkHttp),但初始化开销略大,且必须显式传入所有依赖类或 jar 路径 - 切勿对含 Android SDK 或 AndroidX 依赖的 Worker 用
noIsolation(),会抛NoClassDefFoundError或IllegalAccessError
Worker 实现类不能是匿名类或本地类
Gradle 在序列化 Worker 实例时,要求实现类必须是 public、top-level、有无参构造器(或由 Gradle 注入参数),否则会报 Could not serialize worker action。
- 错误写法:
val processor = object : WorkAction<myparams> { ... }</myparams>→ 序列化失败 - 正确写法:新建文件
src/main/kotlin/MyProcessor.kt,定义class MyProcessor @Inject constructor(...) : WorkAction<myparams></myparams> - 参数类型
MyParams必须是 public、serializable(Kotlin data class 默认满足)、所有字段为val且不可空(String?会触发反序列化异常) - 不要在 Worker 类里引用
Project、Task或FileCollection等 Gradle 内部对象,它们无法跨线程序列化
常见错误:Worker 报错 “Cannot cast to WorkParameters”
这通常是因为你在 Worker 类中误用了 Android 的 WorkerParameters(来自 androidx.work),而 Gradle 的 Worker API 完全不兼容它。
- Gradle Worker 的参数接口是
java.io.Serializable,由你自定义,比如data class ProcessFilesParams(val srcDir: String, val encoding: String) - Android
WorkerParameters是 Android Framework 层概念,只用于WorkManager,和 Gradle 构建无关 - 混淆点常出现在项目同时用了
androidx.work:work-runtime-ktx和自定义 Gradle 插件——务必检查 import 是否误引入了androidx.work.WorkerParameters - 如果看到堆栈里出现
org.gradle.internal.work.WorkerLeaseService+ClassCastException,基本可断定是类型混用
最易被忽略的一点:Worker 提交后不会阻塞主线程,但你也**不能假设它一定完成后再继续执行后续代码**;如需同步等待结果,得自己用 CountDownLatch 或 CompletableFuture 封装,Gradle 不提供原生 await 接口。

















