يتيح نظام إنشاء Android لنظام التشغيل Android 13 والإصدارات الأقدم استخدام ميزة التحسين بالاستناد إلى الملف الشخصي (PGO) من Clang في وحدات Android الأصلية التي تحتوي على قواعد التصميم لعمليات الإنشاء. توضِّح هذه الصفحة ميزة Clang PGO وكيفية إنشاء ملفات ملفّات الأداء المُستخدَمة في ميزة PGO وتعديلها باستمرار، وكيفية دمج ميزة PGO مع نظام الإنشاء (مع حالة الاستخدام).
ملاحظة: يصف هذا المستند استخدام ميزة "تحسين الأداء أثناء التشغيل" في نظام Android الأساسي. للتعرّف على كيفية استخدام ميزة "التجوّل في خرائط Google" من تطبيق Android، يُرجى الانتقال إلى هذه الصفحة.
لمحة عن Clang PGO
يمكن أن يُجري Clang تحسينًا موجّهًا حسب الملف الشخصي باستخدام نوعَين من الملفات الشخصية:
- يتم إنشاء الملفات الشخصية المستندة إلى الأدوات من برنامج مستهدَف تمّت أدواته. هذه الملفات الشخصية مفصّلة وتفرض تكلفة عالية على وقت التشغيل.
- يتم عادةً إنشاء الملفات الشخصية المستندة إلى تحليل عيّنات من خلال استخدام عدادات الأجهزة لتحليل عيّنات. ولا تفرض هذه الأدوات أيّ تكلفة تشغيل عالية، ويمكن جمعها بدون أيّ أدوات قياس أو تعديل على الملف الثنائي. وهي أقل تفصيلاً من الملفات الشخصية المستندة إلى الأدوات.
يجب إنشاء جميع الملفات الشخصية من خلال ملف عمل تمثيلي يُجري السلوك المعتاد للتطبيق. على الرغم من أنّ Clang يتيح استخدام ملف العمل المستنِد إلى AST (-fprofile-instr-generate) وملف العمل المستنِد إلى LLVM IR (-fprofile-generate))، لا يتيح Android سوى ملف العمل المستنِد إلى LLVM IR لميزة PGO المستنِدة إلى الأدوات.
يجب استخدام العلامات التالية لإنشاء ملف شخصي:
-
-fprofile-generateللأجهزة المستندة إلى الأشعة تحت الحمراء باستخدام هذا الخيار، يستخدم الجزء الخلفي من التطبيق أسلوبًا للحد الأدنى من شجرة الامتداد التي يتمّ فيها تحديد الوزن بهدف تقليل عدد نقاط القياس وتحسين مواضعها في الحواف ذات الوزن المنخفض (استخدِم هذا الخيار لخطوة الربط أيضًا). يُرسِل برنامج تشغيل Clang وقت تشغيل التحليل المتعمّق (libclang_rt.profile-arch-android.a) تلقائيًا إلى أداة الربط. تحتوي هذه المكتبة على إجراءات لكتابة الملفات الشخصية على القرص عند خروج البرنامج. -
-gline-tables-onlyلجمع الملفات الشخصية المستندة إلى تحليل العينات لإنشاء الحد الأدنى من معلومات تصحيح الأخطاء
يمكن استخدام ملف شخصي لإجراء تحسين الأداء أثناء التشغيل باستخدام -fprofile-use=pathname أو -fprofile-sample-use=pathname للملفات الشخصية المستندة إلى الأدوات
والملفات الشخصية المستندة إلى تحليل عيّنات الأداء على التوالي.
ملاحظة: عند إجراء تغييرات على الرمز، إذا لم يعُد بإمكان Clang
استخدام بيانات الملف الشخصي، سيُنشئ تحذيرًا
-Wprofile-instr-out-of-date.
استخدام PGO
تشمل خطوات استخدام ميزة "التوفّر بلا إنترنت" ما يلي:
- أنشئ المكتبة أو الملف القابل للتنفيذ باستخدام الأدوات من خلال تمرير
-fprofile-generateإلى المُجمِّع والرابط. - جمع الملفات الشخصية من خلال تشغيل ملف تعريف نموذجي على ملف ثنائي تم فحصه
- عالج الملفات الشخصية بعد إنشائها باستخدام الأداة
llvm-profdata(للحصول على التفاصيل، راجِع مقالة معالجة ملفات ملفّات LLVM ملفّات الملفات الشخصية). - استخدِم الملفات الشخصية لتطبيق ميزة "تحسين الأداء من خلال إعادة التشغيل" من خلال تمرير
-fprofile-use=<>.profdataإلى المُجمِّع و-fprofile-use=<>.profdataإلى الرابط.
بالنسبة إلى ميزة "التحسين أثناء التشغيل" في Android، يجب جمع الملفات الشخصية بلا إنترنت وإرسالها مع الرمز البرمجي لضمان إمكانية إعادة إنشاء الإصدارات. يمكن استخدام الملفات الشخصية مع تطور الرمز البرمجي، ولكن يجب إعادة إنشائها بشكل دوري (أو كلما حذر Clang من أنّ الملفات الشخصية قديمة).
جمع الملفات الشخصية
يمكن أن يستخدم Clang الملفات الشخصية التي تم جمعها من خلال تنفيذ معايير الأداء باستخدام ملف برمجي تم تجهيزه بالأدوات اللازمة من المكتبة أو من خلال أخذ عيّنات من عدادات الأجهزة عند تنفيذ ملف برمجي قياس الأداء. في الوقت الحالي، لا يتيح نظام التشغيل Android استخدام ميزة جمع الملفات الشخصية المستندة إلى أخذ العينات، لذا عليك جمع الملفات باستخدام إصدار تم اختباره:
- حدِّد مقياس أداء ومجموعة المكتبات التي يستخدمها هذا المقياس بشكل جماعي.
- أضِف سمات
pgoإلى معايير الأداء والمكتبات (التفاصيل أدناه). - أنشئ إصدارًا من Android يحتوي على نسخة تم اختبارها من هذه المكتبات
باستخدام:
make ANDROID_PGO_INSTRUMENT=benchmark
benchmark هو عنصر نائب يحدِّد
مجموعة المكتبات التي تم اختبار أدائها أثناء عملية الإنشاء. إنّ مدخلات الأداء النموذجية (وربما ملف تنفيذي آخر يرتبط بمكتبة يتم قياس أدائها
) ليست خاصة بميزة PGO وتتجاوز نطاق
هذا المستند.
- وميِّز الإصدار المُزوَّد بالأدوات أو زامِنَه على جهاز.
- شغِّل مقياس الأداء لجمع الملفات الشخصية.
- استخدِم أداة
llvm-profdata(الموضَّحة أدناه) للقيام بالمهام التالية: المعالجة اللاحقة للملفات الشخصية وإعدادها لإضافتها إلى شجرة ملفات المصدر.
استخدام الملفات الشخصية أثناء عملية الإنشاء
تحقَّق من الملفات الشخصية في toolchain/pgo-profiles في شجرة Android. يجب أن يتطابق الاسم مع ما هو محدّد في السمة الفرعية
profile_file للسمة pgo الخاصة
بالمكتبة. يُرسِل نظام الإنشاء تلقائيًا ملف الملف الشخصي إلى Clang
عند إنشاء المكتبة. يمكن ضبط متغيّر البيئة ANDROID_PGO_DISABLE_PROFILE_USE
على true
لإيقاف ميزة PGO مؤقتًا وقياس فائدتها في الأداء.
لتحديد أدلة الملفات الشخصية الإضافية الخاصة بالمنتجات، يمكنك إلحاقها بملف PGO_ADDITIONAL_PROFILE_DIRECTORIES المتغيّر في BoardConfig.mk. في حال تحديد مسارات إضافية، ستحلّ الملفات الشخصية في
هذه المسارات محلّ الملفات في toolchain/pgo-profiles.
عند إنشاء صورة إصدار باستخدام الإصدار dist لملف make، يكتب نظام الإنشاء أسماء ملفات الملفات الشخصية المفقودة
في $DIST_DIR/pgo_profile_file_missing.txt. يمكنك الاطّلاع على هذاملف
لمعرفة ملفات الملف الشخصي التي تم حذفها عن طريق الخطأ (ما يؤدي إلى إيقاف ميزة PGO
بدون إشعار).
تفعيل ميزة PGO في ملفات Android.bp
لتفعيل ميزة "تحسين الأداء أثناء التشغيل" في ملفات Android.bp للوحدات الأصلية، ما عليك سوى
تحديد السمة pgo. يحتوي هذا الموقع على المواقع الفرعية التالية:
| الموقع | الوصف |
|---|---|
instrumentation
|
اضبط القيمة على true لميزة "تحسين الأداء أثناء التشغيل" باستخدام الأدوات. القيمة التلقائية هي
false. |
sampling
|
اضبط القيمة على true لميزة "تحسين الأداء أثناء التشغيل" باستخدام تحليل عيّنات البيانات. القيمة التلقائية هي
false. |
benchmarks
|
قائمة السلاسل تم إنشاء هذه الوحدة لإنشاء الملفات الشخصية في حال تحديد أي معيار أداء
في القائمة في خيار ANDROID_PGO_INSTRUMENT الإصدار. |
profile_file
|
ملف الإصدار (بالنسبة إلى toolchain/pgo-profile) لاستخدامه
مع أداة PGO يُحذّر عملية الإنشاء من عدم توفّر هذا الملف من خلال إضافة هذاملف
إلى $DIST_DIR/pgo_profile_file_missing.txt
ما لم يتم ضبط السمة enable_profile_use على
false أو يتم ضبط متغيّر الإنشاء
ANDROID_PGO_NO_PROFILE_USE على
true. |
enable_profile_use
|
اضبط القيمة على false إذا لم يكن من المفترض استخدام الملفات الشخصية أثناء مرحلة
التصميم. يمكن استخدامها أثناء عملية الإعداد لتفعيل جمع الملفات الشخصية أو
لإيقاف ميزة "تحسين الأداء من خلال التشغيل" مؤقتًا. القيمة التلقائية هي true. |
cflags
|
قائمة بالعلامات الإضافية لاستخدامها أثناء عملية إنشاء تمّت تهيئتها لقياس الأداء |
مثال على وحدة تتضمّن ميزة "تحسين أداء التطبيقات":
cc_library { name: "libexample", srcs: [ "src1.cpp", "src2.cpp", ], static: [ "libstatic1", "libstatic2", ], shared: [ "libshared1", ] pgo: { instrumentation: true, benchmarks: [ "benchmark1", "benchmark2", ], profile_file: "example.profdata", } }
إذا كانت مقاييس الأداء benchmark1 وbenchmark2
تُظهر سلوكًا تمثيليًا للمكتبات libstatic1
أو libstatic2 أو libshared1، يمكن أن يتضمّن موقع pgo
لهذه المكتبات أيضًا مقاييس الأداء. يمكن أن تتضمّن وحدة
defaults في Android.bp مواصفة
pgo شائعة لمجموعة من المكتبات لتجنّب تكرار
قواعد الإنشاء نفسها لعدة وحدات.
لاختيار ملفات ملف شخصي مختلفة أو إيقاف ميزة PGO بشكل انتقائي لبنية
معيّنة، حدِّد سمات profile_file وenable_profile_use وcflags لكل بنية. مثال (مع استهداف البنية في
الخطّ العريض):
cc_library { name: "libexample", srcs: [ "src1.cpp", "src2.cpp", ], static: [ "libstatic1", "libstatic2", ], shared: [ "libshared1", ], pgo: { instrumentation: true, benchmarks: [ "benchmark1", "benchmark2", ], } target: { android_arm: { pgo: { profile_file: "example_arm.profdata", } }, android_arm64: { pgo: { profile_file: "example_arm64.profdata", } } } }
لحلّ المراجع إلى مكتبة وقت تشغيل الأداء أثناء
الأداء المستنِد إلى الأدوات، عليك تمرير علامة الإنشاء
-fprofile-generate إلى أداة الربط. يجب أيضًا تجهيز المكتبات الثابتة التي تم تجهيزها
باستخدام ميزة PGO، وجميع المكتبات المشتركة، وأي ملف ثنائي يعتمد مباشرةً على
المكتبة الثابتة لاستخدام ميزة PGO. ومع ذلك، لا تحتاج مكتبات ملفّات exes أو مكتبات ملفّات shared
المشترَكة هذه إلى استخدام ملفات تعريف PGO، ويمكن ضبط سمة
enable_profile_use على false.
وباستثناء هذا التقييد، يمكنك تطبيق ميزة "تحسين الأداء أثناء التشغيل" على أي مكتبة ثابتة أو مكتبة
مشتركة أو ملف قابل للتنفيذ.
التعامل مع ملفات الملف الشخصي لـ LLVM
يؤدي تنفيذ مكتبة أو ملف قابل للتنفيذ تمّت تهيئته إلى إنشاء ملف ملف شخصي
باسم default_unique_id_0.profraw في
/data/local/tmp (حيث يكون unique_id هو
تجزئة رقمية فريدة لهذه المكتبة). إذا كان هذا الملف متوفّرًا من قبل،
يدمج وقت تشغيل إنشاء الملفات الشخصية الملف الشخصي الجديد مع الملف الشخصي القديم أثناء كتابة
الملفات الشخصية. يُرجى العِلم أنّه لا يمكن لمطوّري التطبيقات استخدام /data/local/tmp، بل عليهم استخدام مكان آخر مثل
/storage/emulated/0/Android/data/packagename/files بدلاً من ذلك.
لتغيير موقع ملف الملف الشخصي، اضبط متغيّر البيئة LLVM_PROFILE_FILE
أثناء التشغيل.
بعد ذلك، يتم استخدام الأداة llvm-profdata
لتحويل ملف .profraw (وربما
دمج عدة ملفات .profraw) إلى ملف .profdata:
llvm-profdata merge -output=profile.profdata <.profraw and/or .profdata files>
يمكن بعد ذلك وضع علامة على profile.profdata في شجرة ملف المصدر
لاستخدامها أثناء عملية الإنشاء.
في حال تحميل عدة مكتبات أو ملفات ثنائية تم قياس أدائها أثناء إجراء اختبار معياري،
تنشئ كل مكتبة ملف .profraw منفصلاً يحتوي على معرّف فريد
منفصل. يمكن عادةً دمج كل هذه الملفات في ملف
.profdata واحد واستخدامه لإنشاء حِزمة PGO. في الحالات التي يتم فيها اختبار مكتبة
باستخدام معيار أداء آخر، يجب تحسين هذه المكتبة باستخدام ملف شخصي
من كلا المعيارَين. في هذه الحالة، يكون خيار show
في llvm-profdata مفيدًا:
llvm-profdata merge -output=default_unique_id.profdata default_unique_id_0.profraw llvm-profdata show -all-functions default_unique_id.profdata
لربط unique_id بالمكتبات الفردية، ابحث في show عن كل unique_id عن اسم دالة
فريد للمكتبة.
دراسة حالة: حملة PGO لـ ART
تقدّم الدراسة الحالة ART كمثال ذي صلة، ولكنّها ليست وصفًا دقيقًا للمجموعة الفعلية من المكتبات التي تم إعداد ملفها الشخصي في ART أو الاعتمادات المتبادلة بينها.
يعتمد dex2oat المُجمِّع المُسبَق في ART على
libart-compiler.so، والذي يعتمد بدوره على
libart.so. يتم تنفيذ وقت تشغيل ART بشكل أساسي في
libart.so. ستكون مقاييس الأداء للمجمِّع ووقت التشغيل
مختلفة:
| Benchmark | المكتبات التي تم تحليلها |
|---|---|
dex2oat
|
dex2oat (ملف قابل للتنفيذ)، libart-compiler.so،
libart.so |
art_runtime
|
libart.so
|
- أضِف سمة
pgoالتالية إلىdex2oat،libart-compiler.so:pgo: { instrumentation: true, benchmarks: ["dex2oat",], profile_file: "dex2oat.profdata", } - أضِف السمة
pgoالتالية إلىlibart.so:pgo: { instrumentation: true, benchmarks: ["art_runtime", "dex2oat",], profile_file: "libart.profdata", } - أنشئ إصدارات تمّت قياس أدائها لاختبارَي
dex2oatوart_runtimeباستخدام:make ANDROID_PGO_INSTRUMENT=dex2oat make ANDROID_PGO_INSTRUMENT=art_runtime - يمكنك تنفيذ مقاييس الأداء التي تُجري
dex2oatوart_runtimeللحصول على ما يلي:- ثلاثة ملفات
.profrawمنdex2oat(dex2oat_exe.profdatadex2oat_libart-compiler.profdatadexeoat_libart.profdata)، تم تحديدها باستخدام الطريقة описанة في معالجة ملفات ملف ملف LLVM. art_runtime_libart.profdataواحدة
- ثلاثة ملفات
- أنشئ ملفًا شائعًا لملف profdata الخاص بالملف التنفيذي
dex2oatوملفlibart-compiler.soباستخدام:llvm-profdata merge -output=dex2oat.profdata \ dex2oat_exe.profdata dex2oat_libart-compiler.profdata - الحصول على الملف الشخصي لـ
libart.soمن خلال دمج الملفات الشخصية من المقياسَين التاليَين:llvm-profdata merge -output=libart.profdata \ dex2oat_libart.profdata art_runtime_libart.profdataقد تكون الأعداد الأولية لـ
libart.soمن الملفَّين الشخصيَّين مختلفة لأنّ مقاييس الأداء تختلف في عدد حالات الاختبار ومدّة تنفيذها. في هذه الحالة، يمكنك استخدام دمج مرجح:llvm-profdata merge -output=libart.profdata \ -weighted-input=2,dex2oat_libart.profdata \ -weighted-input=1,art_runtime_libart.profdataيحدّد الأمر أعلاه ضعف الأهمية للملف الشخصي من
dex2oat. يجب تحديد الوزن الفعلي استنادًا إلى معرفة العميل بالموضوع أو التجارب التي أجراها. - تحقّق من ملفات الملف الشخصي
dex2oat.profdataوlibart.profdataفيtoolchain/pgo-profilesللاستخدام أثناء عملية الإنشاء.
بدلاً من ذلك، يمكنك إنشاء إصدار واحد تم اختباره يتضمّن جميع المكتبات التي تم اختبارها باستخدام:
make ANDROID_PGO_INSTRUMENT=dex2oat,art_runtime
(or)
make ANDROID_PGO_INSTRUMENT=ALLينشئ الأمر الثاني جميع الوحدات المفعَّلة باستخدام ميزة "تحسين الأداء من خلال مراقبة التطبيق" لتحليل الأداء.