android: fix missing Hilt GeneratedInjector in asm transform
This commit is contained in:
@@ -983,3 +983,14 @@
|
||||
- Upgraded attachment audio player behavior (voice + audio):
|
||||
- added seek slider for manual rewind/fast-forward,
|
||||
- unified speed toggle for both `voice` and `audio` playback.
|
||||
|
||||
### Step 134 - Hilt startup crash fix (`MessengerApplication_GeneratedInjector`)
|
||||
- Fixed startup crash:
|
||||
- `NoClassDefFoundError: MessengerApplication_GeneratedInjector`.
|
||||
- Root cause observed in build pipeline:
|
||||
- `MessengerApplication_GeneratedInjector.class` existed after `javac`,
|
||||
- but was missing in `transformDebugClassesWithAsm/dirs` before dexing.
|
||||
- Added Gradle backfill task for `debug/release` variants:
|
||||
- copies `*Application_GeneratedInjector.class` from `intermediates/javac/.../classes`
|
||||
into `intermediates/classes/.../transform...ClassesWithAsm/dirs` if missing,
|
||||
- wired task as dependency of `dexBuilder<Variant>`.
|
||||
|
||||
@@ -127,3 +127,37 @@ dependencies {
|
||||
kapt {
|
||||
correctErrorTypes = true
|
||||
}
|
||||
|
||||
fun registerHiltInjectorBackfillTask(variantName: String) {
|
||||
val cap = variantName.replaceFirstChar { if (it.isLowerCase()) it.titlecase() else it.toString() }
|
||||
val taskName = "backfill${cap}HiltApplicationInjector"
|
||||
val dexBuilderTaskName = "dexBuilder$cap"
|
||||
val compileJavaTaskName = "compile${cap}JavaWithJavac"
|
||||
|
||||
tasks.register(taskName) {
|
||||
dependsOn(compileJavaTaskName)
|
||||
doLast {
|
||||
val javacOutput = file("$buildDir/intermediates/javac/$variantName/$compileJavaTaskName/classes")
|
||||
val asmOutput = file("$buildDir/intermediates/classes/$variantName/transform${cap}ClassesWithAsm/dirs")
|
||||
if (!javacOutput.exists() || !asmOutput.exists()) return@doLast
|
||||
|
||||
fileTree(javacOutput) {
|
||||
include("**/*Application_GeneratedInjector.class")
|
||||
}.forEach { source ->
|
||||
val relativePath = source.relativeTo(javacOutput).path
|
||||
val target = file("${asmOutput.path}/$relativePath")
|
||||
if (!target.exists()) {
|
||||
target.parentFile?.mkdirs()
|
||||
source.copyTo(target, overwrite = true)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
tasks.matching { it.name == dexBuilderTaskName }.configureEach {
|
||||
dependsOn(taskName)
|
||||
}
|
||||
}
|
||||
|
||||
registerHiltInjectorBackfillTask("debug")
|
||||
registerHiltInjectorBackfillTask("release")
|
||||
|
||||
Reference in New Issue
Block a user