
مفكك ومشغل تسلسل Java مكتوب بالكامل بلغة Go
English | 简体中文 | الموقع الإلكتروني
مجموعة أدوات Java محمولة ومكتوبة بلغة Go الصرفة — مستخرجة ومقتطعة من yaklang — وتركّز على أربعة أمور:
.class / .jar / .war / .zip → شيفرة Java المصدرية القابلة للقراءة..dex / .apk الأصلية → .jar حتمية، أو مباشرةً
إلى شيفرة Java المصدرية القابلة للقراءة، دون استدعاء أداة dex2jar خارجية..class (المجمّع الثابت،
الحقول، الدوال، الإصدار، أعلام الوصول).مصمّمة للحملية والتضمين:
javajive موحّدة تغلّف القدرات الأربع
جميعها؛ وتبقى الحزم الفرعية متاحة للاستخدام المتقدم.decompile وdex2jar وclassinfo وserial
مبنية على المكتبة القياسية..class / .jar حقيقية و
كتل بيانات مُسلسلة بـ JDK باستخدام javac/java، ثم تتحقق من JavaJive مقابلها
(انظر HARNESS-WORKFLOW.md).utils / codec / log / go-funk
كنواة internal/ دنيا ومكتفية ذاتياً.تدقيق تفاضلي كامل لـ 38 ملف JAR يسجّل صفر انحدارات مقابل خط الأساس الثابت: جميع ملفات JAR العشرين النظيفة الترجمة سابقاً محتفظ بها و26 منها الآن تُترجم بالكامل. تبقى عيوب خط الأساس و4 من الدوال الوهمية الموجودة ظاهرة. انظر نتائج كل ملف JAR وإعادة الإنتاج.
250 رحلة ذهاب وإياب دلالية معزولة تسجّل الترجمة والتحقق من JVM والدوال الوهمية والتساوي وقت التشغيل بشكل منفصل؛ فئات التطبيق الأصلية غائبة عن مسارات الفئات المعاد بناؤها. تشغّل CI التدقيق الدلالي على JDK 17 و21، والمقارنة التاريخية الكاملة، ومصفوفات نظام التشغيل/Go والتزامن. لا تُثبت هذه الفحوصات تكافؤ كل دوال المكتبة. انظر التنفيذ والحدود المتبقية.
أُبلغت الأرقام التالية لـ v0.3.0 في 2026-09-05. وهي ليست نتائج قبول للإصدار الحالي ولا دليلاً على التكافؤ السلوكي.
قِيست على 34 ملف JAR واقعياً (18,759 وحدة مسطّحة) عبر فك الترجمة → إعادة ترجمة javac --release 8
→ إعادة التغليف → التحقق من JVM:
Outer$Inner.java)
تُعاد ترجمتها بـ صفر أخطاء javac، و0 أخطاء نحوية عبر جميع الجرار الـ 34 (تأكيد صارم
تفرضه CI، بحيث لا يمكن لخطأ نوعي أن يختفي خلف فشل محلل معجمي).-Xverify:all ينجح من البداية إلى النهاية (الترميز مطابق بايتًا ببايت
للجار الأصلي وفق مقارنة تفاضلية للاستدعاءات). مثبّت في provenClean.راجع BENCHMARK.md للاطلاع على المنهجية الكاملة وجداول كل جار وأوامر إعادة الإنتاج.
# CLI
go install github.com/yaklang/javajive/cmd/javajive@latest
# Library
go get github.com/yaklang/javajive@latest
أو البناء من المصدر:
git clone https://github.com/yaklang/javajive
cd javajive
go build -o javajive ./cmd/javajive
يتطلب 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
يُكتشف الإدخال عبر magic بدلاً من امتداد اسم الملف. الإخراج هو ملف JAR قابل لإعادة الإنتاج. يُفشل dex2jar التحويل الكامل عند أي class أو method غير مدعوم أو مشوّه؛ ويكتب ملفًا مؤقتًا في الدليل نفسه قبل استبدال الوجهة ولا يستبدل أبدًا ببدائل method.
ترجمة DEX الأصلية هي حاليًا شريحة رأسية أولى صارمة، وليست محوّل تطبيقات Android عامًا. المجموعة الفرعية المختبَرة هي DEX 035 القياسي مع تدفق تحكم عادي من الأعداد الصحيحة/المراجع، والحقول والاستدعاءات (invokes)، وتهيئة new-instance/المُنشئ المقترنة بأمان، والمصفوفات الأساسية. تُختبَر ملفات class المولّدة عبر parser ويتم التحقق منها على JVM، بما في ذلك مسارات التفرع والحقول والاستدعاءات والمُنشئ وint[] القابلة للتنفيذ.
غير مدعوم بعد: عمليات try/catch وmonitor؛ قيم أو opcodes من نوع float وlong وdouble؛ وswitch وتعليمات payload والمصفوفات المملوءة (filled arrays)؛ والاستدعاءات الديناميكية وثوابت method في DEX 038+؛ والتعليقات التوضيحية (annotations) وبيانات التصحيح (debug metadata)؛ وCompactDex؛ وموارد APK أو المكتبات الأصلية. إدخال APK يعني فقط ترجمة الإدخالات المسماة قانونيًا classes.dex وclasses2.dex و... جميع ملفات DEX المحددة يجب أن تنجح بشكل معاملاتي وإلا لن يُنتَج أي JAR.
javajive classinfo Foo.class
class: InvisibleAnnoSeed
super: java/lang/Object
version: 61.0
access: public
constants: 18
fields (0):
methods (2):
<init>()V
run()I
# Serialized binary -> JSON. (-hex: input is a hex string, -: read from stdin)
javajive serial tojson dump.bin
printf 'aced000574000568656c6c6f' | javajive serial tojson -hex -
# JSON -> serialized binary. (default prints hex; with -o writes raw bytes)
javajive serial fromjson dump.json -o out.bin
javajive serial fromjson dump.json # prints hex