android: fix missing Hilt GeneratedInjector in asm transform
Some checks failed
Android CI / android (push) Failing after 5m19s
Android Release / release (push) Has been cancelled
CI / test (push) Has been cancelled

This commit is contained in:
Codex
2026-03-10 09:06:24 +03:00
parent 0208fbc5cc
commit e4ea18242a
2 changed files with 45 additions and 0 deletions

View File

@@ -983,3 +983,14 @@
- Upgraded attachment audio player behavior (voice + audio): - Upgraded attachment audio player behavior (voice + audio):
- added seek slider for manual rewind/fast-forward, - added seek slider for manual rewind/fast-forward,
- unified speed toggle for both `voice` and `audio` playback. - 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>`.

View File

@@ -127,3 +127,37 @@ dependencies {
kapt { kapt {
correctErrorTypes = true 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")