
Reiner-Go Java-Decompiler und Serialisierungsoperator
Ein portables, reines Go-Java-Toolkit — extrahiert und verschlankt aus yaklang — mit Fokus auf vier Dinge:
.class / .jar / .war / .zip → lesbarer Java-Quellcode..dex / .apk → deterministisches .jar oder direkt
zu lesbarem Java-Quellcode, ohne ein externes dex2jar-Tool aufzurufen..class-Datei inspizieren (Konstantenpool,
Felder, Methoden, Version, Zugriffsflags).Konzipiert für Portabilität und Einbettung:
javajive-Fassadenpaket umschließt alle vier
Fähigkeiten; die Unterpakete bleiben für fortgeschrittene Nutzung verfügbar.decompile-, dex2jar-, classinfo- und serial-
Unterbefehle, aufgebaut auf der Standardbibliothek..class / .jar und
JDK-serialisierte Blobs mit javac/java und verifiziert JavaJive dagegen
(siehe HARNESS-WORKFLOW.md).utils / codec / log / go-funk sind
als minimaler, eigenständiger internal/-Kern neu implementiert.Der vollständige 38-JAR-Differenz-Audit verzeichnet null dokumentierte Regressionen gegenüber der festen Baseline: alle 20 zuvor kompilier-sauberen JARs bleiben erhalten und 26 kompilieren nun vollständig. Baseline-Defekte und 4 bestehende Methoden-Stubs bleiben sichtbar. Siehe die Ergebnisse pro JAR und Reproduktion.
250 isolierte semantische Round Trips erfassen Kompilierung, JVM-Verifikation, Stubs und Laufzeitgleichheit getrennt; ursprüngliche Anwendungsklassen fehlen in neu gebauten Classpaths. CI führt den semantischen Audit auf JDK 17 und 21, den vollständigen historischen Vergleich sowie die OS/Go- und Race-Matrizen aus. Diese Prüfungen beweisen nicht die Äquivalenz jeder Bibliotheksmethode. Siehe die Implementierung und verbleibende Grenzen.
Die folgenden Zahlen wurden für v0.3.0 am 2026-09-05 gemeldet. Sie sind keine Abnahmeergebnisse der aktuellen Version und kein Beweis für Verhaltensgleichheit.
Gemessen an 34 realen JARs (18.759 abgeflachte Einheiten) über decompile → javac --release 8
Rekompilierung → Neupaketierung → JVM-Verifikation:
Outer$Inner.java)
kompilieren mit null javac-Fehlern neu, und 0 Syntaxfehler über alle 34 Jars (eine CI-erzwungene
harte Zusicherung, sodass sich kein Typfehler hinter einem Lexer-Fehler verstecken kann).-Xverify:all-Verifikation pro Klasse besteht durchgängig (der Codec ist unter einem Call-Differential byte-identisch zum
Original-Jar). Festgeschrieben in provenClean.Siehe BENCHMARK.md für die vollständige Methodik, Tabellen pro Jar und Reproduktionsbefehle.
# CLI
go install github.com/yaklang/javajive/cmd/javajive@latest
# Library
go get github.com/yaklang/javajive@latest
Oder aus dem Quellcode erstellen:
git clone https://github.com/yaklang/javajive
cd javajive
go build -o javajive ./cmd/javajive
Erfordert Go 1.22+.
javajive <command> [arguments]
Commands:
decompile decompile Java artifacts or the strict DEX 035 subset into Java source
dex2jar convert the strict DEX 035 subset in a DEX/APK to a deterministic JAR
classinfo print the structure of a .class file (version, fields, methods)
serial Java serialization tools (subcommands: tojson, fromjson)
version print the version
help show help
# Single class: prints to stdout by default, or -o to write a file.
javajive decompile Foo.class
javajive decompile Foo.class -o Foo.java
# Archive: defaults to a "<input>.src" directory, or -o to choose one.
javajive decompile app.jar
javajive decompile app.war -o ./app-src
# DEX or APK: run the native DEX-to-JAR pipeline and decompile the result.
# The default output directory is "<input>.src".
javajive decompile classes.dex
javajive decompile app.apk -o ./app-src
# Directory: recursively decompile .class files (requires -o output dir).
javajive decompile ./classes -o ./src
javajive dex2jar -o classes.jar classes.dex
javajive dex2jar -o app.jar app.apk
Die Eingabe wird anhand der Magic-Bytes statt anhand der Dateinamenerweiterung erkannt. Die Ausgabe ist eine reproduzierbare JAR. dex2jar bricht die vollständige Konvertierung bei jeder nicht unterstützten oder fehlerhaften Klasse oder Methode ab; es schreibt eine temporäre Datei im selben Verzeichnis, bevor es das Ziel ersetzt, und setzt niemals Methoden-Stubs ein.
Die native DEX-Übersetzung ist derzeit ein strenger erster vertikaler Ausschnitt, kein allgemeiner Android-Anwendungskonverter. Die getestete Teilmenge ist Standard-DEX 035 mit gewöhnlichem Integer-/Referenz-Kontrollfluss, Feldern und Invokes, sicher gepaarter new-instance/Konstruktor-Initialisierung und einfachen Arrays. Generierte Klassendateien werden parser-getestet und JVM-verifiziert, einschließlich ausführbarer Branch-, Feld-, Invoke-, Konstruktor- und int[]-Pfade.
Noch nicht unterstützt: try/catch- und Monitor-Operationen; float-, long- und double-Werte oder -Opcodes; Switches, Payload-Instruktionen und gefüllte Arrays; DEX 038+ dynamische Invokes und Methodenkonstanten; Annotationen und Debug-Metadaten; CompactDex; sowie APK-Ressourcen oder native Bibliotheken. APK-Eingabe bedeutet, dass nur kanonisch benannte classes.dex-, classes2.dex-, ...-Einträge übersetzt werden. Alle ausgewählten DEX-Dateien müssen transaktional erfolgreich sein, andernfalls wird keine JAR erzeugt.