3 Liked

كومبايلر الاندرويد ومابعد Jack & Jill

مع التحديث رقم 5.0 للأندرويد “Lollipop” أطلقت قوقل أداتين جديدتين؛ Jack اختصاراً لـ (Java Android Compiler Kit) وأداة Jill واختصاراً لـ (Jack Intermediate Library Linker) والتي ستستخدم كبديل لـ javac + dx

ماقبل Jack & Jill

لن ادخل في تفاصيل عمليات الكومبايلر جميعها ولكن ساركز في مقالتنا هذه على موضوع تحويل كود الجافا الى ملف DEX وهو مايفهمه الاندرويد.

javac-4-2

كما نعرف ان قوقل قامت بتعديل الـ JVM إلى نسخة معدلة تتناسب مع الهواتف وهي ما تسمى بالـ Dalvik او ART (في نسخ الأندرويد L ومافوق) وبسبب ذلك لا يستطيع الـ Dalvik فهم الـ java bytecode مباشرة لذلك قامت قوقل بنشر أداة جديدة تسمى DEX تعمل بجانب كومبايلر الجافا Javac.

Javac وظيفته تحويل ملفات الـ Java الى ملفات .class وهي ماتسمى بالـ Java Bytecode بينما اداة DEX وظيفتها تحويل ملفات الـJava bytecode الى ملفات Android Bytecode بامتداد .dx

ما يجب التنبيه إليه أيضاً أن معظم المكتبات والملفات الخارجية والتي نضمنها من ضمن مشاريعنا عادةً تكون كملفات jar او aar والتي تعتبر كملفات مضغوطة تحتوي غالباً على ملفات .class  لذلك في المرحلة التي نقوم فيها بتحويل مشروعنا إلى ملفات dex تقوم الأداة بتحويل جميع المكتبات والملفات المضمنة إلى ملفات dex

معالجة ملفات الـ Bytecode

مع مرور الوقت ومع كثرة المشاريع وكثرة المشاكل التي ظهرت بعد ذلك، قام عدد من المطورين بتطوير أدوات وإضافات تستخدم في تحسين عملية تحويل الكود إلى bytecode وأيضاً للتلاعب ببعض الأكواد لدواعي أمنية وغيرها من الأمور. من أشهر الأدوات التي ظهرت مع الوقت هي:

هذه الأدوات أعطتنا كمطورين العديد من المزايا والخصائص، فعلى سبيل المثال أداة Proguard تقوم بحذف الأكواد الغير مستخدمة وتقلل من حجم الملفات وأيضاً تقوم بالتلاعب ببعض الأكواد ليصعب فك تشفيرها. أما الأداة Retrolambda فهي تقوم بتحويل أوامر الـ Lambda الموجودة في java 8 الى اوامر يستطيع الاندرويد التعامل معها.

transform1-1-2

جميع الأدوات التي ذكرناها تقوم بتحويل ملفات الـ .class الى ملفات .class معدلة, فهي تعمل كوسيط بين javac و Dex  .

Jack & Jill

مع ازدياد عدد الأدوات التي ظهرت للأندرويد ومع كثرة المشاكل التي وجدت في دعم الـ java 8 وغيرها من الأمور، قامت قوقل بنشر أداتين تستبدل جميع ما كان موجود مسبقاً؛ الأداة Jack هي الكومبايلر وتعمل بدلاً عن javac و dex.

jack1

الكومبايلر jack يقوم بتحويل كود الـ java إلى ملفات dex مباشرة، وهذا يعني أننا استغنينا عن ملفات الـ class. ولكن ماذا عن المكتبات والملفات الخارجية؟ فكما ذكرنا سابقاً، أنها تكون على هيئة ملفات class. مضمنة داخل ملف مضغوط على شكل jar او aar، فكيف سيقوم الكومبايلر jack بتحويلها؟

jyll2

الأداة jill هي الحل! وظيفة هذه الأداة هي تحويل ملفات الطرف الثالث والتي تكون على شكل ملفات .class إلى ملفات jayce والتي يستطيع كومبايلر jack التعامل معها وتضمينها في ملفات الـ dex

ولكن ماذا عن الأدوات التي ذكرناها سابقاً مثل Proguard وغيرها؟ الأداة jill لا تستطيع التعامل معها كونها ليست ملفات class وإنما هي أدوات تتلاعب بملفات الـ class!! لحسن الحظ، Jack يحتوي على بعض الأدوات الخاصة به والمضمنة معه، وبالتالي الأداة Proguard مثلاً لسنا بحاجتها بعد اليوم، بما أنها موجودة ضمن Jack. أيضاً لا نحتاج إلى الأداة Retrolambda، حيث أن الأداة Jack تستطيع التعامل مع الـ Lambda بشكل مباشر، بالإضافة إلى دعمها لجافا 8 (ابتداءاً من إصدار الأندرويد Nougat)

التعامل مع Proguard

jack_jill-2

في مقالة لـ Eric Lafortune من موقع Guardsquare ذكر أن الكومبايلر Jack يستطيع تنفيذ بعض الأوامر الخاصة بالـ Proguard وذلك بتضمينها ضمن ملف نصي يقوم الكومبايلر بقراءته في مرحلة الـ Compiling.

سلبيات Jack

  • Lint detectors والمستخدمة عادةً في تحليل الأكواد والبحث عن مشاكله غير مدعوم ويرجع السبب في أنها تعمل على مستوى ملفات الـ class.
  • اداة Jacoco والتي تستخدم في تقارير الـ Unit Test غير مدعومة حتى الان
  • بعض المكتبات والتي تعتمد على خاصية الـ Anotation مثل مكتبات Retrofit و Butterknife تحتاج إلى بعض التعديلات من قِبل المطورين أنفسهم.

تفعيل Jack

Jack & Jack & Jill مدعومة في Build Tools version 21.1.1 وما فوق، ولتفعيلها قم بتعديل ملف الـ Gradle وتفعيل الخيار Jack كالتالي::

 

 

Leave a Reply