ننصح بشدة بإنشاء قواعد الملفات الشخصية آليًا باستخدام مكتبة Jetpack Macrobenchmark لتقليل الجهد اليدوي وزيادة قابلية التوسّع بشكل عام. ومع ذلك، من الممكن إنشاء قواعد الملف الشخصي وقياسها يدويًا في تطبيقك.
تحديد قواعد الملف الشخصي يدويًا
يمكنك تحديد قواعد الملف الشخصي يدويًا في تطبيق أو وحدة مكتبة من خلال إنشاء
ملف باسم baseline-prof.txt في الدليل src/main. هذا هو المجلد نفسه الذي يحتوي على ملف AndroidManifest.xml.
يحدّد الملف قاعدة واحدة لكل سطر. وتمثّل كل قاعدة نمطًا لمطابقة الطرق أو الفئات في التطبيق أو المكتبة التي تحتاج إلى تحسين.
تُعدّ بنية هذه القواعد مجموعة شاملة من تنسيق ملفات تعريف ART التي يمكن لشخص عادي قراءتها (HRF) عند استخدام adb shell profman --dump-classes-and-methods. تتشابه البنية مع بنية الواصفات والتوقيعات، ولكنها تتيح استخدام أحرف البدل لتبسيط عملية كتابة القواعد.
يوضّح المثال التالي بعض قواعد "الملف الشخصي الأساسي" المضمّنة في مكتبة Jetpack Compose:
HSPLandroidx/compose/runtime/ComposerImpl;->updateValue(Ljava/lang/Object;)V
HSPLandroidx/compose/runtime/ComposerImpl;->updatedNodeCount(I)I
HLandroidx/compose/runtime/ComposerImpl;->validateNodeExpected()V
PLandroidx/compose/runtime/CompositionImpl;->applyChanges()V
HLandroidx/compose/runtime/ComposerKt;->findLocation(Ljava/util/List;I)I
Landroidx/compose/runtime/ComposerImpl;
يمكنك محاولة تعديل قواعد الملف الشخصي في مشروع Compiler Explorer النموذجي هذا. يُرجى العِلم أنّ Compiler Explorer لا يتيح سوى تنسيق ملفات تعريف ART التي يمكن لشخص عادي قراءتها (HRF)، لذا لا يمكن استخدام أحرف البدل.
بنية القاعدة
تتّخذ هذه القواعد أحد شكلَين لاستهداف الطرق أو الفئات:
[FLAGS][CLASS_DESCRIPTOR]->[METHOD_SIGNATURE]
تستخدم قاعدة الصف النمط التالي:
[CLASS_DESCRIPTOR]
اطّلِع على الجدول التالي للحصول على وصف تفصيلي:
| البنية | الوصف |
|---|---|
FLAGS |
تمثّل حرفًا واحدًا أو أكثر من الأحرف H وS وP للإشارة إلى ما إذا كان يجب وضع علامة على هذه الطريقة على أنّها Hot أو Startup أو Post Startup في ما يتعلّق بنوع بدء التشغيل. تشير الطريقة التي تحمل العلامة H إلى أنّها طريقة "نشطة"، أي يتم استدعاؤها عدة مرات خلال فترة استخدام التطبيق. تشير الطريقة التي تحمل العلامة S إلى أنّها طريقة يتم استدعاؤها أثناء بدء التشغيل. تشير الطريقة التي تحمل العلامة P إلى أنّها طريقة يتم استدعاؤها بعد بدء التشغيل. تشير الفئة الموجودة في هذا الملف إلى أنّه يتم استخدامها أثناء بدء التشغيل ويجب تخصيصها مسبقًا في الذاكرة المؤقتة لتجنُّب تكلفة تحميل الفئة. يستخدم برنامج تجميع ART استراتيجيات تحسين مختلفة، مثل تجميع هذه الطرق قبل التشغيل وإجراء تحسينات على التنسيق في ملف AOT الذي تم إنشاؤه. |
CLASS_DESCRIPTOR |
وصف لفئة الطريقة المستهدَفة على سبيل المثال، يحتوي androidx.compose.runtime.SlotTable على واصف Landroidx/compose/runtime/SlotTable;. تتم إضافة الحرف L هنا وفقًا لتنسيق Dalvik Executable (DEX). |
METHOD_SIGNATURE |
توقيع الطريقة، بما في ذلك الاسم وأنواع المَعلمات وأنواع القيم التي تم إرجاعها للطريقة على سبيل المثال:// LayoutNode.kt fun isPlaced():Boolean { // ...} على LayoutNode يحمل التوقيع isPlaced()Z. |
يمكن أن تحتوي هذه الأنماط على أحرف بدل لتشمل قاعدة واحدة طرقًا أو فئات متعددة. للحصول على مساعدة موجَّهة عند الكتابة باستخدام بنية القواعد في "استوديو Android"، يمكنك الاطّلاع على المكوّن الإضافي ملفات Android Baseline Profiles.
قد يبدو مثال على قاعدة حرف بدل على النحو التالي:
HSPLandroidx/compose/ui/layout/**->**(**)**
الأنواع المتوافقة في قواعد "الملف الشخصي للمرجع"
تتيح قواعد "الملف الشخصي الأساسي" الأنواع التالية. لمعرفة تفاصيل حول هذه الأنواع، يُرجى الاطّلاع على تنسيق Dalvik Executable (DEX).
| الشخصية | النوع | الوصف |
|---|---|---|
B |
بايت | بايت موقَّع |
C |
char | قيمة موضع رمز يونيكود بترميز UTF-16 |
D |
زوجي | قيمة نقطة عائمة مزدوجة الدقة |
F |
عائم | قيمة نقطة عائمة أحادية الدقة |
I |
تدخُّل دفاعي | عدد صحيح |
J |
طويلة | عدد صحيح طويل |
S |
فيديو قصير | فيديو Shorts قصير بلغة الإشارة |
V |
void | Void |
Z |
قيمة منطقية | صواب أم خطأ |
L (اسم الصف) |
مرجع | مثال على اسم فئة |
بالإضافة إلى ذلك، يمكن للمكتبات تحديد القواعد التي يتم تجميعها في عناصر AAR. عند إنشاء حزمة APK لتضمين هذه العناصر، يتم دمج القواعد معًا، على غرار طريقة دمج ملفات البيان، ويتم تجميعها في ملف ثنائي مضغوط لملف ART الشخصي الخاص بحزمة APK.
يستفيد وقت تشغيل Android (ART) من هذا الملف الشخصي عند استخدام حزمة APK على الأجهزة لتجميع مجموعة فرعية معيّنة من التطبيق مسبقًا في وقت التثبيت على الإصدار Android 9 (مستوى واجهة برمجة التطبيقات 28) أو الإصدار Android 7 (مستوى واجهة برمجة التطبيقات 24) عند استخدام ProfileInstaller.
جمع "الملفات الشخصية للمرجع" يدويًا
يمكنك إنشاء ملف أداء أساسي يدويًا بدون إعداد مكتبة Macrobenchmark وإنشاء عمليات تشغيل آلي لواجهة المستخدم لرحلات المستخدم الأساسية. على الرغم من أنّنا ننصح باستخدام Macrobenchmarks، قد لا يكون ذلك ممكنًا دائمًا. على سبيل المثال، إذا كنت تستخدم نظام إصدار غير Gradle، لا يمكنك استخدام المكوّن الإضافي Baseline Profile Gradle. وفي هذه الحالات، يمكنك جمع قواعد "الملف الشخصي الأساسي" يدويًا. ويكون ذلك أسهل بكثير إذا كنت تستخدم جهازًا أو محاكيًا يعمل بالمستوى 34 أو مستوى أحدث لواجهة برمجة التطبيقات. على الرغم من أنّ ذلك لا يزال ممكنًا مع مستويات واجهة برمجة التطبيقات الأقل، إلا أنّه يتطلب الوصول إلى الجذر، وعليك استخدام محاكي يشغّل صورة AOSP. يمكنك جمع القواعد مباشرةً من خلال إجراء ما يلي:
- ثبِّت نسخة الإصدار من تطبيقك على جهاز اختبار. يجب ألّا يكون نوع إصدار التطبيق محسَّنًا باستخدام R8 ويجب ألّا يكون قابلاً للتصحيح لالتقاط ملف شخصي يمكن استخدامه من خلال نظام الإصدار.
- إيقاف تثبيت الملف الشخصي وإغلاق التطبيق
إذا كانت حزمة APK تعتمد على مكتبة Profile Installer في Jetpack، ستعمل المكتبة على تشغيل ملف شخصي عند تشغيل حزمة APK لأول مرة. يمكن أن يتداخل هذا مع عملية إنشاء الملف الشخصي، لذا قم بتعطيله باستخدام الأمر التالي:
adb shell am broadcast -a androidx.profileinstaller.action.SKIP_FILE WRITE_SKIP_FILE $PACKAGE_NAME/androidx.profileinstaller.ProfileInstallReceiver
إعادة ضبط عملية تجميع التطبيق ومحو أي ملفات شخصية
المستوى 34 من واجهة برمجة التطبيقات والإصدارات الأحدث
adb shell cmd package compile -f -m verify $PACKAGE_NAME adb shell pm art clear-app-profiles $PACKAGE_NAME
المستوى 33 أو أقل لواجهة برمجة التطبيقات
adb root adb shell cmd package compile --reset $PACKAGE_NAME
شغِّل التطبيق وانتقِل يدويًا خلال رحلات المستخدم الأساسية التي تريد جمع ملف شخصي لها.
انتظِر لمدة خمس ثوانٍ على الأقل حتى تستقر الملفات الشخصية.
نفِّذ إجراء الحفظ، وانتظِر حتى يكتمل. إذا كانت حزمة APK تعتمد على مكتبة Jetpack Profile Installer، استخدِمها لتفريغ الملفات الشخصية:
إذا لم تكن تستخدم Profile Installer، يمكنك تفريغ الملفات الشخصية يدويًا على محاكي باستخدام الأمر التالي:adb shell am broadcast -a androidx.profileinstaller.action.SAVE_PROFILE $PACKAGE_NAME/androidx.profileinstaller.ProfileInstallReceiver sleep 1 # wait 1 second adb shell am force-stop $PACKAGE_NAME
adb root adb shell killall -s SIGUSR1 $PACKAGE_NAME sleep 1 # wait 1 second adb shell am force-stop $PACKAGE_NAME
حوِّل الملفات الشخصية الثنائية التي تم إنشاؤها إلى نص:
المستوى 34 من واجهة برمجة التطبيقات والإصدارات الأحدث
adb shell pm dump-profiles --dump-classes-and-methods $PACKAGE_NAME
المستوى 33 أو أقل لواجهة برمجة التطبيقات
تحديد ما إذا تم إنشاء ملف شخصي مرجعي أو ملف شخصي حالي يوجد ملف مرجعي في الموقع التالي:
/data/misc/profiles/ref/$$PACKAGE_NAME/primary.prof
يتوفّر ملف شخصي حالي في الموقع الجغرافي التالي:
/data/misc/profiles/cur/0/$PACKAGE_NAME/primary.prof
حدِّد موقع حزمة APK:
adb root adb shell pm path $PACKAGE_NAME
نفِّذ عملية التحويل:
adb root adb shell profman --dump-classes-and-methods --profile-file=$PROFILE_PATH --apk=$APK_PATH > /data/misc/profman/$PACKAGE_NAME-primary.prof.txt
استخدِم
adbلاسترداد الملف الشخصي الذي تم تفريغه من الجهاز:adb pull /data/misc/profman/$PACKAGE_NAME-primary.prof.txt PATH_TO_APP_MODULE/src/main/
يؤدي ذلك إلى سحب قواعد الملف الشخصي التي تم إنشاؤها وتثبيتها في وحدة التطبيق. في المرة التالية التي تنشئ فيها التطبيق، سيتم تضمين "الملف الشخصي الأساسي". يمكنك التحقّق من ذلك باتّباع الخطوات الواردة في مشاكل التثبيت.
قياس تحسينات التطبيق يدويًا
ننصحك بشدة بقياس تحسينات التطبيق من خلال قياس الأداء. ومع ذلك، إذا أردت قياس التحسينات يدويًا، يمكنك البدء بقياس بدء تشغيل التطبيق غير المحسَّن كمرجع.
PACKAGE_NAME=com.example.app# Force Stop App adb shell am force-stop $PACKAGE_NAME # Reset compiled state adb shell cmd package compile --reset $PACKAGE_NAME# Measure App startup # This corresponds to `Time to initial display` metric. adb shell am start-activity -W -n $PACKAGE_NAME/.ExampleActivity \ | grep "TotalTime"
بعد ذلك، حمِّل ملف Baseline Profile من مصدر غير معروف.
# Unzip the Release APK first. unzip release.apk# Create a ZIP archive. # The name should match the name of the APK. # Copy `baseline.prof{m}` and rename it `primary.prof{m}`. cp assets/dexopt/baseline.prof primary.prof cp assets/dexopt/baseline.profm primary.profm# Create an archive. zip -r release.dm primary.prof primary.profm# Confirm that release.dm only contains the two profile files: unzip -l release.dm # Archive: release.dm # Length Date Time Name # --------- ---------- ----- ---- # 3885 1980-12-31 17:01 primary.prof # 1024 1980-12-31 17:01 primary.profm # --------- ------- # 2 files# Install APK + Profile together. adb install-multiple release.apk release.dm
للتحقّق من تحسين الحزمة عند التثبيت، شغِّل الأمر التالي:
# Check dexopt state.
adb shell dumpsys package dexopt | grep -A 1 $PACKAGE_NAMEيجب أن يشير الناتج إلى أنّه تم تجميع الحزمة:
[com.example.app]
path: /data/app/~~YvNxUxuP2e5xA6EGtM5i9A==/com.example.app-zQ0tkJN8tDrEZXTlrDUSBg==/base.apk
arm64: [status=speed-profile] [reason=install-dm]
يمكنك الآن قياس أداء بدء تشغيل التطبيق كما في السابق ولكن بدون إعادة ضبط حالة التجميع. تأكَّد من عدم إعادة ضبط الحالة المجمّعة للحزمة.
# Force stop app adb shell am force-stop $PACKAGE_NAME# Measure app startup adb shell am start-activity -W -n $PACKAGE_NAME/.ExampleActivity \ | grep "TotalTime"
"الملفات الشخصية للمرجع" وأداة profgen
يصف هذا القسم وظيفة أداة profgen عند إنشاء نسخة ثنائية مدمجة من ملف أداء أساسي.
تساعد أداة Profgen-cli في تجميع الملفات الشخصية وفحصها وترجمة ملفات ART من مصدر إلى مصدر، بحيث يمكن تثبيتها على الأجهزة التي تعمل بنظام التشغيل Android بغض النظر عن إصدار حزمة تطوير البرامج (SDK) المستهدَف.
Profgen-cli هي واجهة سطر أوامر (CLI) تترجم ملف HRF الخاص بملف أداء أساسي إلى
تنسيقه المجمَّع. يتم أيضًا شحن واجهة سطر الأوامر في مستودع cmdline-tools كجزء من حزمة تطوير البرامج (SDK) لنظام التشغيل Android.
تتوفّر هذه الميزات في فرع studio-main:
➜ ../cmdline-tools/latest/bin
apkanalyzer
avdmanager
lint
profgen
retrace
screenshot2
sdkmanager
إنشاء ملفات شخصية ثنائية مدمجة باستخدام Profgen-cli
الأوامر المتاحة في Profgen-cli هي bin وvalidate وdumpProfile. للاطّلاع على الأوامر المتاحة، استخدِم profgen --help:
➜ profgen --help
Usage: profgen options_list
Subcommands:
bin - Generate Binary Profile
validate - Validate Profile
dumpProfile - Dump a binary profile to a HRF
Options:
--help, -h -> Usage info
استخدِم الأمر bin لإنشاء ملف شخصي ثنائي مضغوط. في ما يلي مثال على الاستدعاء:
profgen bin ./baseline-prof.txt \
--apk ./release.apk \
--map ./obfuscation-map.txt \
--profile-format v0_1_0_p \
--output ./baseline.prof \
للاطّلاع على الخيارات المتاحة، استخدِم profgen bin options_list:
Usage: profgen bin options_list
Arguments:
profile -> File path to Human Readable profile { String }
Options:
--apk, -a -> File path to apk (always required) { String }
--output, -o -> File path to generated binary profile (always required)
--map, -m -> File path to name obfuscation map { String }
--output-meta, -om -> File path to generated metadata output { String }
--profile-format, -pf [V0_1_0_P] -> The ART profile format version
{ Value should be one of [
v0_1_5_s, v0_1_0_p, v0_0_9_omr1, v0_0_5_o, v0_0_1_n
]
}
--help, -h -> Usage info
تمثّل الوسيطة الأولى المسار إلى ملف HRF الخاص بـ baseline-prof.txt.
تحتاج Profgen-cli أيضًا إلى مسار بنية الإصدار لحزمة APK وخريطة تشويش تُستخدَم لتشويش حزمة APK عند استخدام R8 أو Proguard. بهذه الطريقة، يمكن لـ "profgen" ترجمة الرموز المصدرية في
ملف HRF إلى الأسماء المقابلة لها التي تم إخفاؤها عند إنشاء الملف الشخصي المجمَّع.
بما أنّ تنسيقات ملفات ART الشخصية غير متوافقة مع الأنظمة القديمة أو الحديثة، عليك تقديم تنسيق ملف شخصي لكي يتمكّن profgen من تجميع البيانات الوصفية للملف الشخصي (profm) التي يمكنك استخدامها لتحويل تنسيق ملف ART شخصي إلى تنسيق آخر عند الحاجة.
تنسيقات الملفات الشخصية وإصدارات الأنظمة الأساسية
تتوفّر الخيارات التالية عند اختيار تنسيق ملف شخصي:
| تنسيق الملف الشخصي | إصدار النظام الأساسي | مستوى واجهة برمجة التطبيقات |
|---|---|---|
| v0_1_5_s | الإصدار S من Android والإصدارات الأحدث | أكثر من 31 |
| v0_1_0_p | Android P وQ وR | 28-30 |
| v0_0_9_omr1 | Android O MR1 | 27 |
| v0_0_5_o | Android O | 26 |
| v0_0_1_n | Android N | 24-25 |
انسخ ملفَي الإخراج baseline.prof وbaseline.profm إلى المجلد assets أو dexopt في حزمة APK.
خرائط إخفاء مفاتيح فك التشفير
ما عليك سوى تقديم خريطة التشويش إذا كان ملف HRF يستخدم رموز المصدر. إذا تم إنشاء ملف HRF من بنية إصدار تم تشويشها بالفعل ولا توجد حاجة إلى إجراء عملية ربط، يمكنك تجاهل هذا الخيار ونسخ المخرجات إلى المجلد assets أو dexopt.
التثبيت التقليدي لـ "الملفات الشخصية للمرجع"
يتم عادةً إرسال "الملفات الأساسية" إلى الجهاز بإحدى طريقتَين.
استخدام install-multiple مع DexMetadata
على الأجهزة التي تعمل بالمستوى 28 من واجهة برمجة التطبيقات والإصدارات الأحدث، ينزّل تطبيق Play حزمة APK وحمولة DexMetadata (DM) لإصدار حزمة APK الذي يتم تثبيته. تحتوي رسالة DM على معلومات الملف الشخصي التي يتم تمريرها إلى "مدير الحِزم" على الجهاز.
يتم تثبيت حزمة APK ووحدة DM كجزء من جلسة تثبيت واحدة باستخدام أمر مثل:
adb install-multiple base.apk base.dm
Jetpack ProfileInstaller
على الأجهزة التي تعمل بالمستوى 29 من واجهة برمجة التطبيقات والإصدارات الأحدث، توفّر مكتبة Jetpack
ProfileInstaller آلية بديلة لتثبيت ملف شخصي مُجمَّع في assets أو dexopt بعد تثبيت حزمة APK على الجهاز. يتم استدعاء ProfileInstaller من خلال
ProfileInstallReceiver أو من خلال التطبيق مباشرةً.
تعمل مكتبة ProfileInstaller على تحويل ترميز الملف الشخصي استنادًا إلى إصدار حزمة تطوير البرامج (SDK) الخاص بجهاز الاختبار، وتنسخ الملف الشخصي إلى دليل cur على الجهاز (دليل مرحلي خاص بالحزمة لملفات ART الشخصية على الجهاز).
عندما يكون الجهاز غير نشط، يتم اختيار الملف الشخصي من خلال عملية تُسمى
bg-dexopt على الجهاز.
تثبيت "ملف شخصي للمرجع" من مصدر غير معروف
يوضّح هذا القسم كيفية تثبيت ملف شخصي أساسي لملف APK معيّن.
الإعلان على جميع الأجهزة باستخدام "androidx.profileinstaller"
على الأجهزة التي تعمل بالإصدار 24 من واجهة برمجة التطبيقات والإصدارات الأحدث، يمكنك بث أمر لتثبيت الملف الشخصي:
# Broadcast the install profile command - moves binary profile from assets
# to a location where ART uses it for the next compile.
# When successful, the following command prints "1":
adb shell am broadcast \
-a androidx.profileinstaller.action.INSTALL_PROFILE \
<pkg>/androidx.profileinstaller.ProfileInstallReceiver
# Kill the process
am force-stop <pkg>
# Compile the package based on profile
adb shell cmd package compile -f -m speed-profile <pkg>
لا تتوفّر مكتبة ProfileInstaller في معظم حِزم APK التي تتضمّن "الملفات الشخصية الأساسية"، والتي تبلغ حوالي 77 ألفًا من أصل 450 ألف تطبيق على Play، على الرغم من توفّرها في كل حِزمة APK تستخدم Compose. ويرجع ذلك إلى أنّ المكتبات يمكنها توفير ملفات شخصية بدون الإعلان عن تبعية لـ ProfileInstaller. تتم إضافة تبعية في كل مكتبة باستخدام ملف شخصي بدءًا من Jetpack.
استخدام install-multiple مع profgen أو DexMetaData
على الأجهزة التي تعمل بالمستوى 28 من واجهة برمجة التطبيقات والإصدارات الأحدث، يمكنك تحميل ملف Baseline Profile من مصدر غير معروف بدون الحاجة إلى توفّر مكتبة ProfileInstaller في التطبيق.
لإجراء ذلك، استخدِم Profgen-cli:
profgen extractProfile \
--apk app-release.apk \
--output-dex-metadata app-release.dm \
--profile-format V0_1_5_S # Select based on device and the preceding table.
# Install APK and the profile together
adb install-multiple appname-release.apk appname-release.dm
لإتاحة تقسيم حِزم APK، نفِّذ خطوات استخراج الملف الشخصي السابقة مرة واحدة لكل حزمة APK. عند التثبيت، يجب تمرير كل ملف APK وملف .dm المرتبط به، مع التأكّد من تطابق أسماء ملفات APK و.dm:
adb install-multiple appname-base.apk appname-base.dm \
appname-split1.apk appname-split1.dm
إثبات الهوية
للتحقّق من تثبيت الملف الشخصي بشكل صحيح، يمكنك اتّباع الخطوات الواردة في مقالة قياس تحسينات التطبيق يدويًا.
تفريغ محتوى ملف شخصي ثنائي
لفحص محتوى نسخة ثنائية مضغوطة من ملف أداء أساسي، استخدِم خيار Profgen-cli dumpProfile:
Usage: profgen dumpProfile options_list
Options:
--profile, -p -> File path to the binary profile (always required)
--apk, -a -> File path to apk (always required) { String }
--map, -m -> File path to name obfuscation map { String }
--strict, -s [true] -> Strict mode
--output, -o -> File path for the HRF (always required) { String }
--help, -h -> Usage info
يحتاج dumpProfile إلى حزمة APK لأنّ التمثيل الثنائي المضغوط يخزّن فقط إزاحات DEX، وبالتالي يحتاج إليها لإعادة إنشاء أسماء الفئات والطُرق.
يتم تفعيل وضع التدقيق الصارم تلقائيًا، ويؤدي ذلك إلى إجراء فحص توافق
الملف الشخصي مع ملفات DEX في حزمة APK. إذا كنت تحاول تصحيح أخطاء الملفات الشخصية
التي تم إنشاؤها بواسطة أداة أخرى، فقد تحصل على حالات فشل في التوافق
تمنعك من القدرة على التفريغ للتحقيق. في هذه الحالات، يمكنك إيقاف "وضع التدقيق الصارم" باستخدام --strict false. ومع ذلك، في معظم الحالات، يجب
إبقاء وضع التدقيق الصارم مفعَّلاً.
خريطة التشويش اختيارية، وعند توفيرها، تساعد في إعادة ربط الرموز المموَّهة بنُسخها التي يمكن لشخص عادي قراءتها لتسهيل الاستخدام.
التطبيقات المقترَحة لك
- ملاحظة: يتم عرض نص الرابط عندما يكون JavaScript غير مفعَّل
- أفضل الممارسات لتحسين أداء SQLite
- الملفات الشخصية للمرجع {:#baseline-profiles}
- عمليات قفل التنشيط الجزئي المتوقِّف