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

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

‫Jack هو سلسلة أدوات Android التي تُجمِّع رمز مصدر Java إلى رمز برمجي bytecode لنظام التشغيل Android. لن تضطر إلى القيام بأي شيء مختلف لاستخدام Jack - ما عليك سوى استخدام أوامر ملفات makefile القياسية لتجميع الشجرة أو مشروعك. ‫Android 8.1 هو الإصدار الأخير الذي يستخدم Jack.

لمحة عن جاك

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

نظرة عامة حول Jack.

الشكل 1. نظرة عامة حول Jack.

تنسيق مكتبة Jack

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

محتوى ملف مكتبة Jack

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

جيل

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

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

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

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

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

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

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

ملف $HOME/.jack

يحتوي ملف $HOME/.jack على الإعدادات التالية لمتغيّرات Jack server في بنية 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} الأمر التلقائي المستخدَم لبدء تشغيل Java Virtual Machine (آلة Java الافتراضية) على المضيف. وبشكل تلقائي، يمكن تحميل هذا المتغير بشكل زائد عن طريق متغير البيئة.

تحديد وحلّ المشاكل في الفيديوهات المجمّعة لـ 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"

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

unset ANDROID_JACK_EXTRA_ARGS

قيود المقبس

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

استخدام Jack

يتوافق Jack مع لغة البرمجة Java 1.7 ويدمج الخصائص الإضافية الموضّحة أدناه.

سابقة سابقة

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

مكتبات Jack باستخدام دليل مبدئي

الشكل 4. ربط المكتبات باستخدام أداة pre-dex

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

تجميع متزايد

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

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

LOCAL_JACK_ENABLED := incremental

تقليص وتشويش

يستخدم جاك ملفات إعدادات 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 دعمًا متعدّدًا قديمًا ومدمجًا. بما أنّ ملفات dex محدودة بـ 65 ألف طريقة، يجب تقسيم التطبيقات التي تحتوي على أكثر من 65 ألف طريقة إلى ملفات dex متعدّدة. لمزيد من التفاصيل، يُرجى الاطّلاع على مقالة تفعيل حزمة multidex للتطبيقات التي تحتوي على أكثر من 64 ألف طريقة.