في السابق، كان نظام التشغيل Android يتيح فقط صفحات الذاكرة بحجم 4 كيلوبايت، ما ساعد في تحسين أداء ذاكرة النظام بما يتناسب مع إجمالي مساحة الذاكرة التي كانت تتوفّر عادةً في أجهزة Android. بدءًا من الإصدار 15 من نظام التشغيل Android، يتيح مشروع Android مفتوح المصدر (AOSP) استخدام الأجهزة التي تم ضبطها لاستخدام حجم صفحة يبلغ 16 كيلوبايت (أجهزة 16 كيلوبايت). إذا كان تطبيقك يستخدم أي مكتبات NDK، سواء بشكل مباشر أو غير مباشر من خلال حزمة تطوير برامج (SDK)، عليك إعادة إنشاء تطبيقك لكي يعمل على هذه الأجهزة التي تستخدم صفحات ذاكرة بحجم 16 كيلوبايت.
مع استمرار الشركات المصنّعة للأجهزة في تصميم أجهزة تتضمّن كميات أكبر من الذاكرة الفعلية (RAM)، ستستخدم العديد من هذه الأجهزة أحجام صفحات تبلغ 16 كيلوبايت (وأكبر في النهاية) لتحسين أداء الجهاز. تتيح إضافة دعم للأجهزة التي تستخدم صفحات بحجم 16 كيلوبايت تشغيل تطبيقك على هذه الأجهزة، كما تساعد تطبيقك في الاستفادة من التحسينات المرتبطة بالأداء. وبدون إعادة تجميع، لن تعمل التطبيقات على الأجهزة التي تستخدم صفحات الذاكرة بحجم 16 كيلوبايت في إصدارات Android المستقبلية.
لمساعدتك في إضافة إمكانية استخدام تطبيقك، قدّمنا إرشادات حول كيفية التحقّق مما إذا كان تطبيقك سيتأثر، وكيفية إعادة إنشاء تطبيقك (إذا كان ذلك منطبقًا)، وكيفية اختبار تطبيقك في بيئة بحجم 16 كيلوبايت باستخدام المحاكيات (بما في ذلك صور نظام Android 15 لمحاكي Android).
متطلبات التوافق مع Google Play
لضمان عمل تطبيقك بشكل صحيح على أحدث إصدارات Android، يجب أن تتوافق جميع التطبيقات التي تستهدف الإصدار Android 15 (مستوى واجهة برمجة التطبيقات 35) والإصدارات الأحدث مع صفحات الذاكرة بحجم 16 كيلوبايت على الأجهزة التي تعمل بنظام 64 بت على Google Play. اعتبارًا من 1 فبراير 2027، إذا كانت تحديثات تطبيقك لا تتوافق مع صفحات الذاكرة بحجم 16 كيلوبايت، فلن يكون بإمكانك طرح هذه التحديثات.
المزايا وتحسينات الأداء
تستهلك الأجهزة التي تم ضبطها على أحجام صفحات تبلغ 16 كيلوبايت مساحة أكبر قليلاً من الذاكرة في المتوسط، لكنها تُجري أيضًا تحسينات متنوعة في الأداء لكل من النظام والتطبيقات:
- أوقات تشغيل التطبيق أقل عندما يكون النظام تحت ضغط الذاكرة: 3.16% انخفاضًا في المتوسط، مع تحسينات أكثر أهمية (تصل إلى %30) لبعض التطبيقات التي اختبرناها
- انخفاض في استهلاك الطاقة أثناء تشغيل التطبيق: انخفاض بنسبة% 4.56 في المتوسّط
- تشغيل أسرع للكاميرا: عمليات تشغيل أسرع بنسبة 4.48% في المتوسط، وعمليات تشغيل على البارد أسرع بنسبة 6.60% في المتوسط
- مدة تشغيل النظام المحسَّنة: تحسّنت بنسبة %8 (950 ملي ثانية تقريبًا) في المتوسّط
تستند هذه التحسينات إلى اختبارنا الأوّلي، ومن المرجّح أن تختلف النتائج على الأجهزة الفعلية. وسنقدّم تحليلاً إضافيًا للفوائد المحتملة للتطبيقات أثناء مواصلة الاختبار.
التأكّد من تأثُّر تطبيقك
إذا كان تطبيقك يستخدم أي رموز برمجية أصلية، عليك إعادة إنشاء تطبيقك ليتوافق مع الأجهزة التي تستخدم صفحات ذاكرة بحجم 16 كيلوبايت. إذا لم تكن متأكدًا مما إذا كان تطبيقك يستخدم رمزًا برمجيًا أصليًا، يمكنك استخدام "أداة تحليل حِزم APK" لتحديد ما إذا كان هناك أي رمز برمجي أصلي، ثم التحقّق من توافق أقسام ELF مع أي مكتبات مشتركة تجدها. يوفّر "استوديو Android" أيضًا ميزات تساعدك في رصد مشاكل المحاذاة تلقائيًا.
إذا كان تطبيقك يستخدم فقط الرموز البرمجية المكتوبة بلغة البرمجة Java أو Kotlin، بما في ذلك جميع المكتبات أو حِزم تطوير البرامج (SDK)، يكون تطبيقك متوافقًا مع الأجهزة التي تبلغ سعتها 16 كيلوبايت. ومع ذلك، ننصحك باختبار تطبيقك في بيئة بحجم 16 كيلوبايت للتأكّد من عدم حدوث أي تراجع غير متوقّع في سلوك التطبيق.
هل يستخدم تطبيقك رمزًا برمجية أصلية؟
يستخدم تطبيقك رمزًا برمجية أصلية إذا كان أيّ مما يلي ينطبق عليه:
- يستخدم تطبيقك أي رمز برمجية أصلية بلغة C أو C++. إذا كان تطبيقك يستخدم Android NDK، فهذا يعني أنّه يستخدم رمزًا برمجية أصلية.
- يربط تطبيقك أي مكتبات أو تبعيات أصلية تابعة لجهات خارجية (مثل حِزم SDK) تستخدمها.
- تم إنشاء تطبيقك باستخدام أداة إنشاء تطبيقات تابعة لجهة خارجية تستخدم مكتبات أصلية على الجهاز.
تحديد المكتبات المجمّعة من رموز برمجية أصلية باستخدام أداة تحليل ملفات APK
أداة تحليل ملفات APK هي أداة تتيح لك تقييم جوانب مختلفة من حزمة APK التي تم إنشاؤها. لمعرفة ما إذا كان تطبيقك يستخدم رمزًا برمجية أصلية (بغض النظر عمّا إذا كان متوافقًا مع صفحة الذاكرة بحجم 16 كيلوبايت):
- افتح استوديو Android، ثم انقر على ملف > فتح واختَر أي مشروع.
من شريط القوائم، انقر على إنشاء > تحليل حزمة APK...
اختَر حزمة APK التي تريد تحليلها.
ابحث داخل مجلد
libالذي يحتوي على ملفات الكائنات المشترَكة (.so) إذا كانت متوفّرة. إذا كانت أي ملفات كائنات مشترَكة متوفّرة، فهذا يعني أنّ تطبيقك يستخدم رمزًا برمجية أصلية. يعرض عمود المحاذاة رسائل تحذير لأي ملفات تواجه مشاكل في المحاذاة. إذا لم تكن أي ملفات كائنات مشترَكة متوفّرة أو لم يكن هناك مجلدlib، فهذا يعني أنّ تطبيقك لا يستخدم رمزًا برمجية أصلية.
رصد مشاكل المحاذاة باستخدام عمليات التحقّق الآلية
يعرض "استوديو Android" تحذيرات بشكل استباقي إذا لم تكن مكتباتك التي تم إنشاؤها مسبقًا أو حِزم APK متوافقة مع صفحة الذاكرة بحجم 16 كيلوبايت. استخدِم أداة APK Analyzer لمعرفة المكتبات التي يجب تحديثها أو ما إذا كانت هناك أي تغييرات مطلوبة في الرمز البرمجي.
تُبرز أداة Lint في "استوديو Android" أيضًا المكتبات الأصلية التي لا تتوافق مع صفحة الذاكرة بحجم 16 كيلوبايت.
التحقّق من محاذاة أقسام ELF للمكتبات المشترَكة
بالنسبة إلى أي مكتبات مشترَكة، تأكَّد من أنّ أقسام ELF للمكتبات المشترَكة تتم محاذاتها بشكل صحيح باستخدام محاذاة ELF بحجم 16 كيلوبايت. إذا كنت تطوّر على Linux أو macOS، يمكنك استخدام النص البرمجي check_elf_alignment.sh كما هو موضّح في القسم التالي. يمكنك أيضًا استخدام أدوات سطر الأوامر مباشرةً.
استخدام النص البرمجي check_elf_alignment.sh (Linux أو macOS)
اتّبِع الخطوات التالية للتحقّق من محاذاة أقسام ELF باستخدام النص البرمجي check_elf_alignment.sh:
احفظ النص البرمجي
check_elf_alignment.shفي ملف.شغِّل النص البرمجي على ملف APK الخاص بتطبيقك:
check_elf_alignment.sh APK_NAME.apkيعرض النص البرمجي
ALIGNEDأوUNALIGNEDلجميع المكتبات المشترَكةarm64-v8a.إذا كانت أي مكتبات مشترَكة
arm64-v8aأوx86_64هيUNALIGNED، عليك تعديل عملية التغليف لهذه المكتبات، ثم إعادة تجميع تطبيقك وإعادة اختباره باتّباع الخطوات الواردة في هذا القسم.
استخدام أدوات سطر الأوامر مباشرةً
اتّبِع الخطوات التالية للتحقّق من محاذاة أقسام ELF باستخدام أدوات سطر الأوامر مباشرةً:
- تأكَّد من تثبيت الإصدار 35.0.0 أو إصدار أحدث من حزمة Android SDK Build-Tools و
Android NDK باستخدام SDK Manager في "استوديو Android" أو
sdkmanagerأداة سطر الأوامر. استخرِج ملف APK الخاص بتطبيقك:
Linux أو macOS
unzip APK_NAME.apk -d /tmp/my_apk_outنظام التشغيل Windows (PowerShell)
Expand-Archive -Path .\APK_NAME.apk -DestinationPath ~\tmp\my_apk_outفي الدليل المؤقت الذي استخرجت إليه ملف APK، تحقَّق من محتويات دليل
libبحثًا عن ملفات الكائنات المشترَكة (.so). هذه هي ملفات الكائنات المشترَكة نفسها التي كنت ستراها أثناء تحديد المكتبات المجمّعة من رموز برمجية أصلية باستخدام أداة تحليل ملفات APK. شغِّل الأمر التالي على كل ملف كائن مشترَك:Linux أو macOS
SDK_ROOT_LOCATION/Android/sdk/ndk/NDK_VERSION/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objdump -p SHARED_OBJECT_FILE.so | grep LOADنظام التشغيل Windows (PowerShell)
SDK_ROOT_LOCATION\Android\sdk\ndk\NDK_VERSION\toolchains\llvm\prebuilt\windows-x86_64\bin\llvm-objdump.exe -p SHARED_OBJECT_FILE.so | Select-String -Pattern "LOAD"حيث
SDK_ROOT_LOCATIONهو مسار الدليل الذي ثبَّت فيه حزمة Android SDK، وSHARED_OBJECT_FILEهو اسم ملف الكائن المشترَك الذي تتحقّق منه، وNDK_VERSIONهو إصدار Android NDK الذي ثبَّته (على سبيل المثال،28.0.12433566). ستبدو النتائج على النحو التالي لكل ملف تتحقّق منه:LOAD off 0x0000000000000000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**14 LOAD off 0x0000000000042a90 vaddr 0x0000000000043a90 paddr 0x0000000000043a90 align 2**14 LOAD off 0x0000000000046230 vaddr 0x0000000000048230 paddr 0x0000000000048230 align 2**14تحقَّق من أسطر النتائج للتأكّد من أنّ أقسام التحميل لا تحتوي على قيم أقل من
2**14. إذا كانت أي أقسام تحميل هي2**13أو2**12أو قيم أقل ، عليك تعديل عملية التغليف لهذه المكتبات، ثم إعادة تجميع تطبيقك وإعادة اختباره باتّباع الخطوات الواردة في هذا القسم.بعد ذلك، شغِّل أداة سطر الأوامر
zipalignعلى ملف APK الخاص بتطبيقك:Linux أو macOS
SDK_ROOT_LOCATION/Android/sdk/build-tools/35.0.0/zipalign -v -c -P 16 4 APK_NAME.apkنظام التشغيل Windows (PowerShell)
SDK_ROOT_LOCATION\Android\sdk\build-tools\35.0.0\zipalign.exe -v -c -P 16 4 APK_NAME.apkحيث
SDK_ROOT_LOCATIONهو مسار الدليل الذي ثبَّت فيه حزمة Android SDK، وAPK_NAMEهو اسم ملف APK الخاص بتطبيقك. سيظهر في السطر الأخير من النتائج "تم التحقّق بنجاح" إذا كانت جميع المكتبات المشترَكة تتم محاذاتها بشكل صحيح.إذا تعذّر التحقّق، يجب إعادة محاذاة بعض المكتبات المشترَكة، لذا عليك تعديل عملية التغليف لهذه المكتبات، ثم إعادة تجميع تطبيقك وإعادة اختباره باتّباع الخطوات الواردة في هذا القسم.
التحقّق من علامة الأمان RELRO
للتخفيف من الثغرات الأمنية، تستخدم أدوات الربط الحديثة علامة Relocation Read-Only (RELRO) لجعل أقسام النقل في ملف الكائن المشترَك للقراءة فقط بعد التحميل. فعِّل علامة RELRO في عملية الـإنشاء.
إذا كان قسم RELRO يحتوي على عنوان بداية بالإضافة إلى حجم القسم (MemSize) لا يتوافق مع صفحة الذاكرة بحجم 16 كيلوبايت، سيتعطّل التطبيق في وقت التشغيل بسبب خطأ في التقسيم. يحدث
ذلك إذا تم إنشاء ملف .soباستخدام سلسلة أدوات NDK r27 والإصدارات الأقدم بدون
تفعيل العلامات ذات الصلة.
شغِّل الأمر التالي على كل ملف كائن مشترَك (Linux أو macOS):
SDK_ROOT_LOCATION/Android/sdk/ndk/NDK_VERSION/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-readelf -Wl SHARED_OBJECT_FILE.so | grep 'RELRO\|Type'
تتم طباعة السلسلة GNU_RELRO إذا كان هناك قسم RELRO.
بعد ذلك، تحقَّق من محاذاة قسم RELRO عن طريق جمع عنوان الإزاحة الافتراضية (VirtAddr) مع حجم ذاكرة القسم (MemSiz) والقسمة على 16 كيلوبايت (0x4000). إذا كان الباقي (modulo) صفرًا، فهذا يعني أنّ قسم RELRO متوافق مع صفحة الذاكرة بحجم 16 كيلوبايت.
في ما يلي مثال على ملف .so غير متوافق مع صفحة الذاكرة بحجم 16 كيلوبايت:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
GNU_RELRO 0x0cfaf0 0x00000000000dfaf0 0x00000000000dfaf0 0x01510 0x01510 R 0x1
الصيغة: (VirtAddr + MemSiz) % 0x4000 == 0
النتيجة: (0xdfaf0 + 0x01510) % 0x4000 = 0xE1000 % 0x4000 == 0x1000
بما أنّ 0x1000 ليس صفرًا، فإنّ libbad.so لا يتوافق مع صفحة الذاكرة بحجم 16 كيلوبايت. نطاق الحماية RELRO من DC000 (فاصل الصفحات السابق) إلى E4000 للقراءة فقط، ولكنّ Android Linker يتوقّع أن يكون النطاق الفرعي من E1000 إلى E4000 قابلاً للكتابة، ما يؤدي إلى حدوث خطأ في التقسيم. في هذه الحالة، أعِد إنشاء ملف .so كما هو موضّح في قسم تجميع تطبيقك باستخدام محاذاة ELF بحجم 16 كيلوبايت.
في ما يلي مثال على ملف .so متوافق مع صفحة الذاكرة بحجم 16 كيلوبايت ويتضمّن قسم RELRO:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
GNU_RELRO 0x0cfaf0 0x00000000000dfaf0 0x00000000000dfaf0 0x01510 0x00510 R 0x1
إنشاء تطبيقك ليتوافق مع الأجهزة التي تستخدم صفحات الذاكرة بحجم 16 كيلوبايت
إذا كان تطبيقك يستخدم رمزًا برمجية أصلية، فأكمِل الخطوات الموضّحة في الأقسام التالية للتأكّد من أنّ تطبيقك متوافق مع الأجهزة التي تستخدم صفحات الذاكرة بحجم 16 كيلوبايت:
- تعديل عملية تغليف مكتباتك المشترَكة
- تجميع تطبيقك باستخدام محاذاة ELF بحجم 16 كيلوبايت
- إصلاح الرمز البرمجي وحلّ مشاكل وقت التشغيل
- التحقّق من توافق حِزم SDK مع صفحة الذاكرة بحجم 16 كيلوبايت
تعديل عملية تغليف مكتباتك المشترَكة
رقِّ إلى الإصدار 8.5.1 أو إصدار أحدث من "المكوّن الإضافي لنظام Gradle المتوافق مع Android" واستخدِم مكتبات مشترَكة غير مضغوطة.
استخدام bundletool للتحقّق من محاذاة zip
للاطّلاع على محاذاة حزمتك، استخدِم:
bundletool dump config --bundle=<my .aab> | grep alignment
إذا ظهرت لك PAGE_ALIGNMENT_16K، فهذا يعني أنّ حزمتك تطلب محاذاة zip بحجم 16 كيلوبايت. إذا ظهرت لك PAGE_ALIGNMENT_4K، فهذا يوجّه حزمة APK التي تم إنشاؤها من حزمة AAB هذه إلى أن تحتوي على ملفات ` .so` متوافقة مع محاذاة zip بحجم 4 كيلوبايت في ملف zip.
الإصدار 8.5.1 أو إصدار أحدث من "المكوّن الإضافي لنظام Gradle المتوافق مع Android"
تتطلب الأجهزة التي تستخدم صفحات الذاكرة بحجم 16 كيلوبايت تطبيقات تتضمّن مكتبات مشترَكة غير مضغوطة لمحاذاتها على حدّ متوافق مع محاذاة zip بحجم 16 كيلوبايت. لإجراء ذلك، عليك الترقية إلى الإصدار 8.5.1 أو إصدار أحدث من "المكوّن الإضافي لنظام Gradle المتوافق مع Android". يُرجى الرجوع إلى قسم "مساعد ترقية المكوّن الإضافي لنظام Gradle المتوافق مع Android" للحصول على تفاصيل عن عملية الترقية.
الإصدار 8.5 أو إصدار أقدم من "المكوّن الإضافي لنظام Gradle المتوافق مع Android"
إذا تعذّر عليك ترقية "المكوّن الإضافي لنظام Gradle المتوافق مع Android" إلى الإصدار 8.5.1 أو إصدار أحدث، فإنّ البديل هو التبديل إلى استخدام مكتبات مشترَكة مضغوطة. عدِّل إعدادات Gradle لكي يضغط Gradle مكتباتك المشترَكة عند تغليف تطبيقك لتجنُّب مشاكل تثبيت التطبيق مع المكتبات المشترَكة غير المتوافقة مع صفحة الذاكرة بحجم 16 كيلوبايت.
أنيق
في ملف build.gradle، أضِف الخيار التالي:
android {
...
packagingOptions {
jniLibs {
useLegacyPackaging true
}
}
}
Kotlin
في ملف build.gradle.kts، أضِف الخيار التالي:
android {
...
packagingOptions {
jniLibs {
useLegacyPackaging = true
}
}
}
الإصدار 8.0 أو إصدار أقدم من "المكوّن الإضافي لنظام Gradle المتوافق مع Android"
إذا كنت تستخدم إصدارًا من AGP يساوي الإصدار 8.0 أو إصدارًا أقدم، عليك أيضًا إيقاف خيار المكتبة المجمّعة من رموز برمجية أصلية غير المضغوطة لحِزم التطبيقات في ملف gradle.properties:
android.bundle.enableUncompressedNativeLibs=false
تجميع تطبيقك باستخدام محاذاة ELF بحجم 16 كيلوبايت
تتطلب الأجهزة التي تستخدم صفحات الذاكرة بحجم 16 كيلوبايت محاذاة أقسام ELF للمكتبات المشترَكة بشكل صحيح باستخدام محاذاة ELF بحجم 16 كيلوبايت لكي يتم تشغيل تطبيقك.
بالنسبة إلى مطوّري الألعاب، إذا كانت لعبتك تعمل على محرّك ألعاب Unity، يُرجى الرجوع إلى دليل Unity. إذا كانت لعبتك تعمل على محرّك ألعاب Unreal، يُرجى الرجوع إلى دليل Unreal.بالنسبة إلى محرّكات الألعاب الأصلية، يُرجى مواصلة اتّباع هذا الدليل.
لتجميع تطبيقك باستخدام محاذاة ELF بحجم 16 كيلوبايت، أكمِل الخطوات الواردة في أحد الأقسام التالية استنادًا إلى إصدار Android NDK الذي تستخدمه.
الإصدار r28 والإصدارات الأحدث من Android NDK
يقوم الإصدار r28 والإصدارات الأحدث من NDK بتجميع المكتبات المتوافقة مع صفحة الذاكرة بحجم 16 كيلوبايت تلقائيًا.
الإصدار r27 والإصدارات الأقدم من Android NDK
لتوفير إمكانية تجميع المكتبات المشترَكة المتوافقة مع صفحة الذاكرة بحجم 16 كيلوبايت باستخدام الإصدار r27 أو إصدار أقدم من Android NDK، استخدِم علامات الرابط التالية:
-Wl,-z,max-page-size=16384
-Wl,-z,common-page-size=16384
في ما يلي كيفية تعديل ملفات إعدادات نظام الإنشاء:
ndk-build
إذا كنت تستخدم ndk-build، عدِّل ملف Android.mk لتفعيل محاذاة ELF بحجم 16 كيلوبايت:
LOCAL_LDFLAGS += -Wl,-z,max-page-size=16384 -Wl,-z,common-page-size=16384
CMake
إذا كنت تستخدم CMake، عدِّل ملف CMakeLists.txt لتفعيل محاذاة ELF بحجم 16 كيلوبايت:
target_link_options(${CMAKE_PROJECT_NAME} PRIVATE
"-Wl,-z,max-page-size=16384"
"-Wl,-z,common-page-size=16384"
)
إصلاح الرمز البرمجي وحلّ مشاكل وقت التشغيل
حتى إذا كان تطبيقك متوافقًا مع صفحة الذاكرة بحجم 16 كيلوبايت، قد يواجه أخطاء إذا كانت مواضع في الرمز البرمجي تفترض أنّ الجهاز يستخدم حجم صفحة معيّنًا. لتجنُّب ذلك، أكمِل الخطوات التالية:
أزِل أي تبعيات مبرمَجة بشكل ثابت تشير إلى الـ
PAGE_SIZEثابت أو الحالات في منطق الرمز البرمجي التي تفترض أنّ حجم صفحة الجهاز هو 4 كيلوبايت (4096).استخدِم
getpagesize()أوsysconf(_SC_PAGESIZE)بدلاً من ذلك.ابحث عن استخدامات
mmap()وواجهات برمجة التطبيقات الأخرى التي تتطلب وسيطات متوافقة مع حجم الصفحة واستبدِلها ببدائل عند الضرورة.
في بعض الحالات، إذا كان تطبيقك يستخدم PAGE_SIZE كقيمة مناسبة غير مرتبطة بحجم الصفحة الأساسي، فلن يؤدي ذلك إلى تعطُّل تطبيقك عند استخدامه في وضع 16 كيلوبايت. ومع ذلك، إذا تم تمرير هذه القيمة إلى النواة باستخدام mmap بدون MAP_FIXED، ستظل النواة تستخدم صفحة كاملة، ما يؤدي إلى إهدار بعض الذاكرة. لهذه الأسباب، تكون PAGE_SIZE غير محدّدة عند تفعيل وضع 16 كيلوبايت على الإصدار r27 والإصدارات الأحدث من NDK.
إذا كان تطبيقك يستخدم PAGE_SIZE بهذه الطريقة ولا يمرّر هذه القيمة مباشرةً إلى النواة، فبدلاً من استخدام PAGE_SIZE، أنشئ متغيّرًا جديدًا باسم جديد للإشارة إلى أنّه يُستخدم لأغراض أخرى ولا يعكس صفحة ذاكرة حقيقية.
التحقّق من توافق حِزم SDK مع صفحة الذاكرة بحجم 16 كيلوبايت
تتوافق العديد من حِزم SDK مع أحجام الصفحات البالغة 16 كيلوبايت، خاصةً إذا كنت تنشئها بنفسك أو تحصل على حِزم تم إنشاؤها مسبقًا مؤخرًا. ومع ذلك، بما أنّ بعض حِزم SDK التي تم إنشاؤها مسبقًا أو إصدارات حِزم SDK لا تتوافق مع صفحة الذاكرة بحجم 16 كيلوبايت، عليك التحقّق من الموقع الإلكتروني لكل موفّر حزمة SDK لتحديد الإصدار الذي يجب استخدامه مع صفحة الذاكرة بحجم 16 كيلوبايت.
اختبار تطبيقك في بيئة تتضمن صفحات ذاكرة بحجم 16 كيلوبايت
بعد إنشاء تطبيقك ليتوافق مع الأجهزة التي تستخدم صفحات الذاكرة بحجم 16 كيلوبايت، عليك اختباره في بيئة تتضمن صفحات ذاكرة بحجم 16 كيلوبايت لمعرفة ما إذا كان تطبيقك يواجه أي مشاكل. لإجراء ذلك، اتّبِع الخطوات التالية:
أعِدّ حزمة Android 15 SDK أو إصدارًا أحدث.
أعِدّ إحدى بيئات الاختبار التالية:
- أعِدّ Android Emulator باستخدام صورة نظام Android 15 تستند إلى 16 كيلوبايت
- استخدِم Cuttlefish مع حجم صفحة 16 كيلوبايت على ARM64
- محاكاة Cuttlefish مع حجم صفحة 16 كيلوبايت على x86-64
- تفعيل وضع 16 كيلوبايت على جهاز باستخدام خيارات المطوّرين
- استخدِم Samsung Remote Test Lab على الأجهزة المتوافقة مع صفحة الذاكرة بحجم 16 كيلوبايت
ابدأ تشغيل جهاز الاختبار، ثم شغِّل الأمر التالي للتأكّد من أنّه يستخدم بيئة تتضمن صفحات ذاكرة بحجم 16 كيلوبايت:
adb shell getconf PAGE_SIZEيجب أن يعرض الأمر القيمة
16384.شغِّل الأمر
zipalignالتالي للتأكّد من أنّ تطبيقك متوافق مع صفحة الذاكرة بحجم 16 كيلوبايت، حيث APK_NAME هو اسم ملف APK الخاص بتطبيقك:zipalign -c -P 16 -v 4 APK_NAME.apkاختبِر تطبيقك بدقة، مع التركيز على أي مناطق قد تتأثر ب تغيير حالات الرمز البرمجي التي تشير إلى أحجام صفحات معيّنة.
إعداد Android Emulator باستخدام صورة نظام تستند إلى 16 كيلوبايت
لإعداد بيئة تتضمن صفحات ذاكرة بحجم 16 كيلوبايت باستخدام Android Emulator، اتّبِع الخطوات التالية:
- في "استوديو Android"، انقر على الأدوات > SDK Manager.
في علامة التبويب SDK Platforms ، انقر على عرض تفاصيل الحزمة ، ثم وسِّع قسم Android VanillaIceCream أو إصدار أحدث واختَر إحدى صور نظام المحاكي أو كلتيهما، استنادًا إلى الأجهزة الافتراضية التي تريد إنشاءها:
- Google APIs Experimental 16 KB Page Size ARM 64 v8a System Image
- Google APIs Experimental 16 KB Page Size Intel x86_64 Atom System Image
انقر على تطبيق > حسنًا لتنزيل أي صور نظام اخترتها.
اتّبِع خطوات إعداد جهاز افتراضي لنظام Android 15، وعندما يُطلب منك اختيار صورة نظام، اختَر صورة نظام 16 كيلوبايت التي نزّلتها. إذا لم يتم اقتراحها تلقائيًا، يمكنك العثور على صورة نظام 16 كيلوبايت في علامة التبويب صور أخرى.
تشغيل المحاكي
بعد الانتهاء من إعداد Android Emulator والأجهزة الافتراضية، شغِّل المحاكي من قائمة الجهاز المستهدَف، أو من سطر الأوامر.
تفعيل الوضع 16 كيلوبايت على جهاز باستخدام خيارات المطوّرين
فعِّل خيار المطوّر التشغيل مع صفحات حجمها 16 كيلوبايت لتشغيل الجهاز في وضع 16 كيلوبايت.
في إصدارات QPR من نظام التشغيل Android 15، يمكنك استخدام خيار المطوّرين المتاح على أجهزة معيّنة لإعادة تشغيل الجهاز في وضع 16 كيلوبايت وإجراء اختبار على الجهاز فقط. قبل استخدام خيار المطوّرين، انتقِل إلى الإعدادات > النظام > تحديثات البرامج وطبِّق أي تحديثات متوفّرة.
يتوفّر خيار المطوّرين هذا على الأجهزة التالية:
Pixel 8 وPixel 8 Pro (مع الإصدار 1 من حزمة إصلاح الأخطاء في نظام Android 15 أو إصدار أحدث)
Pixel 8a (مع الإصدار 1 من حزمة إصلاح الأخطاء في نظام Android 15 أو إصدار أحدث)
Pixel 9 و9 Pro و9 Pro XL (مع الإصدار الثاني من حزمة Android 15 QPR أو إصدار أحدث)
Pixel 9a (مع نظام التشغيل Android 16 أو إصدار أحدث)
وضع التوافق مع الإصدارات السابقة لصفحة الذاكرة بحجم 16 كيلوبايت
تحذير في وضع التوافق مع حجم الصفحة
يتوفّر خيار التوافق مع الإصدارات السابقة لصفحة الذاكرة بحجم 16 كيلوبايت عندما يعمل الجهاز بنواة 16 كيلوبايت. يشغِّل مدير الحِزم تطبيقًا في وضع التوافق مع الإصدارات السابقة لصفحة الذاكرة بحجم 16 كيلوبايت عند استيفاء الشروط التالية:
- إذا كان التطبيق يحتوي على ملفات ELF (بالامتداد
.so) مع محاذاة قسم LOAD بحجم 4 كيلوبايت. - إذا كانت حزمة APK المضغوطة تحتوي على ملفات ELF غير مضغوطة متوافقة مع محاذاة zip بحجم 4 كيلوبايت.
إذا فعَّل مدير الحِزم وضع التوافق مع الإصدارات السابقة لصفحة الذاكرة بحجم 16 كيلوبايت لتطبيق، يعرض التطبيق تحذيرًا عند تشغيله لأول مرة يشير إلى أنّه يعمل في وضع التوافق مع الإصدارات السابقة لصفحة الذاكرة بحجم 16 كيلوبايت.
يسمح وضع التوافق مع الإصدارات السابقة لصفحة الذاكرة بحجم 16 كيلوبايت لبعض التطبيقات بالعمل، ولكن للحصول على أفضل موثوقية وثبات، يجب أن تظل التطبيقات متوافقة مع صفحة الذاكرة بحجم 16 كيلوبايت.
في صفحة معلومات التطبيق، ضِمن خيارات متقدّمة ، فعِّل أو أوقِف الإعداد تشغيل التطبيق في وضع التوافق مع حجم الصفحة لتفعيل وضع التوافق مع الإصدارات السابقة لصفحة الذاكرة بحجم 16 كيلوبايت أو إيقافه لتطبيق معيّن. لا يظهر هذا الإعداد إلا عندما يعمل الجهاز بحجم صفحة 16 كيلوبايت.
إعداد وضع التوافق مع حجم الصفحة
لفرض تفعيل وضع التوافق مع الإصدارات السابقة لصفحة الذاكرة بحجم 16 كيلوبايت لكل تطبيق على الجهاز:
adb shell setprop bionic.linker.16kb.app_compat.enabled true
adb shell setprop pm.16kb.app_compat.disabled false
لفرض إيقاف وضع التوافق مع الإصدارات السابقة لصفحة الذاكرة بحجم 16 كيلوبايت لكل تطبيق على الجهاز:
adb shell setprop bionic.linker.16kb.app_compat.enabled false
adb shell setprop pm.16kb.app_compat.disabled true
في Android 17، يمكنك أيضًا فرض إيقاف وضع التوافق مع الإصدارات السابقة لصفحة الذاكرة بحجم 16 كيلوبايت لكل تطبيق وإيقاف أي ملف ثنائي غير متوافق على الفور:
adb shell setprop bionic.linker.16kb.app_compat.enabled fatal
adb shell setprop pm.16kb.app_compat.disabled true
اضبط السمة android:pageSizeCompat على `enabled` أو `disabled` لتفعيل وضع التوافق مع الإصدارات السابقة أو إيقافه لتطبيق معيّن في ملف AndroidManifest.xml الخاص به. عند ضبط هذه السمة، لن يعرض التطبيق تحذيرات وضع التوافق مع الإصدارات السابقة عند تشغيله.