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

تنسيق مكتبة جاك
يحتوي .jack
على تنسيق ملف.

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

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