
Descompilador Java e Operador de Serialização em Go Puro
Um toolkit Java portátil e em Go puro — extraído e enxugado do yaklang — focado em quatro coisas:
.class / .jar / .war / .zip → código-fonte Java legível..dex / .apk nativos → .jar determinístico, ou diretamente
para código-fonte Java legível, sem invocar uma ferramenta externa dex2jar..class (constant pool,
campos, métodos, versão, flags de acesso).Construído para portabilidade e incorporação:
javajive envolve todas as quatro
capacidades; os subpacotes permanecem disponíveis para uso avançado.decompile, dex2jar, classinfo e serial,
construídos sobre a biblioteca padrão..class / .jar reais e
blobs serializados pelo JDK com javac/java, e então verifica o JavaJive contra eles
(veja HARNESS-WORKFLOW.md).utils / codec / log / go-funk são
reimplementados como um núcleo internal/ mínimo e autocontido.A completa auditoria diferencial de 38 JARs registra zero regressões em relação à linha de base fixa: todos os 20 JARs anteriormente compiláveis sem erros são mantidos e 26 agora compilam integralmente. Defeitos da linha de base e 4 stubs de métodos existentes permanecem visíveis. Veja os resultados por JAR e reprodução.
250 round trips semânticos isolados registram compilação, verificação da JVM, stubs e igualdade em tempo de execução separadamente; as classes originais da aplicação estão ausentes dos classpaths reconstruídos. A CI executa a auditoria semântica no JDK 17 e 21, a comparação histórica completa, e as matrizes de SO/Go e de race. Essas verificações não provam a equivalência de todos os métodos de biblioteca. Veja a implementação e os limites restantes.
Os números a seguir foram reportados para a v0.3.0 em 2026-09-05. Eles não são resultados de aceitação da versão atual nem prova de equivalência comportamental.
Medido em 34 jars do mundo real (18.759 unidades achatadas) via decompile → recompilação com javac --release 8
→ reempacotamento → verificação da JVM:
Outer$Inner.java)
recompilam com zero erros de javac e 0 erros de sintaxe em todos os 34 jars (uma asserção
rígida imposta pela CI, para que nenhum erro de tipo se esconda atrás de uma falha do lexer).-Xverify:all na JVM passa de ponta a ponta (o codec é byte-idêntico ao
jar original sob um diferencial de chamadas). Fixado em provenClean.Consulte BENCHMARK.md para a metodologia completa, tabelas por jar e comandos de reprodução.
# CLI
go install github.com/yaklang/javajive/cmd/javajive@latest
# Library
go get github.com/yaklang/javajive@latest
Ou compile a partir do código-fonte:
git clone https://github.com/yaklang/javajive
cd javajive
go build -o javajive ./cmd/javajive
Requer 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
A entrada é detectada por magic em vez da extensão do arquivo. A saída é um JAR reproduzível. O dex2jar falha a conversão completa em qualquer classe ou método não suportado ou malformado; ele grava um arquivo temporário no mesmo diretório antes de substituir o destino e nunca substitui stubs de método.
A tradução nativa de DEX é atualmente um primeiro recorte vertical estrito, não um conversor geral de aplicações Android. O subconjunto testado é o DEX 035 padrão com fluxo de controle comum de inteiros/referências, campos e invocações, inicialização segura de new-instance/construtor emparelhados, e arrays básicos. Os arquivos de classe gerados são testados por parser e verificados na JVM, incluindo caminhos executáveis de branch, campo, invocação, construtor e int[].
Ainda não suportado: operações try/catch e monitor; valores ou opcodes de float, long e double; switches, instruções de payload e arrays preenchidos; invocações dinâmicas e constantes de método do DEX 038+; anotações e metadados de depuração; CompactDex; e recursos ou bibliotecas nativas de APK. Entrada APK significa que apenas entradas com nomes canônicos classes.dex, classes2.dex, ... são traduzidas. Todos os arquivos DEX selecionados devem ter sucesso transacionalmente ou nenhum JAR é produzido.
javajive classinfo Foo.class