
DEX → Rust製Javaデコンパイラ — 高速、段階的解析、バイリンガルCLI
English | 简体中文
ddc は Android DEX バイトコードを読みやすい Java にデコンパイルします —
実アプリ規模で、データベースのようにクエリ可能で、javac で検証済み:
7 つの実アプリ APK にわたって出力される 909,689 ファイルすべてが
クリーンにパースされます。
javac を 構文エラーゼロ で通過します; 大文字小文字
違いの名前ペア (X/Cua と X/cua) の各クラスは、最後のものが黙って
上書きするのではなく、それぞれ独自のファイルとして保持されます。(a) -> …、Cls::name、a + b)。v12 の代わりに jadx スタイルのローカル名
(str、getName() → name、Kotlin Intrinsics パラメータ文字列);
IntDef リテラルはそのまま定数としてレンダリングされます
(setVisibility(8) → View.GONE; 組み込みの android-37 ドメイン
テーブル、--symbols で上書き可能); Kotlin の null チェックノイズは
省略され、合成 access$NNN ブリッジは呼び出し箇所にインライン化
されます。DDC_LANG=zh|en で強制; 英語フォールバック)。jdc-core 上に構築されており、
jcdc と共有される
マシン中立コアです。macOS (Homebrew):
brew install ejfkdev/tap/ddc
Windows (Scoop) — バケットを一度追加し、名前でインストールします
(scoop は裸の 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 (任意のプラットフォーム — コンパイルせずに ビルド済みリリースバイナリを取得):
cargo binstall ddc-cli
バイナリ: すべての リリース
は linux-amd64、linux-arm64、windows-amd64、windows-arm64、
macos-amd64、macos-arm64 用の生バイナリ (アーカイブなし) を
同梱しています — 非 macOS ビルドは UPX 圧縮されています。
ソースから (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
完全なオプションと例: ddc --help (ワークフロー別にグループ化された
サブコマンドメニュー)。完全なリファレンス — すべてのオプションの
セマンティクス、すべてのサブコマンドの出力形式と動作 — は
docs/cli.md (中文) にあります。
7 つの実アプリ APK、リリースビルド、3 回実行の平均 (Apple Silicon、6P+12E)。39-APK 検証コーパス (4.08M デコンパイル ファイル、APK ごとの実時間 / ピーク RSS / javac パースゲート) は docs/validation.md (中文) にあります。
| APK | サイズ | 完全デコンパイル | ピーク RSS |
|---|---|---|---|
| reqable | 34 MB | 0.25s | 139 MB |
| Telegram | 62 MB | 5.64s | 1479 MB |
| 139 MB | 5.87s (99,277 ファイル — 大文字小文字違いのクラスペアをすべて保持) | 1116 MB | |
| 226 MB | 5.03s | 1172 MB | |
| weixin | 268 MB | 11.61s | 1339 MB |
| lark | 398 MB | 5.52s | 1831 MB |
| 374 MB | 15.92s | 2459 MB |
同じ APK に対するクエリサブコマンド (セル: 時間 / ピーク RSS;
strings -f <package> --with-locations、パッケージ文字列とメソッド
onCreate に対する findrefs、各アプリのランチャークラスに対する
hierarchy/disasm/getclass):
| Command | reqable | Telegram | weixin | lark | |||
|---|---|---|---|---|---|---|---|
info | 0.12s / 40MB | 0.21s / 88MB | 0.42s / 305MB | 0.65s / 610MB | 0.79s / 550MB | 1.10s / 907MB | 1.08s / 1240MB |
listclasses | 0.04s / 21MB | 0.06s / 84MB | 0.08s / 93MB | 0.13s / 396MB | 0.21s / 417MB | 0.20s / 299MB | 0.27s / 391MB |
manifest | 0.03s / 7MB | 0.03s / 14MB | 0.02s / 20MB | 0.03s / 43MB | 0.04s / 31MB | 0.03s / 28MB | 0.03s / 47MB |
mainactivity | 0.04s / 24MB | 0.06s / 86MB | 0.08s / 224MB | 0.10s / 358MB | 0.13s / 371MB | 0.14s / 421MB | 0.21s / 554MB |
res | 0.02s / 7MB | 0.03s / 15MB | 0.03s / 22MB | 0.05s / 60MB | 0.04s / 32MB | 0.04s / 31MB | 0.05s / 53MB |
largest | 0.05s / 29MB | 0.08s / 78MB | 0.15s / 236MB | 0.31s / 500MB | 0.32s / 500MB | 0.46s / 676MB | 0.66s / 810MB |
strings | 0.05s / 24MB | 0.10s / 85MB | 0.21s / 222MB | 0.39s / 354MB | 0.45s / 395MB | 0.52s / 431MB | 0.81s / 551MB |
findrefs-string | 0.04s / 26MB | 0.05s / 70MB | 0.06s / 214MB | 0.10s / 403MB | 0.12s / 446MB | 0.07s / 335MB | 0.14s / 871MB |
findrefs-method | 0.05s / 26MB | 0.07s / 70MB | 0.07s / 219MB | 0.09s / 410MB | 0.10s / 458MB | 0.10s / 620MB | 0.15s / 896MB |
members | 0.07s / 23MB | 0.21s / 86MB | 0.62s / 222MB | 1.32s / 366MB | 1.17s / 381MB | 1.64s / 443MB | 2.66s / 572MB |
hierarchy | 0.04s / 24MB | 0.05s / 86MB | 0.09s / 212MB | 0.12s / 396MB | 0.14s / 386MB | 0.17s / 429MB | 0.22s / 548MB |
disasm | 0.04s / 23MB | 0.07s / 88MB | 0.09s / 214MB | 0.12s / 371MB | 0.13s / 392MB | 0.16s / 422MB | 0.20s / 533MB |
getclass | 0.05s / 34MB | 0.28s / 182MB | 0.14s / 357MB | 0.33s / 740MB | 0.37s / 942MB | 0.50s / 1235MB | 0.76s / 1651MB |
| アーキテクチャ | クレート、lift/structure/emit パイプライン、DEX バージョン、invoke-custom (中文) |
| CLI リファレンス | すべてのオプションとサブコマンドの詳細 (中文) |
| サブコマンド | 段階的解析リファレンス (中文) |
| ベンチマーク | タイミング、メモリ、方法論、ASC 比較 (中文) |
| パフォーマンスエンジニアリング | 5分 → 6秒: 6 ラウンド、計測された行き止まり (中文) |
| コーパス検証 | 39 の実 APK、4.08M ファイル、javac パースクリーン、発見・修正されたバグ (中文) |
消去された型 (DEX には Signature がない); d8 で desugar された
-$$Lambda$ クラスは別ファイルのまま; いくつかの R8 モンスター
メソッドはタイムアウトにより劣化します (また、期限で切り詰められた
少数のものは実行間で変動する可能性があります); pattern-switch は
desugar されたディスパッチチェーンとしてレンダリングされます。
上記の javac ゲートは構文ゲートです — 意味論的な診断 (Android
クラスパスの欠如、およびまれにレジスタを多用するモンスターメソッド
における型が混同されたローカル) は出力に残ります。詳細:
architecture。
cargo test # 56 tests
MIT © ejfkdev