کامپایل با جک (AOSP 6.0 - 8.1)

جک زنجیره ابزار ساخت پیش‌فرض اندروید برای اندروید 6.0 - 8.1 است

جک یک زنجیره ابزار اندروید است که منبع جاوا را در بایت کد Android dex کامپایل می کند. برای استفاده از جک لازم نیست کار متفاوتی انجام دهید - فقط از دستورات استاندارد makefile خود برای کامپایل درخت یا پروژه خود استفاده کنید. اندروید 8.1 آخرین نسخه ای است که از جک استفاده می کند.

درباره جک

جک همانطور که در شکل 1 نشان داده شده است کار می کند.

بررسی اجمالی جک

شکل 1. نمای کلی جک.

فرمت کتابخانه جک

جک فرمت فایل .jack خود را دارد که حاوی کد dex از پیش کامپایل شده برای کتابخانه است که امکان کامپایل سریعتر را فراهم می کند (pre-dex).

محتویات فایل کتابخانه جک.

شکل 2. محتویات فایل کتابخانه جک.

جیل

همانطور که در شکل زیر نشان داده شده است، ابزار Jill کتابخانه های .jar موجود را به فرمت کتابخانه جدید ترجمه می کند.

گردش کار برای وارد کردن کتابخانه «jar.» موجود.

شکل 3. گردش کار برای وارد کردن یک کتابخانه .jar موجود.

سرور کامپایل جک

اولین باری که از جک استفاده می شود، یک سرور کامپایل محلی جک را روی رایانه شما راه اندازی می کند. این سرور:

  • سرعت ذاتی را به ارمغان می آورد زیرا از راه اندازی یک میزبان جدید JRE JVM، بارگذاری کد جک، تنظیم اولیه جک و گرم کردن JIT در هر کامپایل جلوگیری می کند. همچنین زمان های کامپایل بسیار خوبی را در طول کامپایل های کوچک (مثلاً در حالت افزایشی) فراهم می کند.
  • یک راه حل کوتاه مدت برای کنترل تعداد کامپایل های جک موازی است. سرور از بارگذاری بیش از حد رایانه شما (مشکل حافظه یا دیسک) جلوگیری می کند زیرا تعداد کامپایل های موازی را محدود می کند.

سرور جک خود را پس از مدت زمان بیکاری و بدون کامپایل خاموش می کند. از دو پورت TCP در رابط لوکال هاست استفاده می کند و به صورت خارجی در دسترس نیست. تمام پارامترها (تعداد کامپایل‌های موازی، مهلت زمانی، تعداد پورت‌ها و غیره) را می‌توان با ویرایش فایل $HOME/.jack تغییر داد.

فایل $HOME/.jack

فایل $HOME/.jack شامل تنظیمات زیر برای متغیرهای سرور جک در یک دستور کامل bash است:

  • SERVER=true ویژگی سرور جک را فعال می کند.
  • 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 را در هاست تنظیم می‌کند. به طور پیش فرض، این متغیر می تواند توسط متغیر محیطی بارگذاری شود.

عیب یابی مجموعه های جک

مسئله عمل
رایانه شما در حین کامپایل کردن پاسخ نمی دهد یا با خطای کامپایل های جک در خطای «فقدان حافظه» مواجه می شوید. با ویرایش $HOME/.jack و تغییر SERVER_NB_COMPILE به مقدار کمتر، تعداد کامپایل‌های جک همزمان را کاهش دهید.
کامپایل‌ها در سرور پس‌زمینه راه‌اندازی نمی‌شود محتمل ترین علت این است که پورت های TCP قبلاً در رایانه شما استفاده شده است. با ویرایش $HOME/.jack (متغیرهای SERVER_PORT_SERVICE و SERVER_PORT_ADMIN ) پورت ها را تغییر دهید. برای رفع انسداد وضعیت، سرور کامپایل جک را با ویرایش $HOME/.jack و تغییر SERVER به false غیرفعال کنید. متأسفانه این امر به طور قابل توجهی سرعت کامپایل شما را کند می کند و ممکن است مجبور شوید make -j با کنترل بار راه اندازی کنید (گزینه -l از make ).
کامپایل بدون هیچ پیشرفتی گیر می کند برای رفع انسداد، سرور پس‌زمینه جک را با استفاده از jack-admin kill-server بکشید، سپس دایرکتوری‌های موقت موجود در jack-$USER دایرکتوری موقت خود را حذف کنید ( /tmp یا $TMPDIR ).

