
Descompilador de Java y operador de serialización en Go puro
Un kit de herramientas Java portátil y en Go puro — extraído y recortado de yaklang — centrado en cuatro cosas:
.class / .jar / .war / .zip → código fuente Java legible..dex / .apk nativos → .jar determinista, o directamente
a código fuente Java legible, sin invocar una herramienta externa dex2jar..class (pool de constantes,
campos, métodos, versión, flags de acceso).Diseñado para portabilidad e integración:
javajive envuelve las cuatro
capacidades; los subpaquetes siguen disponibles para uso avanzado.decompile, dex2jar, classinfo y serial,
construidos sobre la biblioteca estándar..class / .jar reales y
blobs serializados por el JDK con javac/java, y luego verifica JavaJive contra ellos
(véase HARNESS-WORKFLOW.md).utils / codec / log / go-funk están
reimplementados como un núcleo internal/ mínimo y autocontenido.La completa auditoría diferencial de 38 JAR registra cero regresiones frente a la línea base fija: los 20 JAR que antes compilaban limpiamente se conservan y 26 ahora compilan por completo. Los defectos de la línea base y 4 stubs de métodos existentes siguen visibles. Véase los resultados por JAR y reproducción.
250 idas y vueltas semánticas aisladas registran por separado la compilación, la verificación de la JVM, los stubs y la igualdad en tiempo de ejecución; las clases originales de la aplicación están ausentes de los classpaths reconstruidos. CI ejecuta la auditoría semántica en JDK 17 y 21, la comparación histórica completa, y las matrices de SO/Go y de condiciones de carrera. Estas comprobaciones no demuestran la equivalencia de todos los métodos de las bibliotecas. Véase la implementación y los límites restantes.
Las siguientes cifras se reportaron para v0.3.0 el 2026-09-05. No son resultados de aceptación de la versión actual ni prueba de equivalencia de comportamiento.
Medido en 34 jars del mundo real (18,759 unidades aplanadas) mediante descompilar → recompilar con javac --release 8
→ reempaquetar → verificar con la JVM:
Outer$Inner.java)
recompilan con cero errores de javac, y 0 errores de sintaxis en los 34 jars (una
aserción estricta aplicada por CI, de modo que ningún error de tipo puede ocultarse tras un fallo del lexer).-Xverify:all de la JVM pasa de extremo a extremo (el códec es idéntico byte a byte al
jar original bajo un diferencial de llamadas). Fijado en provenClean.Consulta BENCHMARK.md para la metodología completa, las tablas por jar y los comandos de reproducción.
# CLI
go install github.com/yaklang/javajive/cmd/javajive@latest
# Library
go get github.com/yaklang/javajive@latest
O compilar desde el código fuente:
git clone https://github.com/yaklang/javajive
cd javajive
go build -o javajive ./cmd/javajive
Requiere 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
La entrada se detecta por magic en lugar de por la extensión del nombre de archivo. La salida es un JAR reproducible. dex2jar falla la conversión completa ante cualquier clase o método no soportado o malformado; escribe un archivo temporal en el mismo directorio antes de reemplazar el destino y nunca sustituye con stubs de métodos.
La traducción nativa de DEX es actualmente un primer segmento vertical estricto, no un conversor general de aplicaciones Android. El subconjunto probado es DEX 035 estándar con flujo de control ordinario de enteros/referencias, campos e invocaciones, inicialización segura de pares new-instance/constructor, y arrays básicos. Los archivos de clase generados se someten a pruebas de parser y se verifican en la JVM, incluyendo rutas ejecutables de ramas, campos, invocaciones, constructores y int[].