التجميع باستخدام Jack

كانت أداة Jack هي سلسلة أدوات الإنشاء التلقائية لنظام التشغيل Android في الإصدارات من 6.0 إلى 8.1، وكانت تُستخدَم لتجميع رمز مصدر Java في رمز بايت dex لنظام التشغيل Android، كما هو موضّح في الشكل 1:

نظرة عامة على "جاك"

الشكل 1: نظرة عامة على "جاك"

يحتوي تنسيق الملف .jack على رمز dex المجمَّع مسبقًا للمكتبة، ما يتيح تجميعًا أسرع (pre-dex).

محتويات ملف مكتبة Jack

الشكل 2: محتويات ملف مكتبة Jack

Jill tool

تحوّل أداة Jill مكتبات .jar الحالية إلى تنسيق مكتبة .jack الجديد، كما هو موضّح في الشكل 3:

سير العمل لاستيراد مكتبة `jar.` حالية

الشكل 3: سير العمل لاستيراد مكتبة .jar حالية

خادم تجميع Jack

في المرة الأولى التي يتم فيها استخدام Jack، يتم تشغيل خادم تجميع Jack محلي على جهاز الكمبيوتر. هذا الخادم:

  • يؤدي ذلك إلى تسريع عملية الإنشاء بشكل كبير لأنّه يتجنّب تشغيل جهاز افتراضي جديد لبيئة وقت التشغيل Java (JRE) الخاصة بالمضيف، وتحميل رمز Jack، وتهيئة Jack، وتسخين JIT في كل عملية تجميع. وتوفّر أيضًا أوقات تجميع جيدة جدًا أثناء عمليات التجميع الصغيرة (على سبيل المثال، في الوضع التزايدي).
  • هذا الخيار هو حلّ قصير الأمد للتحكّم في عدد عمليات تجميع Jack المتوازية. يتجنّب الخادم إرهاق جهاز الكمبيوتر (مشكلة في الذاكرة أو القرص) لأنّه يحدّ من عدد عمليات التجميع المتوازية.

يتم إيقاف خادم Jack تلقائيًا بعد فترة من عدم النشاط بدون أي تجميع. يستخدم منفذَي TCP على واجهة المضيف المحلي ولا يتوفّر خارجيًا. يمكن تعديل جميع المَعلمات (مثل عدد عمليات التجميع المتوازية والمهلة وأرقام المنافذ) من خلال تعديل الملف $HOME/.jack.

ملف ‎$HOME/.jack

يحتوي الملف $HOME/.jack على الإعدادات التالية لمتغيرات خادم Jack في بنية bash كاملة:

  • تفعّل السمة SERVER=true ميزة الخادم في Jack.
  • SERVER_PORT_SERVICE=8072 يضبط رقم منفذ TCP الخاص بالخادم لأغراض التجميع.
  • SERVER_PORT_ADMIN=8073 يضبط رقم منفذ TCP الخاص بالخادم لأغراض إدارية.
  • SERVER_COUNT=1 غير مستخدَم.
  • يضبط SERVER_NB_COMPILE=4 الحد الأقصى لعدد عمليات التجميع المتوازية المسموح بها. يضبط SERVER_TIMEOUT=60 عدد ثواني عدم النشاط التي يجب أن ينتظرها الخادم بدون أي تجميع قبل إيقاف تشغيله. تضبط SERVER_LOG=${SERVER_LOG:=$SERVER_DIR/jack-$SERVER_PORT_SERVICE.log} الملف الذي يتم فيه كتابة سجلات الخادم. يمكن بشكل تلقائي تحميل قيمة هذا المتغيّر بشكل زائد من خلال متغيّر بيئة.
  • يضبط JACK_VM_COMMAND=${JACK_VM_COMMAND:=java} الأمر التلقائي المستخدَم لتشغيل جهاز JVM على المضيف. بشكلٍ تلقائي، يمكن أن يتم تجاوز قيمة هذا المتغيّر من خلال متغيّر بيئة.

تحديد المشاكل وحلّها في فيديوهات Jack المجمّعة

المشكلة الإجراء
عدم استجابة الكمبيوتر أثناء التجميع أو حدوث أخطاء في عمليات تجميع Jack بسبب خطأ نفاد الذاكرة قلِّل عدد عمليات تجميع Jack المتزامنة من خلال تعديل $HOME/.jack وتغيير SERVER_NB_COMPILE إلى قيمة أقل.
تتعذّر عمليات التجميع بسبب الخطأ Cannot launch background server السبب الأكثر احتمالاً هو أنّ منافذ TCP مستخدَمة حاليًا على جهاز الكمبيوتر. يمكنك تغيير المنافذ من خلال تعديل $HOME/.jack (المتغيّران SERVER_PORT_SERVICE وSERVER_PORT_ADMIN). لإلغاء الحظر، عليك إيقاف خادم تجميع Jack من خلال تعديل $HOME/.jack وتغيير SERVER إلى false. يؤدي ذلك إلى إبطاء عملية التجميع بشكل كبير، وقد يضطرك إلى تشغيل make -j مع التحكّم في التحميل (الخيار -l من make).
تتوقف عملية التجميع بدون إحراز أي تقدّم لإزالة الحظر، عليك إيقاف خادم Jack الذي يعمل في الخلفية باستخدام jack-admin kill-server) ثم إزالة الدلائل المؤقتة المضمّنة في jack-$USER من دليلك المؤقت (/tmp أو $TMPDIR).

العثور على سجلّ Jack

