我正在使用 Kotlin 开发原生 Android 应用程序。我实现了一个 Worker 类来运行异步 Web 服务调用。除非我不使用dexguard构建,否则我的工人工作正常。仅使用dexguard 构建我得到以下错误
2021-12-07 18:16:46.085 25839-29600/? E/WM-WorkerFactory: Could not instantiate com.xyz.XYZWorker
java.lang.NoSuchMethodException: com.xyz.XYZWorker.<init> [class android.content.Context, class androidx.work.WorkerParameters]
at java.lang.Class.getConstructor0(Class.java:2332)
at java.lang.Class.getDeclaredConstructor(Class.java:2170)
at androidx.work.WorkerFactory.createWorkerWithDefaultFallback(:95)
at androidx.work.impl.WorkerWrapper.runWorker(:244)
at androidx.work.impl.WorkerWrapper.run(:136)
at androidx.work.impl.utils.SerialExecutor$b.run(:91)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:923)
这是我的代码,我屏蔽了一些类名,因为它是客户端项目。我用 Hilt 注入用例。
@HiltWorker
class XYZWorker @AssistedInject constructor(
@Assisted context: Context,
@Assisted workerParameters: WorkerParameters,
val someUseCase: SomeUseCase,
val someUseCase2: SomeUseCase2,
) : CoroutineWorker(context, workerParameters) {
...
}
注入提供的用例
class SomeUseCase @Inject constructor(
private val someRepo: SomeRepo
) : UseCaseParams<List<SomeDomainEntity>, SomeResponseDomainEntity> {
...
}
class MyWorkManagerInitializer : Initializer<WorkManager> {
override fun create(context: Context): WorkManager {
val workerFactory = getWorkerFactory(appContext = context.applicationContext)
val config = Configuration.Builder()
.setWorkerFactory(workerFactory)
.build()
WorkManager.initialize(context, config)
return WorkManager.getInstance(context)
}
override fun dependencies(): MutableList<Class<out Initializer<*>>> = mutableListOf()
private fun getWorkerFactory(appContext: Context): HiltWorkerFactory {
val workManagerEntryPoint = EntryPointAccessors.fromApplication(
appContext,
WorkManagerInitializerEntryPoint::class.java
)
return workManagerEntryPoint.hiltWorkerFactory()
}
@InstallIn(SingletonComponent::class)
@EntryPoint
interface WorkManagerInitializerEntryPoint {
fun hiltWorkerFactory(): HiltWorkerFactory
}
}
<provider
android:name="androidx.work.impl.WorkManagerInitializer"
android:authorities="${applicationId}.workmanager-init"
android:exported="false"
tools:node="remove" />
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
tools:node="merge">
<meta-data
android:name="com.xyz.MyWorkManagerInitializer"
android:value="@string/androidx_startup" />
</provider>
-keep public class androidx.startup.** { *; }
-keep public class androidx.work.** { *; }
-keep public class androidx.hilt.work.** { *; }
-keep @interface androidx.hilt.work.** { *; }
-keep @interface dagger.assisted.** { *; }
-keep @interface dagger.assisted.** { *; }
-keep public class * implements androidx.startup.Initializer { *; }
-keep interface com.xyz.WorkManagerInitializerEntryPoint { *; }
-keep public class * implements com.xyz.WorkManagerInitializerEntryPoint { *; }
-keep public class * extends androidx.work.CoroutineWorker { *; }
-keepclassmembers public class * extends androidx.work.CoroutineWorker {
public <init>(...);
@com.google.inject.Inject <init>(...);
@javax.inject.Inject <init>(...);
}
-keep public class * extends androidx.work.Worker { *; }
-keepclassmembers public class * extends androidx.work.Worker {
public <init>(...);
@com.google.inject.Inject <init>(...);
@javax.inject.Inject <init>(...);
}
-keep public class com.xyz.SomeUseCase { *; }
-keep public class com.xyz.SomeUseCase2 { *; }
这是我的图书馆
implementation androidx.hilt:hilt-work:1.0.0-alpha03
implementation androidx.work:work-runtime-ktx:2.5.0
kapt androidx.hilt:hilt-compiler:1.0.0-alpha03