زمان اجرا اندروید (ART) شامل یک کامپایلر به موقع (JIT) با پروفایل کد است که به طور مداوم عملکرد برنامه های اندروید را در حین اجرا بهبود می بخشد. کامپایلر JIT مکمل کامپایلر پیش از زمان فعلی (AOT) ART است و عملکرد زمان اجرا را بهبود می بخشد، فضای ذخیره سازی را ذخیره می کند و به روز رسانی برنامه ها و سیستم را سرعت می بخشد. همچنین کامپایلر AOT را با اجتناب از کاهش سرعت سیستم در طول بهروزرسانی خودکار برنامهها یا کامپایل مجدد برنامهها در طول بهروزرسانیهای هوایی (OTA) بهبود میبخشد.
اگرچه JIT و AOT از یک کامپایلر با مجموعه ای از بهینه سازی های مشابه استفاده می کنند، ممکن است کد تولید شده یکسان نباشد. JIT از اطلاعات نوع زمان اجرا استفاده می کند، می تواند درون خطی را بهتر انجام دهد و کامپایل جایگزینی روی پشته (OSR) را ممکن می کند، که همگی کدهای کمی متفاوت تولید می کنند.
معماری JIT
![معماری JIT](https://source.android.com/docs/core/runtime/images/jit-arch.png?authuser=0&hl=fa)
گردآوری JIT
تدوین JIT شامل فعالیت های زیر است:
![کامپوزیت هدایت شده با نمایه](https://source.android.com/docs/core/runtime/images/jit-profile-comp.png?authuser=0&hl=fa)
- کاربر برنامه را اجرا می کند و سپس ART را برای بارگیری فایل
.dex
فعال می کند.- اگر فایل
.oat
(باینری AOT برای فایل.dex
) موجود باشد، ART مستقیماً از آن استفاده می کند. اگرچه فایلهای.oat
به طور منظم تولید میشوند، اما همیشه حاوی کد کامپایلشده (AOT باینری) نیستند. - اگر فایل
.oat
حاوی کد کامپایل شده نباشد، ART از طریق JIT و مفسر اجرا می شود تا فایل.dex
را اجرا کند.
- اگر فایل
- JIT برای هر برنامهای فعال است که مطابق فیلتر کامپایل
speed
(که میگوید «تا میتوانید از برنامه کامپایل کنید») کامپایل نشده است. - داده های نمایه JIT به فایلی در یک فهرست سیستم ریخته می شود که فقط برنامه می تواند به آن دسترسی داشته باشد.
- دیمون کامپایل AOT (
dex2oat
) آن فایل را تجزیه می کند تا کامپایل آن را هدایت کند.شکل 3. فعالیت های شبح JIT.
سرویس Google Play نمونهای است که توسط برنامههای کاربردی دیگر استفاده میشود که رفتاری شبیه به کتابخانههای مشترک دارند.
گردش کار JIT
![معماری JIT](https://source.android.com/docs/core/runtime/images/jit-workflow.png?authuser=0&hl=fa)
- اطلاعات پروفایل در کش کد ذخیره می شود و تحت فشار حافظه در معرض جمع آوری زباله قرار می گیرد.
- هیچ تضمینی وجود ندارد که یک عکس فوری گرفته شده در زمانی که برنامه در پسزمینه بود، حاوی دادههای کامل باشد (یعنی هر چیزی که JIT شده است).
- هیچ تلاشی برای اطمینان از ثبت همه چیز وجود ندارد (زیرا این می تواند بر عملکرد زمان اجرا تأثیر بگذارد).
- روش ها می توانند در سه حالت مختلف باشند:
- تفسیر شده (کد dex)
- JIT گردآوری شد
- AOT گردآوری شد
- نیاز به حافظه برای اجرای 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
توجه: این دستور داده های نمایه محلی را حفظ می کند.