في السابق، كان نظام التشغيل Android لا يدعم سوى أحجام صفحات الذاكرة التي تبلغ 4 كيلوبايت فقط، وقد تم تحسين أداء ذاكرة النظام لمتوسط إجمالي حجم الذاكرة الذي تستخدمه أجهزة Android عادةً. بدءًا من نظام التشغيل Android 15، يتوافق Android مع الأجهزة التي تم ضبطها على استخدام حجم صفحة يبلغ 16 كيلوبايت (16 كيلوبايت للأجهزة).
مع استمرار الشركات المصنّعة للأجهزة في إنشاء أجهزة ذات سعة أكبر من الذاكرة الفعلية (ذاكرة الوصول العشوائي)، من المرجَّح أن يتم ضبط العديد من هذه الأجهزة على أحجام صفحات بحجم 16 كيلوبايت (وفي النهاية أكبر) لتحسين أداء الأجهزة. تؤدي إضافة دعم إلى الأجهزة التي يبلغ حجمها 16 كيلوبايت إلى تمكين تطبيقك من العمل على هذه الأجهزة ومساعدة تطبيقك في الاستفادة من تحسينات الأداء المرتبطة به. لمساعدتك في حل هذه المشكلة، قدّمنا إرشادات حول كيفية التحقّق ممّا إذا كان تطبيقك قد تأثّر بهذا التغيير وكيفية إعادة إنشاء التطبيق (إن أمكن) وكيفية اختباره في بيئة بحجم 16 كيلوبايت باستخدام أدوات المحاكاة والأجهزة الفعلية.
المزايا ومكاسب الأداء
إنّ الأجهزة التي تم ضبطها بأحجام صفحات تبلغ 16 كيلوبايت تستخدِم ذاكرة أكبر قليلاً في المتوسط، ولكنّها تحصل أيضًا على تحسينات أداء متنوعة لكل من النظام والتطبيقات:
- أوقات أقل لتشغيل التطبيقات أثناء تعرّض النظام لضغط الذاكرة: انخفاض بنسبة 3.16% في المتوسط، مع تحسينات أكثر أهمية (تصل إلى 30%) لبعض التطبيقات التي اختبرناها
- استهلاك مخفض للطاقة أثناء تشغيل التطبيق: خفض بنسبة 4.56% في المتوسط
- تشغيل أسرع للكاميرا: عند بدء تشغيل الجهاز باستخدام درجة حرارة أعلى بنسبة 4.48% في المتوسط، والتشغيل على البارد بسرعة أكبر بنسبة 6.60% في المتوسط
- وقت تشغيل النظام المحسَّن: محسَّن بنسبة 1.5% (حوالي 0.8 ثانية) في المتوسط
تستند هذه التحسينات إلى اختبارنا الأولي، ومن المحتمل أن تختلف النتائج على الأجهزة الفعلية. سنقدم تحليلاً إضافيًا للمكاسب المحتملة للتطبيقات بينما نواصل اختبارنا.
التحقّق ممّا إذا كان تطبيقك متأثرًا بهذا التغيير
إذا كان تطبيقك يستخدم أي رموز برمجية أصلية، يجب عليك إعادة إنشاء تطبيقك مع دعم الأجهزة التي بحجم 16 كيلوبايت. إذا لم تكن متأكدًا مما إذا كان تطبيقك يستخدم رمزًا برمجيًا أصليًا، يمكنك استخدام أداة تحليل APK لتحديد ما إذا كان هناك أي رمز أصلي أم لا.
إذا كان تطبيقك لا يستخدم إلا رمزًا برمجيًا مكتوبًا بلغة برمجة Java أو بلغة Kotlin، بما في ذلك جميع المكتبات أو حِزم SDK، يعني ذلك أنّ تطبيقك سيكون متوافقًا مع الأجهزة التي يبلغ حجمها 16 كيلوبايت. ومع ذلك، ننصحك باختبار تطبيقك في بيئة بحجم 16 كيلوبايت للتأكّد من عدم حدوث تراجعات غير متوقّعة في سلوك التطبيق.
هل يستخدم تطبيقك رمزًا برمجيًا أصليًا؟
يستخدم تطبيقك الرموز البرمجية الأصلية في حال انطباق أي مما يلي:
- يستخدم تطبيقك أي رمز C/C++ (أصلي). إذا كان تطبيقك يستخدم Android NDK، سيستخدم تطبيقك رمزًا برمجيًا أصليًا.
- يرتبط تطبيقك بأي مكتبات أو ملحقات تابعة لجهات خارجية تستخدمها.
- تم إنشاء تطبيقك من خلال أداة إنشاء تطبيقات تابعة لجهة خارجية تستخدم المكتبات الأصلية على الجهاز.
تحديد المكتبات الأصلية باستخدام أداة تحليل حِزم APK
أداة تحليل حِزم APK هي أداة تتيح لك تقييم جوانب مختلفة من APK المُدمج. لتحديد ما إذا كان تطبيقك يستخدم رموزًا برمجية أو مكتبات أصلية، يمكنك اتّباع الخطوات التالية:
- افتح استوديو Android، ثم انقر على ملف > فتح واختَر أي مشروع.
من شريط القوائم، انقر على إنشاء > تحليل APK...
اختَر حِزمة APK التي تريد تحليلها.
ابحث داخل مجلد
lib
الذي يستضيف ملفات الكائنات المشتركة (.so
) في حال توفُّرها. في حال وجود أي ملفات عناصر مشتركة، سيستخدم تطبيقك رمزًا برمجيًا أصليًا. إذا لم تتوفّر أي ملفات عناصر مشتركة أو لم يتوفّر مجلدlib
، يعني ذلك أنّ تطبيقك لا يستخدم رمزًا برمجيًا أصليًا.
إنشاء تطبيقك متوافق مع أجهزة بحجم 16 كيلوبايت
بالنسبة إلى الأجهزة التي حجمها 16 كيلوبايت، يجب أن تكمل التطبيقات التي تستخدم رموزًا برمجية أصلية الخطوات الموضحة في الأقسام التالية.
تحديث حزمة مكتباتك المشتركة
ننصحك بالترقية إلى الإصدار 8.3 من AGP أو إلى إصدار أحدث واستخدام المكتبات المشتركة غير المضغوطة.
الإصدار 8.3 من AGP أو إصدار أحدث
تتطلّب الأجهزة التي يبلغ حجمها 16 كيلوبايت من التطبيقات التي تحتوي على مكتبات مشتركة غير مضغوطة لمحاذاة هذه الحدود مع حدود محاذاة الرمز البريدي بحجم 16 كيلوبايت. لتنفيذ ذلك، يجب الترقية إلى الإصدار 8.3 من المكوّن الإضافي Android Gradle Plugin (AGP) أو الإصدارات الأحدث. يُرجى الرجوع إلى قسم مساعد ترقية مكوّن Gradle المتوافق مع Android للاطّلاع على تفاصيل حول عملية الترقية.
الإصدار 8.2 من AGP أو إصدار أقدم
إذا لم تتمكن من ترقية AGP إلى الإصدار 8.3 أو أحدث، فإن الحل البديل هو التبديل لاستخدام المكتبات المشتركة المضغوطة. عدِّل إعدادات Gradle كي يضغط جهاز Gradle المكتبات المشتركة عند إنشاء حزمة لتطبيقك لتجنُّب مشاكل تثبيت التطبيق بسبب المكتبات المشتركة غير المتوافقة.
رائع
في ملف build.gradle
، أضِف الخيار التالي:
android {
...
packagingOptions {
jniLibs {
useLegacyPackaging true
}
}
}
Kotlin
في ملف build.gradle.kts
، أضِف الخيار التالي:
android {
...
packagingOptions {
jniLibs {
useLegacyPackaging = true
}
}
}
تجميع تطبيقك باستخدام تنسيق ELF الذي يبلغ حجمه 16 كيلوبايت
تتطلّب الأجهزة التي يبلغ حجمها 16 كيلوبايت محاذاة شرائح ELF للمكتبات المشتركة بشكل صحيح باستخدام محاذاة ELF التي تبلغ 16 كيلوبايت حتى يتم تشغيل تطبيقك.
لتجميع تطبيقك باستخدام محاذاة ELF بحجم 16 كيلوبايت، أكمِل الخطوات الواردة في أحد الأقسام التالية اعتمادًا على إصدار Android NDK الذي تستخدمه.
الإصدار NDK r26 من Android والإصدارات الأقدم
لإتاحة تجميع مكتبات مشتركة بحجم 16 كيلوبايت باستخدام الإصدار r26 من نظام التشغيل Android NDK أو الإصدارات الأقدم، عليك تعديل إعدادات ndk-build
أو cmake
على النحو التالي:
لعبة ndk-build
عدِّل Android.mk
لتفعيل تنسيق ELF الذي يبلغ حجمه 16 كيلوبايت:
LOCAL_LDFLAGS += "-Wl,-z,max-page-size=16384"
إنشاء فيديوهات Shorts
عدِّل CMakeLists.txt
لتفعيل تنسيق ELF الذي يبلغ حجمه 16 كيلوبايت:
target_link_options(${CMAKE_PROJECT_NAME} PRIVATE "-Wl,-z,max-page-size=16384")
الإصدار NDK r27 من Android والإصدارات الأحدث
لإتاحة تجميع 16 مكتبات مشترَكة متوافقة مع قاعدة المعلومات مع الإصدار r27 من نظام التشغيل Android NDK
أو الإصدارات الأحدث، يجب تحديث علامات ndk-build
أو build.gradle
أو build.gradle.kts
أو علامة الرابط على النحو التالي:
لعبة ndk-build
في Application.mk
:
APP_SUPPORT_FLEXIBLE_PAGE_SIZES := true
رائع
في ملف build.gradle
، اضبط الوسيطة
-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON
:
android {
...
defaultConfig {
...
// This block is different from the one you use to link Gradle
// to your CMake or ndk-build script.
externalNativeBuild {
// For ndk-build, instead use the ndkBuild block.
cmake {
// Passes optional arguments to CMake.
arguments "-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON"
}
}
}
}
Kotlin
في ملف build.gradle.kts
، اضبط الوسيطة
-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON
:
android {
...
defaultConfig {
...
// This block is different from the one you use to link Gradle
// to your CMake or ndk-build script.
externalNativeBuild {
// For ndk-build, instead use the ndkBuild block.
cmake {
// Passes optional arguments to CMake.
arguments += listOf("-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON")
}
}
}
}
أنظمة تصميم أخرى
حدد علامات الربط التالية:
-Wl,-z,max-page-size=16384
التحقّق من حالات الرموز التي تشير إلى أحجام معيّنة للصفحات
حتى إذا كان تطبيقك متوافقًا مع حجم 16 كيلوبايت، من الممكن أن يواجه تطبيقك أخطاءً إذا افترضت الأماكن في الرمز أنّ الجهاز يستخدم حجم صفحة معيّنًا. لتجنّب ذلك، أكمِل الخطوات التالية:
أزِل أي ملحقات غير قابلة للتغيير في البرنامج تشير إلى الثابت
PAGE_SIZE
أو المثيلات في منطق الرمز والتي تفترض أنّ حجم صفحة الجهاز يبلغ 4 كيلوبايت (4096
).يمكنك استخدام
getpagesize()
أوsysconf(_SC_PAGESIZE)
بدلاً منها.ابحث عن استخدامات
mmap()
وواجهات برمجة التطبيقات الأخرى التي تتطلّب وسيطات متوافقة مع الصفحات، واستبدِلها ببدائل عند الضرورة.
في بعض الحالات، إذا كان تطبيقك يستخدم PAGE_SIZE
كقيمة ملائمة لا
ترتبط بحجم الصفحة الأساسية، لن يتسبّب ذلك في تعطُّل تطبيقك
عند استخدامه في وضع 16 كيلوبايت. إذا تم تمرير هذه القيمة إلى النواة مع استخدام mmap
بدون السمة MAP_FIXED
، ستظلّ النواة تستخدم صفحة كاملة، ما يؤدي إلى إهدار بعض الذاكرة. لهذه الأسباب، لا يتم تحديد PAGE_SIZE
عند تفعيل وضع بحجم 16 كيلوبايت على الإصدار NDK r27 والإصدارات الأحدث.
إذا كان تطبيقك يستخدم PAGE_SIZE
بهذه الطريقة ولا يمرّر هذه القيمة مباشرةً إلى
النواة، أنشِئ متغيّرًا جديدًا باسم جديد بدلاً من PAGE_SIZE
للإشارة إلى أنّه يُستخدم لأغراض أخرى ولا يمثّل صفحة ذاكرة حقيقية.
اختبار تطبيقك في بيئة 16 كيلوبايت
بعد إنشاء تطبيقك الذي يتوافق مع الأجهزة التي حجمها 16 كيلوبايت، عليك اختبار التطبيق في بيئة تبلغ 16 كيلوبايت لمعرفة ما إذا كان تطبيقك يواجه أي تراجع في الأداء. لإجراء ذلك، عليك إعداد إحدى بيئات الاختبار التالية، ثم اختبار تطبيقك بدقة، مع التركيز على أي مناطق قد تتأثر بتغيير مثيلات الرموز التي تشير إلى أحجام معيّنة للصفحة.
- إعداد محاكي Android بصورة نظام التشغيل Android 15 بحجم 16 كيلوبايت
- استخدام حبَّار بحجم صفحة 16 كيلوبايت على ARM64
- محاكي الحبار بحجم الصفحة الذي يبلغ 16 كيلوبايت على x86-64
إعداد محاكي Android بصورة لنظام Android 15 بحجم 16 كيلوبايت
لإعداد بيئة حجمها 16 كيلوبايت باستخدام محاكي Android، اتبع الخطوات التالية:
إنّ صور نظام محاكي Android 15 المستندة إلى 16 كيلوبايت متوافقة مع الإصدار 2023.3.1 أو الإصدارات الأحدث من "استوديو Android". مع ذلك، للحصول على أفضل تجربة عند التعامل مع الإصدار التجريبي من Android 15، عليك تنزيل أحدث إصدار معاينة من "استوديو Android".
يمكنك إبقاء الإصدار الحالي من "استوديو Android" مثبّتًا على جهازك، لأنه يمكنك تثبيت إصدارات متعددة جنبًا إلى جنب.
في "استوديو Android"، انقر على الأدوات > مدير حزمة تطوير البرامج (SDK).
في علامة التبويب منصّات حِزم SDK، ضَع علامة في المربّع إظهار تفاصيل الحزمة، ثم وسِّع قسم Android VanillaIceCream Preview واختَر إحدى الصورتَين التاليتَين أو كلتيهما من صور نظام المحاكي التالية، بناءً على الأجهزة الافتراضية التي تريد إنشاءها:
- نسخة تجريبية لنظام التشغيل ARM 64 v8a بحجم صفحة 16 كيلوبايت من Google APIs
- صورة نظام Intel x86_64 Atom تجريبية بحجم صفحة 16 كيلوبايت من Google APIs
انقر على تطبيق > موافق لتنزيل صور النظام التي اخترتها.
اتّبِع الخطوات اللازمة لإعداد جهاز افتراضي يعمل بنظام التشغيل Android 15، وعندما يُطلب منك اختيار صورة نظام، اختَر صورة النظام التي يبلغ حجمها 16 كيلوبايت. إذا لم يتم اقتراح ذلك تلقائيًا، يمكنك العثور على صورة النظام التي تبلغ 16 كيلوبايت في علامة التبويب صور أخرى.