[core] empty synthetic class kept after method inlining
Author: obus-globusCreated Jun 19, 2026Updated Jul 1, 2026
Issue details
A synthetic class whose only method gets inlined into its caller is left in the output as an empty shell:
public final /* synthetic */ class c {
}
jadx already removes empty synthetic classes (ClassModifier.isEmptySyntheticClass), but this one survives because the check runs before the inline pipeline and looks at the raw method list.
Minimal smali repro.
Trampoline.smali:
.class public final synthetic Lhusk/Trampoline;
.super Ljava/lang/Object;
.method public static synthetic bridge a(Ljava/lang/StringBuilder;)I
.registers 1
invoke-virtual {p0}, Ljava/lang/StringBuilder;->length()I
move-result v0
return v0
.end method
Caller.smali:
.class public Lhusk/Caller;
.super Ljava/lang/Object;
.method public static check(Ljava/lang/StringBuilder;)Z
.registers 2
invoke-static {p0}, Lhusk/Trampoline;->a(Ljava/lang/StringBuilder;)I
move-result v0
const/4 v1, 0x5
if-lt v0, v1, :cond_0
const/4 v0, 0x1
return v0
:cond_0
const/4 v0, 0x0
return v0
.end method
Caller inlines to return sb.length() >= 5;, but husk/Trampoline.java is emitted as an empty public final /* synthetic */ class Trampoline {}.
Jadx version
master (8c28a853)
Source: skylot/jadx