I have a android library which uses Work manager
to handle task schedulings. For backward compatibity, I made the library using support library.
since setInitialDelay
is moved to parent class in WorkManager v2.1.0, if the library uses this (while using WorkManager v1 and support library), the Jetifier
will make WorkManger v1 just like WorkManager v2.0.1 and not v2.0.2. So this will cause the error:
Caused by: java.lang.NoSuchMethodError:
No virtual method setInitialDelay(JLjava/util/concurrent/TimeUnit;)Landroidx/work/OneTimeWorkRequest$Builder;
in class Landroidx/work/OneTimeWorkRequest$Builder;
The old workManager (2.0.1) code is like this:
abstract class WorkRequest {
abstract static class Builder<B extends Builder, W extends WorkRequest> {
}
}
class OneTimeWorkRequest extends WorkRequest {
static class Builder extends WorkRequest.Builder<Builder, OneTimeWorkRequest> {
public @NonNull Builder setInitialDelay(long duration, @NonNull TimeUnit timeUnit) {
....
}
}
}
And the new one (^2.1.0) is :
abstract class WorkRequest {
abstract static class Builder<B extends Builder, W extends WorkRequest> {
public @NonNull B setInitialDelay(long duration, @NonNull TimeUnit timeUnit) {
...
}
}
}
class OneTimeWorkRequest extends WorkRequest {
static class Builder extends WorkRequest.Builder<Builder, OneTimeWorkRequest> {
}
}
TL;DR
If developer uses workManager v2.1.0
, what will happen to libraries that have WorkManager v1 and use Jetifer to transform to v2?
Unfortunately, the API change is a breaking and to resolve this, you must migrate the project to AndroidX.
Further changes of androidx.workmanager
will not consider compatibility to android.arch
artifact.