إذا نفّذت الأمر make مع هدف dist، سيكون سجلّ Jack متاحًا في $ANDROID_BUILD_TOP/out/dist/logs/jack-server.log. بخلاف ذلك، يمكنك العثور على السجلّ من خلال تنفيذ jack-admin server-log. في حال حدوث أعطال متكررة في Jack، يمكنك الحصول على سجلّ أكثر تفصيلاً من خلال ضبط المتغيّر التالي:

export ANDROID_JACK_EXTRA_ARGS="--verbose debug --sanity-checks on -D sched.runner=single-threaded"

استخدِم أوامر makefile العادية لتجميع الشجرة (أو مشروعك) وإرفاق المخرجات والأخطاء العادية. لإزالة سجلّات الإنشاء المفصّلة، نفِّذ الأمر التالي:

unset ANDROID_JACK_EXTRA_ARGS

القيود المفروضة على Jack

بشكلٍ تلقائي، يمكن لمستخدم واحد فقط استخدام خادم Jack على جهاز كمبيوتر. لإتاحة استخدام التطبيق من قِبل مستخدمين إضافيين، اختَر أرقام منافذ مختلفة لكل مستخدم واضبط SERVER_NB_COMPILE وفقًا لذلك. يمكنك أيضًا إيقاف خادم Jack عن طريق ضبط SERVER=false في $HOME/.jack. تجميع مجموعة اختبار التوافق (CTS) بطيء بسبب عملية الدمج الحالية vm-tests-tf. لا تتوافق أدوات تعديل الرموز الثنائية (مثل JaCoCo) مع هذه الميزة.

استخدام Jack

يتوافق Jack مع لغة البرمجة Java 1.7 ويتضمّن الميزات الإضافية الموضّحة في هذا القسم. استخدِم أوامر makefile العادية لتجميع الشجرة أو مشروعك.

Pre-dex

عند إنشاء ملف مكتبة Jack، يتم إنشاء .dex للمكتبة وتخزينه داخل ملف المكتبة .jack كملف pre-dex. عند التجميع، يعيد Jack استخدام ملف pre-dex من كل مكتبة. جميع المكتبات مُعدّة مسبقًا.

مكتبات Jack مع pre-dex

الشكل 4. مكتبات Jack مع pre-dex

لا يعيد Jack استخدام مكتبة pre-dex إذا تم استخدام التصغير أو التشويش أو إعادة التغليف في عملية التجميع.

التحويل البرمجي التزايدي

تعني عملية التجميع التدريجي أنّه تتم إعادة تجميع المكوّنات التي تم تعديلها منذ آخر عملية تجميع (والعناصر التابعة لها) فقط. يمكن أن تكون عملية التجميع التدريجي أسرع بكثير من عملية التجميع الكاملة عندما تقتصر التغييرات على مجموعة من المكوّنات.

يتم إيقاف ميزة "التجميع التدريجي" تلقائيًا (ويتم إيقافها تلقائيًا عند تفعيل ميزة التصغير أو التشويش أو إعادة التجميع أو ميزة multidex القديمة). لتفعيل عمليات الإنشاء التزايدي، أضِف السطر التالي إلى ملف Android.mk الخاص بالمشروع الذي تريد إنشاؤه بشكل تزايدي:

LOCAL_JACK_ENABLED := incremental

تقليل الحجم والتشويش

يستخدم Jack ملفات إعداد ProGuard لتفعيل التصغير والتشويش. تشمل الخيارات الشائعة ما يلي:

  • @
  • -include
  • -basedirectory
  • -injars
  • -outjars (يمكن استخدام ملف JAR واحد فقط)
  • -libraryjars
  • -keep
  • -keepclassmembers
  • -keepclasseswithmembers
  • -keepnames
  • -keepclassmembernames
  • -keepclasseswithmembernames
  • -printseeds

تشمل خيارات التصغير ما يلي:

  • -dontshrink

تشمل خيارات التشويش ما يلي:

  • -dontobfuscate
  • -printmapping
  • -applymapping
  • -obfuscationdictionary
  • -classobfuscationdictionary
  • -packageobfuscationdictionary
  • -useuniqueclassmembernames
  • -dontusemixedcaseclassnames
  • -keeppackagenames
  • -flattenpackagehierarchy
  • -repackageclasses
  • -keepattributes
  • -adaptclassstrings

تشمل الخيارات التي تم تجاهلها ما يلي:

  • -dontoptimize (لم يفعّل جاك التحسين)
  • -dontpreverify (لا يتحقّق Jack مسبقًا من صحة المعلومات)
  • -skipnonpubliclibraryclasses
  • -dontskipnonpubliclibraryclasses
  • -dontskipnonpubliclibraryclassmembers
  • -keepdirectories
  • -target
  • -forceprocessing
  • -printusage
  • -whyareyoukeeping
  • -optimizations
  • -optimizationpasses
  • -assumenosideeffects
  • -allowaccessmodification
  • -mergeinterfacesaggressively
  • -overloadaggressively
  • -microedition
  • -verbose
  • -dontnote
  • -dontwarn
  • -ignorewarnings
  • -printconfiguration
  • -dump

إعادة إنشاء حزمة محتوى التطبيق

يستخدم Jack ملفات إعداد jarjar لإعادة التغليف. على الرغم من أنّ Jack متوافق مع أنواع قواعد rule، إلا أنّه غير متوافق مع أنواع قواعد zap أو keep.

توافق Multidex

توفّر أداة Jack إمكانية استخدام multidex المدمجة والقديمة. وبما أنّ ملفات dex تقتصر على 65 ألف طريقة، يجب تقسيم التطبيقات التي تتضمّن أكثر من 65 ألف طريقة إلى ملفات dex متعددة. لمزيد من المعلومات، يُرجى الاطّلاع على تفعيل multidex للتطبيقات التي تتضمّن أكثر من 64 ألف طريقة.