
Descompilador Android DEX → Java em Rust, feito para velocidade — aplicativos completos em segundos, consultas em milissegundos. Análise progressiva, saída verificada pelo javac, todas as versões de DEX, multi-dex e contêineres XAPK/APKS/APKM.
English | 简体中文
ddc descompila bytecode DEX do Android de volta para Java legível — na
escala de aplicativos do mundo real, consultável como um banco de dados e verificado pelo javac:
cada um dos 909.689 arquivos que ele emite em sete APKs do mundo real
é analisado sem erros.
javac com zero erros de sintaxe; cada classe de
um par de nomes com variação de maiúsculas/minúsculas (X/Cua vs X/cua) é preservada como
seu próprio arquivo em vez de a última sobrescrever silenciosamente.(a) -> …, Cls::name, a + b).str, getName() → name, strings de parâmetros Intrinsics do Kotlin) em vez de v12;
literais IntDef são renderizados como suas constantes de imediato
(setVisibility(8) → View.GONE; uma tabela de domínio android-37 integrada,
--symbols sobrescreve); o ruído de verificação de nulos do Kotlin é eliminado e
pontes sintéticas access$NNN são embutidas em seus locais de chamada.--fast (pula
a simplificação, mantém a formatação).ddc serve expõe cada consulta como uma rota REST (GET com parâmetros
de consulta ou POST com um corpo JSON) além de GET /openapi.json e um endpoint MCP streamable em /mcp — aponte um
cliente MCP para http://addr/mcp; ddc http é somente REST (sem
/mcp); ddc mcp stdio|http executa os mesmos comandos como ferramentas MCP
com esquemas de entrada e saída. Comandos de consulta aceitam --format auto|text|table|markdown|md|json|jsonl (auto: tabela em um terminal,
a forma de texto estável quando canalizado).DDC_LANG=zh|en força; fallback para inglês).jdc-core, o
núcleo neutro em relação à máquina compartilhado com
jcdc.macOS (Homebrew):
brew install ejfkdev/tap/ddc
Windows (Scoop) — adicione o bucket uma vez e depois instale pelo nome (o scoop
não resolve a forma simples user/repo/app — issue #3):
scoop bucket add ejfkdev https://github.com/ejfkdev/scoop-bucket
scoop install ddc
# or install straight from the manifest URL, no bucket needed:
scoop install https://raw.githubusercontent.com/ejfkdev/scoop-bucket/main/bucket/ddc.json
cargo-binstall (qualquer plataforma — busca o binário de lançamento pré-compilado em vez de compilar):
cargo binstall ddc-cli
Binários: cada release
fornece binários brutos (sem arquivos compactados) para linux-amd64, linux-arm64,
windows-amd64, windows-arm64, macos-amd64 e macos-arm64 —
builds não-macOS comprimidos com UPX.
A partir do código-fonte (Rust stable):
git clone https://github.com/ejfkdev/ddc && cd ddc
cargo build --release
ddc app.apk # full decompile → app-out/
ddc app.apk -c com.example.Foo # one class to stdout
ddc app.apk -o - | less # everything to stdout
ddc info app.apk # app context (label via arsc, package,
# version, md5) + per-dex counts
ddc mainactivity app.apk # entry point: package + launcher
ddc findrefs app.apk string token # every const-string "token" site
ddc getmethod app.apk Foo.toString # one method, all overloads
ddc pkg app.apk --app -o own/ # the app's own code only
Opções completas e exemplos: ddc --help (menu de subcomandos agrupado por
fluxo de trabalho). A referência completa — a semântica de cada opção, o formato de saída e o comportamento de cada
subcomando — está em
docs/cli.md (中文).
Sete APKs do mundo real, build de release, medidos após um resfriamento (Apple Silicon, 6P+12E). O corpus de validação de 39 APKs (4,08M de arquivos descompilados, tempo de parede por APK / RSS de pico / gate de parsing do javac) está em docs/validation.md (中文).
| APK | Tamanho | Descompilação completa | RSS de pico |
|---|---|---|---|
| reqable | 34 MB | 0,57s | 162 MB |
| Telegram | 62 MB | 4,50s | 786 MB |
| 139 MB | 13,6s (99.483 arquivos — todos os pares de classes com variação de maiúsculas/minúsculas preservados) | 944 MB | |
| 226 MB | 13,5s | 1173 MB | |
| weixin | 268 MB | 32,7s | 1401 MB |
| lark | 398 MB | 16,1s | 2226 MB |
| 374 MB | 37,1s | 2268 MB |
Subcomandos de consulta nos mesmos APKs (células: tempo / RSS de pico;
strings -f <package> --with-locations, findrefs na string do pacote
e no método onCreate, hierarchy/disasm/getclass na
classe launcher de cada app):