التجميع باستخدام Jack (AOSP 6.0 - 8.1)

‫Jack هي سلسلة أدوات إنشاء Android التلقائية للإصدارات 6.0 إلى 8.1 من Android

‫Jack هي مجموعة أدوات Android التي كانت تحوّل مصدر Java إلى رمز بايت Android dex. ليس عليك اتّخاذ أي إجراءات مختلفة لاستخدام Jack، بل عليك فقط استخدام أوامر makefile العادية لتجميع الشجرة أو مشروعك. ‫Android 8.1 هو آخر إصدار يستخدم Jack.

لمحة عن "جاك"

يعمل جاك كما هو موضّح في الشكل 1.

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

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

تنسيق مكتبة Jack

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

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

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

جيل

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

سير العمل لاستيراد مكتبة `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 ويتضمّن الميزات الإضافية الموضّحة أدناه.

Pre-dex

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

مكتبات Jack مع عملية التحويل المسبق إلى DEX

الشكل 4. مكتبات Jack مع عملية التحويل المسبق إلى 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 متوافق مع أنواع القواعد "القاعدة"، إلا أنّه غير متوافق مع أنواع القواعد "zap" أو "keep".

توافق Multidex

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