یافتن سیاهه جک

اگر دستور make را با هدف دور اجرا کردید، گزارش جک در $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

محدودیت های جک

  • به طور پیش فرض، سرور جک می تواند تنها توسط یک کاربر در رایانه استفاده شود. برای پشتیبانی از کاربران اضافی، شماره پورت های مختلف را برای هر کاربر انتخاب کنید و SERVER_NB_COMPILE بر اساس آن تنظیم کنید. همچنین می توانید با تنظیم SERVER=false در $HOME/.jack سرور جک را غیرفعال کنید. کامپایل CTS به دلیل ادغام فعلی vm-tests-tf کند است. ابزارهای دستکاری بایت کد (مانند JaCoCo) پشتیبانی نمی شوند.

با استفاده از جک

جک از زبان برنامه نویسی جاوا 1.7 پشتیبانی می کند و ویژگی های اضافی توضیح داده شده در زیر را ادغام می کند.

پیش دکسینگ

هنگام تولید یک فایل کتابخانه جک، .dex کتابخانه تولید و در داخل فایل کتابخانه .jack به عنوان پیش دکس ذخیره می شود. هنگام کامپایل، جک از پیش دکس هر کتابخانه دوباره استفاده می کند. همه کتابخانه ها از پیش دکس شده اند.

کتابخانه های جک با پیش دکس.

شکل 4. کتابخانه های جک با پیش دکس.

جک از پیش‌دکس کتابخانه استفاده مجدد نمی‌کند اگر در مجموعه از کوچک‌شدن، مبهم‌سازی یا بسته‌بندی مجدد استفاده شود.

تالیف افزایشی

کامپایل افزایشی به این معنی است که فقط مؤلفه هایی که از آخرین کامپایل لمس شده اند (و وابستگی های آنها) دوباره کامپایل می شوند. زمانی که تغییرات محدود به مجموعه‌ای از مؤلفه‌ها باشد، کامپایل افزایشی می‌تواند به طور قابل توجهی سریع‌تر از کامپایل کامل باشد.

کامپایل افزایشی به‌طور پیش‌فرض غیرفعال است (و به‌طور خودکار در صورت فعال شدن کوچک‌شدن، مبهم‌سازی، بسته‌بندی مجدد یا چند dex قدیمی غیرفعال می‌شود). برای فعال کردن ساخت‌های افزایشی، خط زیر را به فایل Android.mk پروژه‌ای که می‌خواهید به صورت تدریجی بسازید اضافه کنید:

LOCAL_JACK_ENABLED := incremental

کوچک شدن و تیرگی

جک از فایل های پیکربندی ProGuard برای فعال کردن کوچک شدن و مبهم کردن استفاده می کند.

گزینه های رایج شامل موارد زیر است:

  • @
  • -include
  • -basedirectory
  • -injars
  • -outjars (فقط 1 شیشه خروجی پشتیبانی می شود)
  • -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 برای بسته بندی مجدد استفاده می کند. در حالی که جک با انواع قانون "قاعده" سازگار است، با انواع قانون "zap" یا "حفظ" سازگار نیست.

پشتیبانی از Multidex

جک پشتیبانی داخلی و قدیمی چند دکس را ارائه می دهد. از آنجایی که فایل‌های dex به روش‌های 65K محدود می‌شوند، برنامه‌هایی با روش‌های بیش از 65K باید به چندین فایل dex تقسیم شوند. برای جزئیات بیشتر، به Enable multidex برای برنامه هایی با روش های بیش از 64K مراجعه کنید