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

Jack هو سلسلة أدوات إنشاء Android الافتراضية لنظام Android 6.0 - 8.1

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

عن جاك

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

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

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

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

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

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

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

جيل

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

سير العمل لاستيراد مكتبة "جرة" موجودة.

الشكل 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 الحالي. أدوات معالجة كود البايت (مثل JaCoCo) غير مدعومة.

باستخدام جاك

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

قبل الفهرسة

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

مكتبات جاك مع Pre-dex.

الشكل 4. مكتبات جاك مع ما قبل التنفيذ المباشر.

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

التجميع التزايدي

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

يتم تعطيل التجميع التزايدي افتراضيًا (ويتم إلغاء تنشيطه تلقائيًا عند تمكين التقليص أو التشويش أو إعادة التعبئة أو الإرث المتعدد). لتمكين الإصدارات التزايدية، أضف السطر التالي إلى ملف 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 ألف طريقة