زمان اجرای Android (ART) شامل یک کامپایلر همزمان (JIT) با نمایهسازی کد است که بهطور مداوم عملکرد برنامههای Android را درحین اجرا بهبود میبخشد. کامپایلر JIT کامپایلر پیشاز موعد (AOT) فعلی ART را تکمیل میکند و عملکرد زمان اجرا را بهبود میبخشد، فضای ذخیرهسازی را ذخیره میکند، و سرعت بهروزرسانیهای برنامه و سیستم را افزایش میدهد. این فناوری همچنین با جلوگیری از کند شدن سیستم درطول بهروزرسانیهای خودکار برنامه یا بازکامپایل برنامهها درطول بهروزرسانیهای ازطریق هوا (OTA)، کامپایلر AOT را بهبود میبخشد.
اگرچه JIT و AOT از یک کامپایلر با مجموعه مشابهی از بهینهسازیها استفاده میکنند، کد تولیدشده ممکن است یکسان نباشد. JIT از اطلاعات نوع زمان اجرا استفاده میکند، میتواند درونیسازی بهتری انجام دهد، و امکان گردآوری جایگزینی در پشته (OSR) را فراهم میکند، که همه اینها کد کمی متفاوت تولید میکند.
معماری JIT
ترجمه درجا
ترجمه همزمان شامل فعالیتهای زیر است:
- کاربر برنامه را اجرا میکند، سپس برنامه ART را برای بار کردن فایل
.dexراهاندازی میکند.- اگر فایل
.oat(باینری AOT برای فایل.dex) دردسترس باشد، ART مستقیماً از آن استفاده میکند. اگرچه فایلهای.oatبهطور منظم تولید میشوند، اما همیشه حاوی کد کامپایلشده (باینری AOT) نیستند. - اگر فایل
.oatحاوی کد کامپایلشده نباشد، ART ازطریق JIT و مفسر اجرا میشود تا فایل.dexرا اجرا کند.
- اگر فایل
- JIT برای هر برنامهای که براساس فیلتر تدوین
speedتدوین نشده باشد (که میگوید «تا جایی که میتوانید از برنامه تدوین کنید») فعال است. - دادههای نمایه JIT در فایلی در دایرکتوری سیستم که فقط برنامه میتواند به آن دسترسی داشته باشد تخلیه میشود.
- دیوِ AOT compilation (
dex2oat) آن فایل را تجزیه میکند تا ترجمه آن را هدایت کند.
شکل ۳. فعالیتهای مخفی JIT.
سرویس Google Play نمونهای است که توسط برنامههای دیگری که عملکردی مشابه کتابخانههای مشترک دارند استفاده میشود.
گردش کار JIT
- اطلاعات نمایهسازی در حافظه پنهان کد ذخیره میشود و درصورت کمبود حافظه،
زبالهروبی میشود.
- هیچ تضمینی وجود ندارد که عکس آنی گرفتهشده در زمانی که برنامه در پسزمینه بوده است حاوی دادههای کامل باشد (یعنی هر چیزی که JIT شده است).
- هیچ تلاشی برای اطمینان از ضبط همه چیز وجود ندارد (زیرا این امر میتواند بر عملکرد زمان اجرا تأثیر بگذارد).
- روشها میتوانند در سه وضعیت مختلف باشند:
- تفسیرشده (کد dex)
- ترجمه همزمان
- AOT کامپایل شد
- الزام حافظه برای اجرای JIT بدون تأثیر بر عملکرد برنامه پیشزمینه به برنامه موردنظر بستگی دارد. برنامههای بزرگ نسبت به برنامههای کوچک به حافظه بیشتری نیاز دارند. بهطورکلی، برنامههای بزرگ در حدود ۴ مگابایت پایدار میشوند.
روشن کردن گزارشگیری JIT
برای روشن کردن گزارشگیری JIT، فرمانهای زیر را اجرا کنید:
adb rootadb shell stopadb shell setprop dalvik.vm.extra-opts -verbose:jitadb shell start
غیرفعال کردن JIT
برای غیرفعال کردن JIT، فرمانهای زیر را اجرا کنید:
adb rootadb shell stopadb shell setprop dalvik.vm.usejit falseadb 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
توجه: این فرمان دادههای نمایه محلی را حفظ میکند.