# ejfkdev/ddc architecture

> Architecture diagram of the GitHub repository ejfkdev/ddc, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-12). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/ejfkdev/ddc
- Repository: https://github.com/ejfkdev/ddc

## Overview

ddc is a Rust Android DEX-to-Java decompiler with a second, progressive-query workflow. Full runs expand APK/XAPK/APKS inputs into DEX images, decode their structures, decompile methods and render Java; query commands inspect metadata or methods without requiring a full decompile. The README also documents manifest/resource inspection and REST/MCP interfaces. The sampled sources support the parser and decompiler layers, but not all CLI dispatch or service wiring, so some documented subsystem links are dashed or omitted.

Main entry points: [`crates/ddc-cli/src/main.rs`](https://github.com/ejfkdev/ddc/blob/main/crates/ddc-cli/src/main.rs) (CLI entry), [`crates/ddc-dec/src/classdec.rs`](https://github.com/ejfkdev/ddc/blob/main/crates/ddc-dec/src/classdec.rs) (Class rendering), [`crates/ddc-dec/src/method.rs`](https://github.com/ejfkdev/ddc/blob/main/crates/ddc-dec/src/method.rs) (Method decompiler), [`crates/ddc-dex/src/file.rs`](https://github.com/ejfkdev/ddc/blob/main/crates/ddc-dex/src/file.rs) (DEX structure)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_cli["CLI workflows"]
  node_cli["CLI entry<br/>[main.rs]"]
  node_input["Input expansion<br/>[inputs.rs]"]
  node_javaout["Java output<br/>[main.rs]"]
  node_locale["Bilingual messages<br/>[lang.rs]"]
end

subgraph group_decode["DEX decoding"]
  node_dexfile["DEX structure<br/>[file.rs]"]
  node_cursor["Binary reader<br/>[reader.rs]"]
  node_instructions["Instruction decode<br/>[insn.rs]"]
end

subgraph group_decompile["Decompilation"]
  node_cfg["Control-flow graph<br/>[cfg.rs]"]
  node_lift["Register lifting<br/>[lift.rs]"]
  node_method["Method decompiler<br/>[method.rs]"]
  node_passes["Refinement passes<br/>[passes.rs]"]
  node_class["Class rendering<br/>[classdec.rs]"]
  node_context["Class context<br/>[ctx.rs]"]
  node_cure["Cure simplifier<br/>[cure_pass.rs]"]
  node_platform["Platform symbols<br/>[platform.rs]"]
end

subgraph group_query["Queries and services"]
  node_queryapi["Typed query cores<br/>[api.rs]"]
  node_browse["Browse commands<br/>[browse.rs]"]
  node_findrefs["Reference search<br/>[findrefs.rs]"]
  node_manifest["Manifest inspection<br/>[manifest.rs]"]
  node_axml["Binary XML<br/>[axml.rs]"]
  node_arsc["Resource table<br/>[arsc.rs]"]
  node_service["REST and MCP<br/>[xyz_api.rs]"]
end

node_user(("CLI user"))

node_user -->|"runs commands"| node_cli
node_cli -->|"expands inputs"| node_input
node_input -.->|"parses DEX"| node_dexfile
node_dexfile -->|"reads bytes"| node_cursor
node_dexfile -->|"decodes code"| node_instructions
node_method -->|"builds CFG"| node_cfg
node_method -->|"lifts registers"| node_lift
node_method -->|"refines IR"| node_passes
node_class -->|"decompiles methods"| node_method
node_class -->|"uses context"| node_context
node_class -->|"simplifies output"| node_cure
node_cli -.->|"decompiles classes"| node_class
node_class -.->|"uses symbols"| node_platform
node_cli -->|"writes Java"| node_javaout
node_cli -->|"dispatches queries"| node_browse
node_cli -->|"dispatches typed queries"| node_queryapi
node_cli -->|"handles manifest queries"| node_manifest
node_manifest -->|"parses binary XML"| node_axml
node_manifest -->|"looks up resources"| node_arsc
node_browse -->|"searches references"| node_findrefs
node_service -->|"exposes queries"| node_queryapi
node_user -->|"uses REST or MCP"| node_service
node_cli -->|"selects messages"| node_locale

click node_cli "https://github.com/ejfkdev/ddc/blob/main/crates/ddc-cli/src/main.rs"
click node_input "https://github.com/ejfkdev/ddc/blob/main/crates/ddc-cli/src/inputs.rs"
click node_javaout "https://github.com/ejfkdev/ddc/blob/main/crates/ddc-cli/src/main.rs"
click node_dexfile "https://github.com/ejfkdev/ddc/blob/main/crates/ddc-dex/src/file.rs"
click node_cursor "https://github.com/ejfkdev/ddc/blob/main/crates/ddc-dex/src/reader.rs"
click node_instructions "https://github.com/ejfkdev/ddc/blob/main/crates/ddc-dex/src/insn.rs"
click node_cfg "https://github.com/ejfkdev/ddc/blob/main/crates/ddc-dec/src/cfg.rs"
click node_lift "https://github.com/ejfkdev/ddc/blob/main/crates/ddc-dec/src/lift.rs"
click node_method "https://github.com/ejfkdev/ddc/blob/main/crates/ddc-dec/src/method.rs"
click node_passes "https://github.com/ejfkdev/ddc/blob/main/crates/ddc-dec/src/passes.rs"
click node_class "https://github.com/ejfkdev/ddc/blob/main/crates/ddc-dec/src/classdec.rs"
click node_context "https://github.com/ejfkdev/ddc/blob/main/crates/ddc-dec/src/ctx.rs"
click node_cure "https://github.com/ejfkdev/ddc/blob/main/crates/ddc-dec/src/cure_pass.rs"
click node_platform "https://github.com/ejfkdev/ddc/blob/main/crates/ddc-dec/src/platform.rs"
click node_queryapi "https://github.com/ejfkdev/ddc/blob/main/crates/ddc-cli/src/api.rs"
click node_browse "https://github.com/ejfkdev/ddc/blob/main/crates/ddc-cli/src/browse.rs"
click node_findrefs "https://github.com/ejfkdev/ddc/blob/main/crates/ddc-cli/src/findrefs.rs"
click node_manifest "https://github.com/ejfkdev/ddc/blob/main/crates/ddc-cli/src/manifest.rs"
click node_axml "https://github.com/ejfkdev/ddc/blob/main/crates/ddc-cli/src/axml.rs"
click node_arsc "https://github.com/ejfkdev/ddc/blob/main/crates/ddc-cli/src/arsc.rs"
click node_service "https://github.com/ejfkdev/ddc/blob/main/crates/ddc-cli/src/xyz_api.rs"
click node_locale "https://github.com/ejfkdev/ddc/blob/main/crates/ddc-cli/src/lang.rs"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_cli,node_input,node_javaout,node_locale,node_user toneBlue
class node_dexfile,node_cursor,node_instructions toneAmber
class node_cfg,node_lift,node_method,node_passes,node_class,node_context,node_cure,node_platform toneMint
class node_queryapi,node_browse,node_findrefs,node_manifest,node_axml,node_arsc,node_service toneRose
```

## Components

### CLI workflows

- [CLI entry](https://github.com/ejfkdev/ddc/blob/main/crates/ddc-cli/src/main.rs): `crates/ddc-cli/src/main.rs`
- [Input expansion](https://github.com/ejfkdev/ddc/blob/main/crates/ddc-cli/src/inputs.rs): `crates/ddc-cli/src/inputs.rs`
- [Java output](https://github.com/ejfkdev/ddc/blob/main/crates/ddc-cli/src/main.rs): `crates/ddc-cli/src/main.rs`
- [Bilingual messages](https://github.com/ejfkdev/ddc/blob/main/crates/ddc-cli/src/lang.rs): `crates/ddc-cli/src/lang.rs`

### DEX decoding

- [DEX structure](https://github.com/ejfkdev/ddc/blob/main/crates/ddc-dex/src/file.rs): `crates/ddc-dex/src/file.rs`
- [Binary reader](https://github.com/ejfkdev/ddc/blob/main/crates/ddc-dex/src/reader.rs): `crates/ddc-dex/src/reader.rs`
- [Instruction decode](https://github.com/ejfkdev/ddc/blob/main/crates/ddc-dex/src/insn.rs): `crates/ddc-dex/src/insn.rs`

### Decompilation

- [Control-flow graph](https://github.com/ejfkdev/ddc/blob/main/crates/ddc-dec/src/cfg.rs): `crates/ddc-dec/src/cfg.rs`
- [Register lifting](https://github.com/ejfkdev/ddc/blob/main/crates/ddc-dec/src/lift.rs): `crates/ddc-dec/src/lift.rs`
- [Method decompiler](https://github.com/ejfkdev/ddc/blob/main/crates/ddc-dec/src/method.rs): `crates/ddc-dec/src/method.rs`
- [Refinement passes](https://github.com/ejfkdev/ddc/blob/main/crates/ddc-dec/src/passes.rs): `crates/ddc-dec/src/passes.rs`
- [Class rendering](https://github.com/ejfkdev/ddc/blob/main/crates/ddc-dec/src/classdec.rs): `crates/ddc-dec/src/classdec.rs`
- [Class context](https://github.com/ejfkdev/ddc/blob/main/crates/ddc-dec/src/ctx.rs): `crates/ddc-dec/src/ctx.rs`
- [Cure simplifier](https://github.com/ejfkdev/ddc/blob/main/crates/ddc-dec/src/cure_pass.rs): `crates/ddc-dec/src/cure_pass.rs`
- [Platform symbols](https://github.com/ejfkdev/ddc/blob/main/crates/ddc-dec/src/platform.rs): `crates/ddc-dec/src/platform.rs`

### Queries and services

- [Typed query cores](https://github.com/ejfkdev/ddc/blob/main/crates/ddc-cli/src/api.rs): `crates/ddc-cli/src/api.rs`
- [Browse commands](https://github.com/ejfkdev/ddc/blob/main/crates/ddc-cli/src/browse.rs): `crates/ddc-cli/src/browse.rs`
- [Reference search](https://github.com/ejfkdev/ddc/blob/main/crates/ddc-cli/src/findrefs.rs): `crates/ddc-cli/src/findrefs.rs`
- [Manifest inspection](https://github.com/ejfkdev/ddc/blob/main/crates/ddc-cli/src/manifest.rs): `crates/ddc-cli/src/manifest.rs`
- [Binary XML](https://github.com/ejfkdev/ddc/blob/main/crates/ddc-cli/src/axml.rs): `crates/ddc-cli/src/axml.rs`
- [Resource table](https://github.com/ejfkdev/ddc/blob/main/crates/ddc-cli/src/arsc.rs): `crates/ddc-cli/src/arsc.rs`
- [REST and MCP](https://github.com/ejfkdev/ddc/blob/main/crates/ddc-cli/src/xyz_api.rs): `crates/ddc-cli/src/xyz_api.rs`

### Other components

- **CLI user**

## Connections

- CLI user → CLI entry: runs commands (evidence: `README.md`)
- CLI entry → Input expansion: expands inputs (evidence: `crates/ddc-cli/src/main.rs`)
- Input expansion → DEX structure: parses DEX
- DEX structure → Binary reader: reads bytes (evidence: `crates/ddc-dex/src/file.rs`)
- DEX structure → Instruction decode: decodes code (evidence: `crates/ddc-dex/src/file.rs`)
- Method decompiler → Control-flow graph: builds CFG (evidence: `crates/ddc-dec/src/method.rs`)
- Method decompiler → Register lifting: lifts registers (evidence: `crates/ddc-dec/src/method.rs`)
- Method decompiler → Refinement passes: refines IR (evidence: `crates/ddc-dec/src/method.rs`)
- Class rendering → Method decompiler: decompiles methods (evidence: `crates/ddc-dec/src/classdec.rs`)
- Class rendering → Class context: uses context (evidence: `crates/ddc-dec/src/classdec.rs`)
- Class rendering → Cure simplifier: simplifies output (evidence: `crates/ddc-dec/src/classdec.rs`)
- CLI entry → Class rendering: decompiles classes
- Class rendering → Platform symbols: uses symbols
- CLI entry → Java output: writes Java (evidence: `README.md`)
- CLI entry → Browse commands: dispatches queries (evidence: `crates/ddc-cli/src/main.rs`)
- CLI entry → Typed query cores: dispatches typed queries (evidence: `crates/ddc-cli/src/main.rs`)
- CLI entry → Manifest inspection: handles manifest queries (evidence: `crates/ddc-cli/src/main.rs`)
- Manifest inspection → Binary XML: parses binary XML (evidence: `crates/ddc-cli/src/manifest.rs`)
- Manifest inspection → Resource table: looks up resources (evidence: `crates/ddc-cli/src/arsc.rs`)
- Browse commands → Reference search: searches references (evidence: `crates/ddc-cli/src/browse.rs`)
- REST and MCP → Typed query cores: exposes queries (evidence: `crates/ddc-cli/src/xyz_api.rs`)
- CLI user → REST and MCP: uses REST or MCP (evidence: `README.md`)
- CLI entry → Bilingual messages: selects messages (evidence: `crates/ddc-cli/src/main.rs`)
