دعم أحجام صفحات بحجم 16 كيلوبايت

في السابق، كان نظام التشغيل 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 الذي تم إنشاؤه. لتحديد ما إذا كان تطبيقك يستخدم رموزًا برمجية أصلية أو مكتبات، اتّبِع الخطوات التالية:

  1. افتح Android Studio، ثم انقر على ملف > فتح واختَر أي مشروع.
  2. من شريط القوائم، انقر على إنشاء > تحليل APK...

    خيار قائمة Studio Build لإطلاق
أداة تحليل APK

  3. اختَر حِزمة APK التي تريد تحليلها.

  4. ابحث داخل المجلد lib، الذي يستضيف ملفات العناصر المشتركة (.so)، في حال توفّر أي ملفات. في حال وجود أي ملفات عناصر مشتركة، يستخدم تطبيقك التعليمات البرمجية الأصلية. في حال عدم توفّر ملفات عناصر مشتركة أو عدم توفّر مجلد lib، لن يستخدم تطبيقك رمزًا برمجيًا أصليًا.

    تعرض أداة "تحليل APK" أنّ ملفات العناصر المشتركة متوفّرة

إنشاء تطبيقك مع دعم لأجهزة بحجم 16 كيلوبايت

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

التحديث إلى الإصدار 8.3 من AGP أو إصدار أحدث

تتطلّب الأجهزة التي يبلغ حجمها 16 كيلوبايت استخدام التطبيقات التي يتم شحنها مع مكتبات مشتركة غير مضغوطة من أجل محاذاتها على حدود محاذاة مضغوطة بحجم 16 كيلوبايت. لتنفيذ ذلك، يجب الترقية إلى الإصدار 8.3 من المكوّن الإضافي لنظام Gradle المتوافق مع Android (AGP) أو الإصدارات الأحدث. راجِع قسم مساعِد ترقية مكوّن Gradle المتوافق مع Android للحصول على تفاصيل حول عملية الترقية.

ننصحك باستخدام المكتبات المشتركة غير المضغوطة، ولكن إذا لم تتمكّن من ترقية AGP إلى الإصدار 8.3 أو الإصدارات الأحدث، فإنّ الخيار البديل هو استخدام المكتبات المشتركة المضغوطة. عليك تعديل إعدادات 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 الذي تستخدمه.

Android NDK r26 والإصدارات الأقدم

لإتاحة تجميع 16 مكتبات مشتركة متوافقة مع كيلوبايت باستخدام الإصدار r26 من نظام التشغيل Android NDK أو الإصدارات الأقدم، عليك تعديل إعدادات ndk-build أو cmake على النحو التالي:

إنشاء ndk

يمكنك تعديل Android.mk لتفعيل محاذاة ELF بحجم 16 كيلوبايت:

LOCAL_LDFLAGS += "-Wl,-z,max-page-size=16384"

الإنشاء

يمكنك تعديل CMakeLists.txt لتفعيل محاذاة ELF بحجم 16 كيلوبايت:

target_link_options(${CMAKE_PROJECT_NAME} PRIVATE "-Wl,-z,max-page-size=16384")

Android NDK r27 والإصدارات الأحدث

لإتاحة تجميع 16 مكتبات مشتركة متوافقة مع الكيلوبايت مع الإصدار r27 من نظام التشغيل Android أو الإصدارات الأحدث، عليك تحديث علامات ndk-build أو build.gradle أو build.gradle.kts أو أداة الربط على النحو التالي:

إنشاء ndk

في "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 كيلوبايت، يمكن أن يواجه تطبيقك أخطاء إذا كانت الأماكن في الرمز تفترض أن الجهاز يستخدم حجم صفحة محددًا. لتجنب ذلك، أكمل الخطوات التالية:

  1. أزِل أي تبعيات غير قابلة للتغيير في الترميز تشير إلى الثابت PAGE_SIZE أو المثيلات في منطق الرمز والتي تفترض أنّ حجم صفحة الجهاز هو 4 كيلوبايت (4096).

    يمكنك استخدام getpagesize() أو sysconf(_SC_PAGESIZE) بدلاً منها.

  2. ابحث عن استخدامات mmap() وواجهات برمجة التطبيقات الأخرى التي تتطلب وسيطات متوافقة مع الصفحة واستبدلها ببدائل عند الضرورة.

اختبار تطبيقك في بيئة بحجم 16 كيلوبايت

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

إعداد محاكي Android باستخدام صورة نظام Android 15 بحجم 16 كيلوبايت

لإعداد بيئة بحجم 16 كيلوبايت باستخدام محاكي Android، اتبع الخطوات التالية:

  1. وتكون صور نظام محاكي Android 15 التي يبلغ حجمها 16 كيلوبايت متوافقة مع "قنديل البحر" في "استوديو Android" | 2023.3.1 أو الإصدارات الأحدث. ومع ذلك، للحصول على أفضل تجربة عند العمل على الإصدار التجريبي من Android 15، ننصحك بتنزيل أحدث إصدار للمعاينة من "استوديو Android".

    يُرجى العلم أنّه يمكنك إبقاء الإصدار الحالي من "استوديو Android" مثبّتًا، إذ يمكنك تثبيت عدة إصدارات جنبًا إلى جنب.

  2. في "استوديو Android"، انقر على الأدوات > مدير SDK.

  3. في علامة التبويب SDK Platforms (الأنظمة الأساسية لحزمة تطوير البرامج)، وسِّع قسم Android VanillaIceCream Preview واختَر إحدى الصورتَين التاليتَين أو كلتيهما لنظام المحاكي، بناءً على الأجهزة الافتراضية التي تريد إنشاءها:

    • صورة نظام Google APIs التجريبية بحجم 16 كيلوبايت بحجم صفحة ARM 64، الإصدار 8a
    • صورة نظام Atom بحجم 16 كيلوبايت في Google APIs

    تنزيل صور نظام المحاكي بحجم 16 كيلوبايت باستخدام "أداة إدارة SDK" في "استوديو Android"

  4. انقر على تطبيق > موافق لتنزيل صور النظام التي اخترتها.

  5. اتّبِع الخطوات من أجل إعداد جهاز افتراضي لنظام التشغيل Android 15، وعندما يُطلب منك اختيار صورة نظام، عليك اختيار صورة النظام التي يبلغ حجمها 16 كيلوبايت والتي نزَّلتها. وإذا لم يتم اقتراح هذه الميزة تلقائيًا، يمكنك العثور على صورة النظام التي يبلغ حجمها 16 كيلوبايت في علامة التبويب صور أخرى.

    ابحث عن صورة المحاكي بحجم 16 كيلوبايت في علامة التبويب "صور أخرى"