Jack هي سلسلة أدوات تجميع Android التلقائية لإصدارات Android من 6.0 إلى 8.1
Jack هي سلسلة أدوات Android التي كانت تجمّع مصدر Java في رمز dex البرمجي الثانوي لنظام Android. لا تحتاج إلى اتّخاذ أي إجراءات مختلفة لاستخدام Jack، ما عليك سوى استخدام أوامر ملف makefile العادية لتجميع الشجرة أو مشروعك. Android 8.1 هو آخر إصدار يستخدم Jack.
لمحة عن Jack
تعمل Jack كما هو موضّح في الشكل 1.
الشكل 1: نظرة عامة على Jack
تنسيق مكتبة Jack
تتضمّن Jack تنسيق ملف .jack خاصًا بها يحتوي على رمز dex الذي تم تجميعه مسبقًا للمكتبة، ما يسمح بتجميع أسرع (pre-dex).
الشكل 2: محتويات ملف مكتبة Jack
Jill
كما هو موضّح في الشكل التالي، تحوّل أداة Jill مكتبات .jar الحالية إلى تنسيق المكتبة الجديد.
الشكل 3: سير العمل لاستيراد مكتبة .jar حالية
خادم تجميع Jack
في أول مرة يتم فيها استخدام Jack، يتم تشغيل خادم تجميع Jack محلي على جهاز الكمبيوتر. ويقوم هذا الخادم بما يلي:
- تسريع عملية التجميع بشكل كبير لأنّه يتجنّب تشغيل جهاز JVM جديد لـ 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 إلى قيمة أقل. |
| تحدث أخطاء في عمليات التجميع بسبب تعذُّر تشغيل خادم في الخلفية | السبب الأكثر ترجيحًا هو أنّ منافذ 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.
لا تتوافق Jack مع أدوات معالجة الرمز البرمجي الثانوي (مثل JaCoCo).
استخدام Jack
تتوافق Jack مع لغة برمجة Java 1.7 وتدمج الميزات الإضافية الموضّحة أدناه.
Pre-dex
عند إنشاء ملف مكتبة Jack، يتم إنشاء .dex للمكتبة وتخزينه داخل ملف مكتبة .jack كـ pre-dex.
عند التجميع، تعيد Jack استخدام pre-dex من كل مكتبة. يتم إجراء pre-dex لجميع المكتبات.
الشكل 4: مكتبات Jack مع pre-dex
لا تعيد Jack استخدام pre-dex للمكتبة إذا تم استخدام التصغير أو الإخفاء أو إعادة إنشاء حزمة المحتوى في عملية التجميع.
التجميع التزايدي
يعني التجميع التزايدي أنّه يتم إعادة تجميع المكوّنات التي تم تعديلها منذ آخر عملية تجميع (والتبعيات الخاصة بها) فقط. يمكن أن يكون التجميع التزايدي أسرع بكثير من التجميع الكامل عندما تكون التغييرات محدودة بمجموعة من المكوّنات.
يتم إيقاف التجميع التزايدي بشكل تلقائي (ويتم إيقافه تلقائيًا عند تفعيل التصغير أو الإخفاء أو إعادة إنشاء حزمة المحتوى أو multi-dex legacy). لتفعيل عمليات الإصدار التزايدية، أضِف السطر التالي إلى ملف 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(لا تعمل Jack على التحسين) -
-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".
دعم ملفات DEX المتعددة
توفّر Jack دعمًا مضمّنًا وmulti-dex legacy. بما أنّ ملفات dex محدودة بـ 65 ألف طريقة، يجب تقسيم التطبيقات التي تحتوي على أكثر من 65 ألف طريقة إلى ملفات dex متعددة. لمزيد من التفاصيل، يُرجى الرجوع إلى مقالة تفعيل multi-dex للتطبيقات التي تحتوي على أكثر من 64 ألف طريقة