پیاده سازی ART just-in-time کامپایلر

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

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

معماری JIT

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

گردآوری JIT

تدوین JIT شامل فعالیت های زیر است:

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

    دیمون JIT
    شکل 3. فعالیت های شبح JIT.

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

گردش کار JIT

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

JIT logging را روشن کنید

برای روشن کردن JIT logging، دستورات زیر را اجرا کنید:

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
    

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

در اندروید 13 یا قبل از آن

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

adb shell pm compile --reset 

در اندروید 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 

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