تجميع مع Jack لنظام Android 6.0–8.1

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

حول جاك

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

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

تنسيق مكتبة جاك

يحتوي .jack على تنسيق ملف.

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

جيل

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

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

خادم تجميع جاك

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

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

يغلق خادم 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 المتزامنة عن طريق تحرير $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 ).

البحث عن سجل جاك

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

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

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

unset ANDROID_JACK_EXTRA_ARGS

قيود جاك

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

باستخدام جاك

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

ما قبل dexing

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

مكتبات جاك مع ما قبل dex
الشكل 4. مكتبات جاك مع ما قبل dex

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

تجميع تزايدي

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

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

LOCAL_JACK_ENABLED := incremental

تقلص وتشويش

يستخدم Jack ملفات تكوين ProGuard لتمكين التقلص والتشويش.

تشمل الخيارات الشائعة ما يلي:

  • @
  • -include
  • -basedirectory
  • -injars
  • -outjars (دعم جرة إخراج واحدة فقط)
  • -libraryjars
  • -keep
  • -keepclassmembers
  • -keepclasseswithmembers
  • -keepnames
  • -keepclassmembernames
  • -keepclasseswithmembernames
  • -printseeds

تشمل خيارات الانكماش ما يلي:

  • -dontshrink

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

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

تتضمن الخيارات التي تم تجاهلها ما يلي:

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

إعادة التعبئة

يستخدم جاك ملفات تكوين jarjar للقيام بإعادة التحزيم. بينما يتوافق Jack مع أنواع قواعد "القاعدة" ، إلا أنه لا يتوافق مع أنواع قواعد "zap" أو "keep".

دعم Multidex

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