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

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

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

لمحة عن جاك

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

نظرة عامة على Jack

الشكل 1: نظرة عامة على Jack

تنسيق مكتبة Jack

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

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

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

جيل

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

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

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

خادم تجميع Jack

.

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

  • تحقّق هذه الطريقة تسريعًا أساسيًا لأنّها تتجنّب تشغيل JRE JVM مضيف جديد، وتحميل رمز Jack، وإعداد Jack، وبدء JIT عند كل عملية compiling. ويقدّم أيضًا أوقات تجميع جيدة جدًا أثناء عمليات التجميع الصغيرة (على سبيل المثال، في الوضع المتزايد).
  • هو حلّ قصير المدى للتحكّم في عدد عمليات تجميع 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 الحد الأقصى لعدد عمليات compilation المشترَكة المسموح بها. تُستخدَم القيمة SERVER_TIMEOUT=60 لضبط عدد الثواني التي يجب أن ينتظرها الخادم بدون أي عملية تجميع قبل إيقاف نفسه. SERVER_LOG=${SERVER_LOG:=$SERVER_DIR/jack-$SERVER_PORT_SERVICE.log} يضبط الملف الذي يتم فيه كتابة سجلات الخادم. يمكن أن يتم تلقائيًا تحميل متغيّر البيئة بشكل زائد على هذا المتغيّر.
  • تضبط JACK_VM_COMMAND=${JACK_VM_COMMAND:=java} الأمر التلقائي المستخدَم لتشغيل Java Virtual Machine على المضيف. بشكلٍ تلقائي، يمكن تحميل هذا المتغيّر بشكل زائد من خلال متغيّر البيئة.

تحديد وحلّ المشاكل في الفيديوهات المجمّعة لـ Jack

المشكلة الإجراء
لا يستجيب جهاز الكمبيوتر أثناء عملية التجميع أو تتعذّر عمليات تجميع Jack بسبب خطأ "تعذّر توفّر ذاكرة" يمكنك تقليل عدد مجموعات $HOME/.jack المتزامنة من خلال تعديل $HOME/.jack وتغيير SERVER_NB_COMPILE إلى قيمة أقل.
تعذُّر عمليات التجميع بسبب تعذُّر تشغيل خادم الخلفية السبب الأكثر ترجيحًا هو أنّ منافذ TCP سبق أن تم استخدامها على جهاز الكمبيوتر. يمكنك تغيير التقارير من خلال تعديل $HOME/.jack (المتغيّرانSERVER_PORT_SERVICE و SERVER_PORT_ADMIN). لإزالة الحظر، أوقِف خادم تجميع Jack من خلال تعديل $HOME/.jack وتغيير SERVER إلى false. يؤدي ذلك إلى إبطاء عملية compilation بشكل كبير وقد يضطرك إلى تشغيل make -j باستخدام load control (الخيار -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

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

استخدام Jack

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

تحويل إلى ملفات ‎.dex

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

ربط المكتبات باستخدام أداة "المعالجة المسبقة للتطبيقات"

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

لا يعيد "جاك" استخدام مكتبة ما قبل تحويلها إلى ملف 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 (لا يُجري "جاك" عملية التحقّق المُسبَق)
  • -skipnonpubliclibraryclasses
  • -dontskipnonpubliclibraryclasses
  • -dontskipnonpubliclibraryclassmembers
  • -keepdirectories
  • -target
  • -forceprocessing
  • -printusage
  • -whyareyoukeeping
  • -optimizations
  • -optimizationpasses
  • -assumenosideeffects
  • -allowaccessmodification
  • -mergeinterfacesaggressively
  • -overloadaggressively
  • -microedition
  • -verbose
  • -dontnote
  • -dontwarn
  • -ignorewarnings
  • -printconfiguration
  • -dump

إعادة إنشاء حزمة محتوى التطبيق

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

إتاحة ملفات DEX متعددة

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