
مُفكِّك تجميع Android DEX → Java بلغة Rust، مُصمَّم للسرعة — تطبيقات كاملة في ثوانٍ، واستعلامات في أجزاء من الثانية. تحليل تدريجي، ومخرجات مُتحقَّق منها عبر javac، وكل إصدارات DEX، ودعم متعدد dex وحاويات XAPK/APKS/APKM.
English | 简体中文
يقوم ddc بفكِّ تجميع بايت كود DEX الخاص بأندرويد وإعادته إلى Java قابلة للقراءة — على
مستوى التطبيقات الواقعية، وقابل للاستعلام كقاعدة بيانات، ومُتحقَّق منه بـ javac:
كل ملف من الملفات الـ 909,689 التي يُخرجها عبر سبعة تطبيقات APK واقعية
يُحلَّل بنجاح دون أخطاء.
javac بـ صفر أخطاء نحوية؛ كل صنف من
زوج أسماء متغايرة الحالة (X/Cua مقابل X/cua) يُحفظ كملف
مستقل بدلاً من أن يطمسه الأخير بصمت.(a) -> …، Cls::name، a + b).str، getName() → name، سلاسل معاملات Kotlin Intrinsics) بدلاً من v12؛
تُعرض قيم IntDef الحرفية كثوابتها مباشرةً
(setVisibility(8) → View.GONE؛ جدول نطاق android-37 مدمج،
و--symbols يتجاوزه)؛ تُحذف ضوضاء فحوصات null الخاصة بـ Kotlin وتُضمَّن
جسور access$NNN الاصطناعية في مواضع استدعائها.--fast (تخطي
التبسيط، مع الحفاظ على التنسيق).ddc serve كل استعلام كمسار REST (GET مع معاملات
استعلام أو POST مع جسم JSON) بالإضافة إلى GET /openapi.json ونقطة نهاية MCP قابلة للبث عند /mcp — وجِّه عميل
MCP إلى http://addr/mcp؛ ddc http مخصص لـ REST فقط (بلا
/mcp)؛ ddc mcp stdio|http يشغّل الأوامر نفسها كأدوات MCP
مع مخططات إدخال وإخراج. أوامر الاستعلام تقبل --format auto|text|table|markdown|md|json|jsonl (auto: جدول على طرفية،
والصيغة النصية المستقرة عند التوجيه عبر أنبوب).DDC_LANG=zh|en يفرض اللغة؛ مع الرجوع إلى الإنجليزية).jdc-core، النواة
المحايدة تجاه الآلة المشتركة مع
jcdc.macOS (Homebrew):
brew install ejfkdev/tap/ddc
Windows (Scoop) — أضف الـ bucket مرة واحدة، ثم ثبّت بالاسم (لا يقوم 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 (中文).
سبعة تطبيقات APK واقعية، إصدار release، مقاسة بعد فترة تهدئة (Apple Silicon، 6P+12E). مجموعة التحقق المكوّنة من 39 APK (4.08M ملف مفكوك، زمن الجدار لكل APK / ذروة RSS / بوابة تحليل javac) موجودة في docs/validation.md (中文).
| APK | الحجم | فك الترجمة الكامل | ذروة RSS |
|---|---|---|---|
| reqable | 34 MB | 0.57s | 162 MB |
| Telegram | 62 MB | 4.50s | 786 MB |
| 139 MB | 13.6s (99,483 ملفًا — جميع أزواج الفئات المتغايرة في حالة الأحرف محفوظة) | 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 |
أوامر الاستعلام الفرعية على نفس تطبيقات APK (الخلايا: الوقت / ذروة RSS؛
strings -f <package> --with-locations، وfindrefs على سلسلة الحزمة
والدالة onCreate، وhierarchy/disasm/getclass على فئة المشغّل
لكل تطبيق):