پیاده‌سازی گردآورنده هم‌زمان ART

زمان اجرای Android (ART) شامل یک کامپایلر هم‌زمان (JIT) با نمایه‌سازی کد است که به‌طور مداوم عملکرد برنامه‌های Android را درحین اجرا بهبود می‌بخشد. کامپایلر JIT کامپایلر پیش‌از موعد (AOT) فعلی ART را تکمیل می‌کند و عملکرد زمان اجرا را بهبود می‌بخشد، فضای ذخیره‌سازی را ذخیره می‌کند، و سرعت به‌روزرسانی‌های برنامه و سیستم را افزایش می‌دهد. این فناوری همچنین با جلوگیری از کند شدن سیستم درطول به‌روزرسانی‌های خودکار برنامه یا بازکامپایل برنامه‌ها درطول به‌روزرسانی‌های ازطریق هوا (OTA)، کامپایلر AOT را بهبود می‌بخشد.

اگرچه JIT و AOT از یک کامپایلر با مجموعه مشابهی از بهینه‌سازی‌ها استفاده می‌کنند، کد تولیدشده ممکن است یکسان نباشد. ‫JIT از اطلاعات نوع زمان اجرا استفاده می‌کند، می‌تواند درونی‌سازی بهتری انجام دهد، و امکان گردآوری جایگزینی در پشته (OSR) را فراهم می‌کند، که همه این‌ها کد کمی متفاوت تولید می‌کند.

معماری JIT

معماری JIT
شکل ۱. معماری JIT.

ترجمه درجا

ترجمه هم‌زمان شامل فعالیت‌های زیر است:

کامپایلر هدایت‌شده با نمایه
شکل ۲. ترجمه هدایت‌شده با نمایه.
  1. کاربر برنامه را اجرا می‌کند، سپس برنامه ART را برای بار کردن فایل .dex راه‌اندازی می‌کند.
    • اگر فایل .oat (باینری AOT برای فایل .dex ) دردسترس باشد، ART مستقیماً از آن استفاده می‌کند. اگرچه فایل‌های .oat به‌طور منظم تولید می‌شوند، اما همیشه حاوی کد کامپایل‌شده (باینری AOT) نیستند.
    • اگر فایل .oat حاوی کد کامپایل‌شده نباشد، ART ازطریق JIT و مفسر اجرا می‌شود تا فایل .dex را اجرا کند.
  2. ‫JIT برای هر برنامه‌ای که براساس فیلتر تدوین speed تدوین نشده باشد (که می‌گوید «تا جایی که می‌توانید از برنامه تدوین کنید») فعال است.
  3. داده‌های نمایه JIT در فایلی در دایرکتوری سیستم که فقط برنامه می‌تواند به آن دسترسی داشته باشد تخلیه می‌شود.
  4. دیوِ AOT compilation (dex2oat) آن فایل را تجزیه می‌کند تا ترجمه آن را هدایت کند.

    فرایند مخفی JIT
    شکل ۳. فعالیت‌های مخفی JIT.

سرویس Google Play نمونه‌ای است که توسط برنامه‌های دیگری که عملکردی مشابه کتابخانه‌های مشترک دارند استفاده می‌شود.

گردش کار JIT

معماری JIT
شکل ۴. جریان داده‌های JIT.
  • اطلاعات نمایه‌سازی در حافظه پنهان کد ذخیره می‌شود و درصورت کمبود حافظه، زباله‌روبی می‌شود.
    • هیچ تضمینی وجود ندارد که عکس آنی گرفته‌شده در زمانی که برنامه در پس‌زمینه بوده است حاوی داده‌های کامل باشد (یعنی هر چیزی که JIT شده است).
    • هیچ تلاشی برای اطمینان از ضبط همه چیز وجود ندارد (زیرا این امر می‌تواند بر عملکرد زمان اجرا تأثیر بگذارد).
  • روش‌ها می‌توانند در سه وضعیت مختلف باشند:
    • تفسیرشده (کد dex)
    • ترجمه هم‌زمان
    • ‫AOT کامپایل شد
    اگر هم کد JIT و هم کد AOT وجود داشته باشد (برای نمونه، به‌دلیل بهینه‌سازی‌های مکرر)، کد JIT ترجیح داده می‌شود.
  • الزام حافظه برای اجرای JIT بدون تأثیر بر عملکرد برنامه پیش‌زمینه به برنامه موردنظر بستگی دارد. برنامه‌های بزرگ نسبت به برنامه‌های کوچک به حافظه بیشتری نیاز دارند. به‌طورکلی، برنامه‌های بزرگ در حدود ۴ مگابایت پایدار می‌شوند.

روشن کردن گزارش‌گیری JIT

برای روشن کردن گزارش‌گیری JIT، فرمان‌های زیر را اجرا کنید:

adb root
adb shell stop
adb shell setprop dalvik.vm.extra-opts -verbose:jit
adb shell start

غیرفعال کردن JIT

برای غیرفعال کردن JIT، فرمان‌های زیر را اجرا کنید:

adb root
adb shell stop
adb shell setprop dalvik.vm.usejit false
adb shell start

گردآوری اجباری

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

adb shell cmd package compile

موارد استفاده رایج برای کامپایل اجباری بسته خاص:

  • نمایه‌محور:
    adb shell cmd package compile -m speed-profile -f my-package
    
  • کامل:
    adb shell cmd package compile -m speed -f my-package
    

موارد استفاده رایج برای کامپایل اجباری همه بسته‌ها:

  • نمایه‌محور:
    adb shell cmd package compile -m speed-profile -f -a
    
  • کامل:
    adb shell cmd package compile -m speed -f -a
    

پاک کردن داده‌های نمایه

در Android 13 یا نسخه‌های قدیمی‌تر

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

adb shell pm compile --reset 

در Android 14 یا نسخه‌های بالاتر

برای پاک کردن فقط داده‌های نمایه محلی:

adb shell pm art clear-app-profiles 

توجه: برخلاف فرمان Android 13 یا نسخه‌های قدیمی‌تر، این فرمان داده‌های نمایه خارجی (`.dm`) را که با برنامه نصب شده است پاک نمی‌کند.

برای پاک کردن داده‌های نمایه محلی و برداشتن کد تدوین‌شده تولیدشده از داده‌های نمایه محلی (یعنی برای بازنشانی به وضعیت نصب)، این دستور را اجرا کنید:

adb shell pm compile --reset 

توجه: این فرمان کد کامپایل‌شده تولیدشده از داده‌های نمایه خارجی (`.dm`) را که همراه با برنامه نصب شده است برنمی‌دارد.

برای پاک کردن همه کد کامپایل‌شده، این فرمان را اجرا کنید:

adb shell cmd package compile -m verify -f 

توجه: این فرمان داده‌های نمایه محلی را حفظ می‌کند.