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

سابقًا، كان نظام Android لا يدعم سوى أحجام صفحات الذاكرة التي تبلغ 4 كيلوبايت، والتي تحتوي على لتحسين أداء ذاكرة النظام للحصول على متوسط إجمالي الذاكرة التي كان لديهم عادةً أجهزة Android. بدءًا من نظام التشغيل Android 15، يتوافق "بروتوكول AOSP" مع الأجهزة التي تم إعدادها لاستخدام حجم صفحة يبلغ 16 كيلوبايت (16 كيلوبايت) الأجهزة). إذا كان تطبيقك يستخدم أي مكتبات NDK، سواء بشكل مباشر أو بشكل غير مباشر من خلال إحدى حِزم SDK، ستحتاج إلى إعادة إنشاء التطبيق يعمل على هذه الأجهزة التي يبلغ حجمها 16 كيلوبايت.

مع استمرار الشركات المصنّعة للأجهزة في تصميم أجهزة تحتوي على كميات أكبر من ذاكرة فعلية (RAM)، ستعتمد العديد من هذه الأجهزة على سعة 16 كيلوبايت ( أكبر في النهاية) لتحسين أداء الجهاز. جارٍ الإضافة بالنسبة إلى الأجهزة التي حجمها 16 كيلوبايت، يمكن تشغيل تطبيقك على هذه الأجهزة وتساعد تطبيقك على الاستفادة من الأداء المرتبط التحسينات. قد لا تعمل التطبيقات على الأجهزة التي يبلغ حجمها 16 كيلوبايت بدون إعادة التجميع. عند إنتاجها في إصدارات Android المستقبلية.

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

المزايا ومكاسب الأداء

إنّ الأجهزة التي تم ضبطها بأحجام صفحات تبلغ 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، ثم انقر على ملف > افتح واختَر أي مشروع.
  2. من شريط القوائم، انقر على إنشاء > تحليل حزمة APK...

    خيار فتح تطبيق "استوديو YouTube" في القائمة لتشغيل حزمة APK
أداة التحليل

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

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

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

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

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

تحديث حزمة مكتباتك المشتركة

ننصحك بالترقية إلى الإصدار 8.3 من AGP أو إلى إصدار أحدث واستخدام النسخة غير المضغوطة. المكتبات المشتركة.

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

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

الإصدار 8.2 من AGP أو إصدار أقدم

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

Groovy

في ملف 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 مكتبات مشتركة متوافقة مع قاعدة المعلومات باستخدام Android NDK الإصدار r26 أو إصدار أقدم، يجب تحديث ndk-build أو cmake على النحو التالي:

لعبة ndk-build

عدِّل Android.mk لتفعيل تنسيق ELF الذي يبلغ حجمه 16 كيلوبايت:

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

CMake

عدِّل CMakeLists.txt لتفعيل تنسيق ELF الذي يبلغ حجمه 16 كيلوبايت:

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

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

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

لعبة ndk-build

في Application.mk:

APP_SUPPORT_FLEXIBLE_PAGE_SIZES := true

Groovy

في ملف 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() وواجهات برمجة التطبيقات الأخرى التي تتطلب التوافق مع الصفحات. المناقشات واستبدالها ببدائل عند الضرورة.

في بعض الحالات، إذا كان تطبيقك يستخدم PAGE_SIZE كقيمة ملائمة ليست ترتبط بحجم الصفحة الأساسية، فلن يؤدي ذلك إلى تعطُّل تطبيقك عند استخدامه في وضع بحجم 16 كيلوبايت. ومع ذلك، إذا تم تمرير هذه القيمة إلى النواة مع mmap بدون MAP_FIXED، ستظل النواة تستخدم صفحة كاملة، إلى إهدار بعض الذاكرة. لهذه الأسباب، لا يتم تحديد PAGE_SIZE عندما يكون حجم 16 كيلوبايت على NDK r27 والإصدارات الأحدث.

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

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

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

  1. إعداد حزمة تطوير البرامج (SDK) لنظام التشغيل Android 15

  2. إعداد إحدى بيئات الاختبار التالية:

  3. شغِّل جهاز الاختبار، ثم شغِّل الأمر التالي للتحقّق من ذلك: يستخدم بيئة حجمها 16 كيلوبايت:

    adb shell getconf PAGE_SIZE
    

    من المفترض أن يعرض الأمر القيمة 16384.

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

    #!/bin/bash
    
    # usage: alignment.sh path to search for *.so files
    
    dir="$1"
    
    RED="\e[31m"
    GREEN="\e[32m"
    ENDCOLOR="\e[0m"
    
    matches="$(find $dir -name "*.so" -type f)"
    IFS=$'\n'
    for match in $matches; do
      res="$(objdump -p ${match} | grep LOAD | awk '{ print $NF }' | head -1)"
      if [[ $res =~ "2**14" ]] || [[ $res =~ "2**16" ]]; then
        echo -e "${match}: ${GREEN}ALIGNED${ENDCOLOR} ($res)"
      else
        echo -e "${match}: ${RED}UNALIGNED${ENDCOLOR} ($res)"
      fi
    done
    
    1. احفظ النص البرمجي في ملف، مثل alignment.sh.

    2. استخرِج ملف APK لتطبيقك:

      unzip APK_NAME.apk -d /tmp/my_apk_out
      
    3. نفِّذ النص البرمجي في الملفات المستخرجة في /tmp/my_apk_out. الدليل:

      alignment.sh /tmp/my_apk_out | grep "arm64-v8a"
      

      يُخرج النص البرمجي إما ALIGNED أو UNALIGNED لجميع arm64-v8a مكتبة مشتركة

    4. إذا كانت أي من المكتبات المشتركة في arm64-v8a بالحالة UNALIGNED، عليك تنفيذ ما يلي: تحديث حزمة هذه المكتبات، ثم إعادة تجميع ثم إعادة الاختبار باتّباع الخطوات الواردة في هذا القسم.

  5. شغِّل الأمر zipalign التالي للتحقّق من أنّ تطبيقك 16 كيلوبايت، حيث يكون APK_NAME هو اسم ملف APK لتطبيقك:

    zipalign -c -P 16 -v 4 APK_NAME.apk
    
  6. اختبار تطبيقك بدقة، مع التركيز على أي جوانب قد تتأثر تغيير مثيلات الرموز التي تشير إلى أحجام صفحات معيّنة.

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

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

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

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

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

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

    • نسخة تجريبية لنظام التشغيل ARM 64 v8a بحجم صفحة 16 كيلوبايت من Google APIs
    • صورة نظام Intel x86_64 Atom تجريبية بحجم صفحة 16 كيلوبايت من Google APIs

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

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

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

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

  1. في "مدير الجهاز"، يُرجى النقر على النقاط الثلاث بجانب الصورة التي يبلغ حجمها 16 كيلوبايت، ثم النقر على عرض على القرص.
  2. في هذا المجلد، ابحث عن الملف config.ini.
  3. أضِف السطر التالي إلى ملف config.ini واحفظ التغييرات:

    kernel.parameters = androidboot.page_shift=14
    
  4. للتحقّق من التغييرات، شغِّل الأمر التالي الذي سيظهر 16384:

    adb shell getconf PAGE_SIZE