طلب الملفات

ملف الطلب هو أسلوب حديث لتحسين برامج الربط. ملفات الترتيب هذه هي ملفات نصية تحتوي على رموز تمثل الدوال. ستستخدم الروابط مثل ملفات الترتيب لدوال التخطيط بترتيب معين. تعمل هذه البرامج الثنائية أو المكتبات ذات الرموز المرتبة على تقليل أخطاء الصفحة تحسين وقت إطلاق البرنامج بسبب التحميل الفعال للرموز أثناء البداية الباردة للبرنامج.

يمكن إضافة ميزات ملفات الطلبات إلى تطبيقك من خلال اتّباع ثلاث خطوات الخطوات:

  1. إنشاء ملفات شخصية وملف الربط
  2. إنشاء ملف طلب من الملفات الشخصية وملف التعيين
  3. استخدام ملف الطلب أثناء إنشاء الإصدار لتنسيق الرموز

إنشاء ملف طلب

يتطلب إنشاء ملف طلب ثلاث خطوات:

  1. إنشاء إصدار أداة من التطبيق يكتب ملف الطلب
  2. تشغيل التطبيق لإنشاء الملفات الشخصية
  3. إجراء المعالجة اللاحقة للملفات الشخصية وملف الربط

إنشاء تصميم آلي

يتم إنشاء الملفات الشخصية عن طريق تشغيل إصدار مساعِد للتطبيق. يتطلب إصدار أداة قياس الأداء إضافة -forder-file-instrumentation إلى كل من علامات برنامج التجميع والرابط مع -mllvm -orderfile-write-mapping=<filename>-mapping.txt إضافتها بشكل صارم إلى علامات برنامج التجميع. تمكن علامة الأدوات من أدوات ملف الطلب للتشكيل المكتبة المحددة اللازمة لإنشاء الملفات التعريفية. ومن ناحية أخرى، تُخرج علامة التعيين فقط ملف التعيين الذي يعرض تجزئة MD5 لكل دالة في البرنامج الثنائي أو المكتبة.

بالإضافة إلى ذلك، احرص على تمرير أي علامة تحسين ولكن -O0 لأنّ كلاً منهما فعلامة الأدوات وعلامة التعيين تتطلب واحدًا. في حال عدم تمرير علامة تحسين، لن يتم إنشاء ملف الربط قد يؤدي الإصدار المستند إلى قياس الأداء إلى إخراج تجزئات خاطئة لملف الملف الشخصي.

لعبة ndk-build

احرص على استخدام "APP_OPTIM=release" في البناء حتى تستخدم ndk-build عملية تحسين. وضع آخر بخلاف -O0. عند الإنشاء باستخدام AGP، يتم طرح هذا تلقائيًا في الإصدار الإصدارات.

LOCAL_CFLAGS += \
    -forder-file-instrumentation \
    -mllvm -orderfile-write-mapping=mapping.txt \

LOCAL_LDFLAGS += -forder-file-instrumentation

إنشاء فيديوهات Shorts

احرص على استخدام CMAKE_BUILD_TYPE بخلاف Debug لكي يستخدم CMake وضع التحسين بخلاف -O0. عند الإنشاء باستخدام AGP، يتم ذلك تلقائيًا بشأن تصاميم الإصدارات.

target_compile_options(orderfiledemo PRIVATE
    -forder-file-instrumentation
    -mllvm -orderfile-write-mapping=mapping.txt
)
target_link_options(orderfiledemo PRIVATE -forder-file-instrumentation)

أنظمة تصميم أخرى

اجمع الرمز الخاص بك باستخدام -forder-file-instrumentation -O1 -mllvm -orderfile-write-mapping=mapping.txt.

السمة -O1 غير مطلوبة على وجه التحديد، ولكن لا تستخدم السمة -O0.

حذف -mllvm -orderfile-write-mapping=mapping.txt عند الربط.

جميع هذه العلامات غير لازمة لإنشاء الإصدار، لذا يجب التحكم فيها من خلال متغير الإصدار. للتبسيط، يمكنك إعداد كل ذلك في CMakeLists.txt كما في نموذج.

إنشاء مكتبة ملفات طلبات

بالإضافة إلى العلامات، يجب إعداد ملف التعريف يحتاج البرنامج الثنائي الذي تم قياسه إلى تشغيل كتابة ملف شخصي بشكل صريح أثناء والتنفيذ.

  • الاتصال بـ __llvm_profile_set_filename(PROFILE_DIR "/<filename>-%m.profraw") لمدة إعداد مسار الملف الشخصي. على الرغم من أن الوسيطة التي تم تمريرها هي <filename>-%m.profraw، يتم حفظ ملفّ الملف الشخصي باسم <filename>-%m.profraw.order التأكّد من أنّ التطبيق PROFILE_DIR قابل للكتابة ويمكنك الوصول إلى الدليل.
    • نظرًا لأن العديد من المكتبات المشتركة يتم تحليلها، فإن %m مفيد لأنه إلى توقيع وحدة فريد للمكتبة، مما يؤدي إلى ملف شخصي منفصل لكل مكتبة. لمزيد من محددات الأنماط، يمكنك الاطلاع على هذا الرابط.
  • عليك الاتصال بالرقم __llvm_profile_initialize_file() لإعداد ملف الملف الشخصي.
  • يمكنك طلب __llvm_orderfile_dump() للكتابة بشكل صريح إلى ملف الملف الشخصي.

