
مفكك تحويل من بايت كود جافا إلى جافا، يُستخدم في IntelliJ IDEA.
Fernflower هو أول مفكك تحليلي عملي يعمل لجافا وربما لأي لغة برمجة عالية المستوى بشكل عام.
يتم نشر الإصدارات في مستودع IntelliJ Community.
يرجى إرسال تقارير الأخطاء وطلبات الميزات إلى [متتبع المشكلات] (في النظام الفرعي Java. Decompiler. Engine).
يُضمَّن Fernflower في IntelliJ IDEA ويُستخدم بشكل أساسي لعرض كود جافا أثناء التصحيح أو التنقل عبر ملفات class.
يمكن تشغيل Fernflower من سطر الأوامر في وضع مستقل باستخدام الأمر التالي:
java -jar fernflower.jar [-<option>=<value>]* [<source>]+ <destination>
* تعني صفر مرات أو أكثر
+ تعني مرة واحدة أو أكثر
<source>: ملف أو دليل يحتوي على ملفات سيتم فك ترجمتها.
يتم فحص الدلائل بشكل متكرر.
امتدادات الملفات المسموح بها هي class و zip و jar.
المصادر المسبوقة بـ -e= تعني ملفات "مكتبة" لن يتم فك ترجمتها ولكن سيتم أخذها في الاعتبار عند تحليل
العلاقات بين الفئات أو الطرق.
خاصة إعادة تسمية المعرفات (انظر الخيار ren) يمكن أن تستفيد من معلومات حول الفئات الخارجية.
<destination>: الدليل الوجهة لوضع كود جافا الناتج فيه
<option>=<value>: خيار سطر أوامر مع القيمة المقابلة (انظر "خيارات سطر الأوامر" أدناه).
java -jar fernflower.jar -hes=0 -hdc=0 c:\Temp\binary\ -e=c:\Java\rt.jar c:\Temp\source\
java -jar fernflower.jar -dgs=1 c:\Temp\binary\library.jar c:\Temp\binary\Boot.class c:\Temp\source\
باستثناء mpm و urc، فإن القيمة 1 تعني تفعيل الخيار، 0 - إلغاء التفعيل.
القيمة الافتراضية، إن وجدت، مذكورة بين قوسين.
عادةً، سيتم تغيير الخيارات التالية من قبل المستخدم، إن وجدت: hes, hdc, dgs, mpm, ren, urc أما باقي الخيارات فيمكن تركها كما هي: فهي موجهة لمهندسي الهندسة العكسية المحترفين.
rbr (1): إخفاء طرق الجسرrsy (0): إخفاء أعضاء الفئة الاصطناعيةdin (1): فك ترجمة الفئات الداخليةdc4 (1): طي مراجع الفئات 1.4das (1): فك ترجمة التأكيداتhes (1): إخفاء استدعاء super الفارغhdc (1): إخفاء المنشئ الافتراضي الفارغdgs (0): فك ترجمة التوقيعات العامةner (1): افتراض أن العائد لا يرمي استثناءاتden (1): فك ترجمة التعداداتrgn (1): إزالة استدعاء getClass() عندما يكون جزءًا من عبارة new مؤهلةlit (0): إخراج القيم الرقمية "كما هي"بعض أدوات التعتيم تمنح الفئات وعناصر أعضائها أسماء قصيرة لا معنى لها وفوق كل شيء غامضة. إعادة ترجمة هذا الكود تؤدي إلى عدد كبير من التعارضات. لذلك، من المستحسن السماح لمفكك الترجمة بإعادة تسمية العناصر بدوره، ضمانًا لتفرد كل معرف.
الخيار ren (أي -ren=1) يفعّل وظيفة إعادة التسمية. استراتيجية إعادة التسمية الافتراضية كالتالي:
org.jetbrains.java.decompiler.main.extern.IMemberIdentifierRenamer في الخيار urc
(مثلًا -urc=com.example.MyRenamer) إلى Fernflower. يجب أن تكون الفئة متاحة على classpath التطبيق.يجب أن يكون معنى كل طريقة واضحًا من التسمية: toBeRenamed تحدد ما إذا كان العنصر سيتم إعادة تسميته، بينما الثلاث الأخرى توفر أسماء جديدة للفئات والطرق والحقول على التوالي.
بناء سكريبت بدء تشغيل قابل للتنفيذ:
./gradlew :installDist
يتم إنشاء سكريبت بدء التشغيل في build/install/engine/bin.
Fernflower هو جزء من مشروع IntelliJ Community، المساهمات مرحب بها، والطريقة المفضلة لإرسال التصحيحات هي إنشاء طلب سحب في مستودع مجتمع IntelliJ. عند تقديم التصحيحات، يرجى اتباع إرشادات المساهمة.
Fernflower مرخص بموجب رخصة Apache الإصدار 2.0.
تم تطوير Fernflower في الأصل بواسطة Stiver ولكن تمت صيانته بواسطة JetBrains منذ 2014. تم دمج بعض التصحيحات من ForgeFlower في هذا المستودع. كما تم صيانة مرآة Fernflower بواسطة Andrew McRae لفترة طويلة جدًا.
الاسم الصحيح هو Fernflower، وليس FernFlower.
ascbto (1): تفسير int 1 على أنها boolean true (حل مؤقت لخطأ مترجم)nns (0): السماح بعدم تعيين السمة الاصطناعية (حل مؤقت لخطأ مترجم)uto (1): اعتبار الأنواع غير المسماة كـ java.lang.Object (حل مؤقت لخلل في بنية المترجم)udv (1): إعادة بناء أسماء المتغيرات من معلومات التصحيح، إذا وجدتump (1): إعادة بناء أسماء المعلمات من السمات المقابلة، إذا وجدتrer (1): إزالة نطاقات الاستثناء الفارغةfdi (1): إزالة تضمين هياكل finallympm (0): أقصى وقت معالجة مسموح به لكل طريقة مفككة، بالثواني. 0 يعني عدم وجود حد أعلىren (0): إعادة تسمية الفئات وعناصر الفئة الغامضة (أو المشوشة)urc (-): الاسم الكامل لفئة يقدمها المستخدم تطبق واجهة IIdentifierRenamer. يُستخدم لتحديد معرفات الفئة التي يجب إعادة تسميتها ويوفر أسماء معرفات جديدة (انظر "إعادة تسمية المعرفات")inn (1): التحقق من وجود تعليق @NotNull الخاص بـ IntelliJ IDEA وإزالة الكود المُدرج إذا وجدlac (0): فك ترجمة تعبيرات لامبدا إلى فئات مجهولةnls (0): تعريف حرف سطر جديد لاستخدامه في الإخراج. 0 - '\r\n' (Windows)، 1 - '\n' (Unix)، الافتراضي يعتمد على نظام التشغيلind: سلسلة المسافة البادئة (الافتراضي هو 3 مسافات)crp (0): استخدام أنماط السجل حيثما أمكنcps (0): استخدام switch مع أنماط حيثما أمكنlog (INFO): مستوى تسجيل، القيم الممكنة هي TRACE, INFO, WARN, ERRORiec (0): تضمين classpath بالكامل في السياق عند فك الترجمةisl (1): تضمين تعبيرات لامبدا البسيطةucrc (1): إخفاء المنشئ والدوال الجالبة غير الضرورية للسجلcci (1): التحقق مما إذا كان المورد في try-with-resources يقوم بالفعل بتطبيق واجهة AutoCloseablejvn (0): استبدال أي أسماء متغيرات محلية بأسماء على نمط JADjpr (0): تضمين أسماء المعلمات في تسمية JADpbo (0): إضافة أقواس توضيحية عند خلط العوامل البتية/النقل مع العمليات الحسابية