ويتم جمع الملفات الشخصية في الذاكرة وتكتبها دالة التفريغ في الملف. عليك التأكّد من استدعاء دالة التفريغ في نهاية بدء التشغيل. بحيث يحتوي ملف ملفك الشخصي على كل الرموز حتى نهاية بدء التشغيل.

extern "C" {
extern int __llvm_profile_set_filename(const char*);
extern int __llvm_profile_initialize_file(void);
extern int __llvm_orderfile_dump(void);
}

#define PROFILE_DIR "<location-writable-from-app>"
void workload() {
  // ...
  // run workload
  // ...

  // set path and write profiles after workload execution
  __llvm_profile_set_filename(PROFILE_DIR "/default-%m.profraw");
  __llvm_profile_initialize_file();
  __llvm_orderfile_dump();
  return;
}

تشغيل أداة إنشاء الملفات الشخصية

يمكنك تشغيل التطبيق المستخدَم على الأجهزة على جهاز مادي أو افتراضي لإنشاء الشخصية. يمكنك استخراج ملفات الملف الشخصي باستخدام adb pull.

adb shell "run-as <package-name> sh -c 'cat /data/user/0/<package-name>/cache/default-%m.profraw.order' | cat > /data/local/tmp/default-%m.profraw.order"
adb pull /data/local/tmp/default-%m.profraw.order .

كما ذكرنا سابقًا، تأكد من أن المجلد الذي يحتوي على ملف الملف الشخصي المكتوب يمكنك الوصول إليها. إذا كان الجهاز افتراضيًا، قد تحتاج إلى تجنُّب أدوات المحاكاة مع "متجر Play" بسبب عدم القدرة على الوصول إلى العديد من المجلدات.

ما بعد معالجة الملف الشخصي وملف التعيين

عند الحصول على الملفات الشخصية، عليك العثور على ملف الربط وتحويله. كل ملف تعريف إلى تنسيق سداسي عشري. وعادةً ما يمكنك العثور على ملف التعيين في مجلد الإصدار للتطبيق. عندما يكون لديك كلاهما، يمكنك استخدام script للحصول على ملف ملف شخصي وملف التعيين الصحيح لإنشاء ملف طلب.

Linux/Mac/ChromeOS

hexdump -C default-%m.profraw.order > default-%m.prof
python3 create_orderfile.py --profile-file default-%m.prof --mapping-file <filename>-mapping.txt

Windows

certutil -f -encodeHex default-%m.profraw.order default-%m.prof
python3 create_orderfile.py --profile-file default-%m.prof --mapping-file <filename>-mapping.txt

لمزيد من المعلومات عن النص البرمجي، يمكنك الاطّلاع على قراءة

استخدام ملف الطلب لإنشاء التطبيق

بعد إنشاء ملف طلب، يجب إزالة العلامات وعلامات دوال ملفات الطلبات لأنها مخصصة فقط لخطوات الإنشاء. ما عليك سوى تمرير -Wl,--symbol-ordering-file=<filename>.orderfile إلى علامات التجميع والربط. في بعض الأحيان، لا يمكن العثور على الرموز أو لا يمكن نقلها وإصدار تحذيرات، لذا يمكن أن يتم تمرير -Wl,--no-warn-symbol-ordering لكتم هذه التحذيرات.

لعبة ndk-build

LOCAL_CFLAGS += \
    -Wl,--symbol-ordering-file=<filename>.orderfile \
    -Wl,--no-warn-symbol-ordering \

LOCAL_LDFLAGS += \
    -Wl,--symbol-ordering-file=<filename>.orderfile \
    -Wl,--no-warn-symbol-ordering \

إنشاء فيديوهات Shorts

target_compile_options(orderfiledemo PRIVATE
    -Wl,--symbol-ordering-file=<filename>.orderfile
    -Wl,--no-warn-symbol-ordering
)
target_link_options(orderfiledemo PRIVATE
    -Wl,--symbol-ordering-file=<filename>.orderfile
    -Wl,--no-warn-symbol-ordering
)

أنظمة تصميم أخرى

اجمع الرمز الخاص بك باستخدام -Wl,--symbol-ordering-file=<filename>.orderfile -Wl,--no-warn-symbol-ordering.

لمزيد من المعلومات، يمكنك الاطّلاع على مثال على ملف الطلب.

تفاصيل تنفيذ ملف الطلب

هناك العديد من الطرق لإنشاء ملفات الترتيب واستخدامها في الإنشاء. يستخدم NDK طريقة LLVM، لذلك فهو الأكثر فائدة بالنسبة إلى الملفات التي تمت مشاركتها بـ C أو C++ المكتبات على تطبيق Java أو Kotlin الفعلي. تأخذ Clang كل اسم دالة (رمز) وتنشئ تجزئة MD5 لها هذه العلاقة بملف تعيين. تتم كتابة تجزئة MD5 للدالة في ملف الملف الشخصي (التنسيق المؤقت) عندما يتم تنفيذ الدالة لأول مرة. لا تكتب أي عمليات تنفيذ لاحقة للدالة تجزئة MD5 في ملف شخصي لأنه يريد تجنب التكرارات. نتيجةً لذلك، يتم تسجيل أول عملية تنفيذ للدالة فقط بالترتيب. من خلال استعراض ملف الملف الشخصي وملف التعيين، يمكنك الحصول على كل تجزئة MD5 واستبداله بالدالة المقابلة والحصول على ملف طلب.

يمكن أن تكون أمثلة عن كلٍ من ملف الملف الشخصي بالتنسيق السداسي العشري وملف التعيين تم العثور على الملف باسم example.prof وexample-mapping.txt على التوالي.